如何在AWS Lambda API中配置Chrome使Puppeteer生成PDF?
解决Puppeteer + chrome-aws-lambda在Lambda环境下的PDF生成异常问题
核心问题分析
你的配置和代码存在两个关键问题:
- 版本不兼容:
chrome-aws-lambda@10.1.0需要与同版本的puppeteer-core搭配使用,你当前依赖的puppeteer-core@10.0.0版本不一致;开发依赖的puppeteer@17.1.2版本远高于生产核心库,导致环境不匹配 - 代码逻辑错误:未正确配置Chromium执行路径,且返回的PDF Buffer不能直接作为API响应体
分步修复方案
1. 统一依赖版本
更新 package.json,确保chrome-aws-lambda、puppeteer-core、开发依赖的puppeteer版本完全一致:
{ "name": "amplifysandboxpdf", "version": "2.0.0", "description": "Lambda function generated by Amplify", "main": "index.js", "license": "Apache-2.0", "devDependencies": { "@types/aws-lambda": "^8.10.92", "@types/puppeteer": "^10.0.2", "puppeteer": "^10.1.0" }, "dependencies": { "chrome-aws-lambda": "^10.1.0", "puppeteer-core": "^10.1.0" } }
删除旧依赖后重新安装:
rm -rf node_modules package-lock.json npm install
2. 修正代码逻辑
调整浏览器启动配置、PDF生成参数,并正确处理响应体格式:
const chromium = require('chrome-aws-lambda'); exports.handler = async (event) => { let browser = null; try { // 配置Lambda兼容的Chromium启动参数 browser = await chromium.puppeteer.launch({ args: chromium.args, defaultViewport: chromium.defaultViewport, executablePath: await chromium.executablePath, headless: chromium.headless, ignoreHTTPSErrors: true }); let page = await browser.newPage(); // 等待页面完全加载后再生成PDF await page.goto("https://www.google.com", { waitUntil: 'networkidle0' }); const pdf = await page.pdf({ format: "A4", printBackground: false, preferCSSPageSize: true, displayHeaderFooter: true, // 需开启才能显示页眉页脚 headerTemplate: `<div class="header" style="font-size:20px; padding-left:15px;"><h1>Main Heading</h1></div>`, footerTemplate: '<footer><h5>Page <span class="pageNumber"></span> of <span class="totalPages"></span></h5></footer>', margin: { top: "200px", bottom: "150px", right: "20px", left: "20px" }, // 不要同时设置format和width/height,二者冲突,保留其一即可 // height: "200px", // width: "200px", }); return { statusCode: 200, headers: { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Credentials": true, "Content-Type": "application/pdf" }, body: pdf.toString('base64'), // Lambda响应体需转为base64编码 isBase64Encoded: true // 告知API Gateway处理编码格式 }; } catch (error) { return { statusCode: 500, body: JSON.stringify({ error: error.message }) }; } finally { // 确保浏览器实例关闭,避免资源泄漏 if (browser !== null) { await browser.close(); } } };
3. 关键注意事项
- Lambda环境必须使用
puppeteer-core而非完整puppeteer,后者自带的Chromium体积过大无法部署 chrome-aws-lambda会自动处理Lambda环境下的Chromium二进制文件,无需手动安装- 生成PDF时,
format和width/height参数不能同时使用,否则会导致尺寸冲突 - 页面跳转添加
waitUntil: 'networkidle0'可确保页面资源加载完成,避免PDF内容缺失
内容的提问来源于stack exchange,提问作者Luis Garcia
相关产品推荐
相关产品推荐

