AWS Lambda生成PDF无法在Postman正常显示问题求助
问题分析与解决建议
核心问题1:AWS Lambda 二进制响应配置缺失
你使用aws-serverless-express但未配置允许二进制响应类型,Lambda会默认将二进制数据编码为Base64,导致下载的PDF文件损坏,触发格式无效提示。
解决步骤:
- 若使用Serverless Framework:在
serverless.yml中添加二进制媒体类型配置:
provider: apiGateway: binaryMediaTypes: - 'application/pdf'
- 若直接在AWS控制台配置:
- 进入API Gateway控制台,找到目标API
- 切换到「Settings」选项卡,在「Binary Media Types」中添加
application/pdf - 重新部署API
- 调整Express响应发送逻辑:将
Uint8Array转换为Buffer后发送,适配aws-serverless-express的处理规则:
// 替换原有的res.send(pdfBytes) res.status(200).send(Buffer.from(pdfBytes));
核心问题2:pdf-lib 使用错误
你直接将HTML字符串传给drawText方法,但pdf-lib的drawText仅支持纯文本渲染,它会把完整的HTML标签(如<h1>)当作普通文本绘制到PDF中,无法实现HTML转PDF的预期效果。
修正方案:
你的package.json已包含chrome-aws-lambda,可以用它实现可靠的HTML转PDF,示例代码如下:
const chromium = require('chrome-aws-lambda'); exports.getAll = async (req, res) => { try { const htmlContent = '<html><body><h1>Hello World</h1></body></html>'; // 启动无头Chrome const browser = await chromium.puppeteer.launch({ args: chromium.args, defaultViewport: chromium.defaultViewport, executablePath: await chromium.executablePath, headless: chromium.headless, }); const page = await browser.newPage(); await page.setContent(htmlContent); // 生成PDF const pdfBytes = await page.pdf({ format: 'A4', printBackground: true }); await browser.close(); res.setHeader('Content-Type', 'application/pdf'); res.setHeader('Content-Disposition', 'inline; filename=hello_world.pdf'); res.status(200).send(Buffer.from(pdfBytes)); } catch (error) { console.error('Error:', error); res.status(500).json({ error: 'Internal Server Error' }); } };
额外验证步骤
- 部署修改后的代码后,先在Lambda控制台测试,确认返回的响应为二进制数据
- Postman测试时,确保请求头未强制设置
Accept: application/json,保持默认或设置Accept: application/pdf
内容的提问来源于stack exchange,提问作者tosa
相关产品推荐
相关产品推荐

