Я пытаюсь использовать Puppeteer v5.0.0 для создания PDF-файлов страницы моего приложения. Чтобы запустить команду для запуска процесса, я использую класс Process Symfony. Команда работает нормально, когда я набираю ее вручную в командной строке, но не работает при использовании Symfony.
Я пробовал
- Обновление версии узла до v12.18.3 которые мне рекомендовали сделать некоторые сообщения
- Используя общий c веб-сайт, например
https://google.com
- Используя php s
exec
, но я бы хотел использовать Symfony из-за очистки входа - Изменение пути к выходному файлу на
public/file.pdf
(может быть, права /tmp
были неправильными?) - Понижение кукловода до версии 4.0.0
Вот код для запуска команды:
$path = base_path();
$filePath = '/tmp/pagePdf-'.time().'.pdf';
$url = route('render.page', $request->all());
$process = new Process(["node", "$path/resources/assets/js/takePdf.js", $url, $filePath]);
$process->setTimeout(60);
try{
$process->mustRun();
$process->wait();
if(file_exists($filePath)){
return response()->download($filePath)->deleteFileAfterSend();
}else{
return redirect()->back();
}
}catch(ProcessFailedException $e){
Log::info($e->getMessage());
report($e);
return redirect()->back();
}
Это takePdf.js
:
const puppeteer = require('puppeteer');
const dotenv = require('dotenv').config();
(async() => {
const browser = await puppeteer.launch({
headless: true,
executablePath: '/usr/bin/chromium-browser',
ignoreHTTPSErrors: true,
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
],
});
// Parse arguments
var args = process.argv;
var indexes = [2,3];
var arg_index = {};
arg_index[2] = 'URL';
arg_index[3] = 'File Path';
indexes.forEach(function(index){
if(typeof args[index] == 'undefined'){
var parameter = arg_index[index];
console.log('Missing Parameter: ' + parameter);
browser.close();
process.exit(1);
}
});
var url = args[2] + '&token=' + process.env.RENDER_TOKEN;
var filePath = args[3];
const page = await browser.newPage();
await page.emulateMediaType('screen');
await page.setViewport({
width: 800,
height: 600,
deviceScaleFactor: 1,
});
await page.goto(url, {waitUntil: 'networkidle2'}).catch(e => void 0);
await page.waitFor(1000);
await page.pdf({
path: filePath,
format: 'A4',
printBackground: true,
width: '1920px',
height: '1080px'
});
await browser.close();
})();
При достижении конечной точки это исключение, которое я получаю обратно из процесса. Опять же, запуск из командной строки работает нормально.
internal/util.js:209
throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'original', 'function');
^
TypeError [ERR_INVALID_ARG_TYPE]: The "original" argument must be of type function
at promisify (internal/util.js:209:11)
at Object.<anonymous> (/home/forge/default/releases/20200709194844/node_modules/extract-zip/index.js:11:18)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Module.require (module.js:596:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/home/forge/default/releases/20200709194844/node_modules/puppeteer/lib/cjs/node/BrowserFetcher.js:48:39)