Я развернул Puppeteer в AWS Lambda для генерации PDF-файлов из URL-адресов.
Результаты противоречивы, иногда PDF-файлы генерируются, как ожидалось, иногда просто возвращаются пустые PDF-файлы.
Есть идеи о том, что может быть причиной?
Из внешнего интерфейса я передаю URL, ширину и высоту веб-страницы. Я убедился, что значения ширины и высоты не являются правильными.
Лямбда-код:
const chromium = require('chrome-aws-lambda');
var uuidv1 = require('uuid/v4');
var fs = require('fs');
exports.handler = async (event, context, callback) => {
var body = JSON.parse(JSON.stringify(event));
let result = null;
let browser = null;
context.callbackWaitsForEmptyEventLoop = false;
try
{
var url = body.downloadUrl;
var elementHeight = body.elementHeight;
var elementWidth = body.elementWidth;
console.log('Loaded POST Request');
browser = await chromium.puppeteer.launch({
args: chromium.args,
executablePath: await chromium.executablePath,
headless: true,
});
console.log('Browser Launched');
let page = await browser.newPage();
console.log('New Page Launched');
await page.goto(url); // Adjust network idle as required.
await page.setViewport({
width: 1600,
height: 1,
deviceScaleFactor: 1
});
await page.goto(url, {
waitUntil:['domcontentloaded', 'networkidle0', 'load']
});
await page.waitFor(5000);
console.log('5 milliseconds Timeout done');
await page.addStyleTag({content: '@page { size:' + elementWidth + 'px ' + elementHeight +'px; margin: 25px }'})
console.log('added styles', elementWidth, elementHeight);
const pdfConfig = {
path: '/tmp/report.pdf',
printBackground: true,
scale: 1,
pageRanges : '1-1',
margin: {
top: 100,
bottom: 100,
left: 100,
right: 0
},
preferCSSPageSize: true
};
await page.emulateMedia('screen');
console.log('Emulate Success');
const pdf = await page.pdf(pdfConfig);
console.log('Successfully Generated PDF');
await browser.close();
var uploadStatus = await uploadFileToS3('/tmp/report.pdf');
console.log('upload Successfull');
}
catch (e) {
console.log('error', e);
callback(null, {
statusCode: 500,
message: 'error',
body: e
});
}
};