You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:01:06