如何使用Node.js为PDF添加自定义元数据(AWS Lambda场景)
方案实现步骤
依赖说明
不需要替换pdf-lib库,该库底层支持直接操作PDF的Info字典添加自定义元数据,只是该功能没有放在公开的文档示例中。需要用到的依赖如下:
pdf-lib:核心PDF处理库@aws-sdk/client-s3:AWS S3 SDK(Lambda Node.js 18+运行时自带AWS SDK v3,不需要打包到部署包)
完整实现代码
const { S3Client, GetObjectCommand, PutObjectCommand } = require("@aws-sdk/client-s3"); const { PDFDocument } = require("pdf-lib"); const s3Client = new S3Client({ region: process.env.AWS_REGION }); exports.handler = async (event) => { // 1. 从S3读取源PDF文件 const getParams = { Bucket: "你的源存储桶名称", Key: "源文件路径/xxx.pdf" }; const s3Response = await s3Client.send(new GetObjectCommand(getParams)); const pdfBuffer = await s3Response.Body.transformToByteArray(); // 2. 加载PDF并添加元数据 const pdfDoc = await PDFDocument.load(pdfBuffer); // 标准元数据可继续使用官方提供的API设置 pdfDoc.setTitle("测试文档"); pdfDoc.setAuthor("作者名称"); // 核心:直接操作Info字典添加自定义元数据 // 自定义键行业惯例加X-前缀,避免和标准字段冲突 pdfDoc.context.lookup(pdfDoc.trailer.get('Info')).set( pdfDoc.context.obj('X-Custom-Key1'), pdfDoc.context.obj('自定义元数据值1') ); // 可重复以上逻辑添加多个自定义元数据 pdfDoc.context.lookup(pdfDoc.trailer.get('Info')).set( pdfDoc.context.obj('X-Project-ID'), pdfDoc.context.obj('P2024001') ); // 3. 保存修改后的PDF const modifiedPdfBytes = await pdfDoc.save(); // 4. 写入S3生成新文件 const putParams = { Bucket: "目标存储桶名称", Key: "目标文件路径/xxx_modified.pdf", Body: modifiedPdfBytes, ContentType: "application/pdf" }; await s3Client.send(new PutObjectCommand(putParams)); return { statusCode: 200, body: "元数据添加完成" }; };
验证方式
- 下载生成的PDF,用Adobe Acrobat打开,进入文件属性→自定义面板即可看到添加的自定义字段
- 用
pdf-lib读取生成的PDF,通过相同的Info字典读取逻辑即可获取到自定义元数据值
Lambda环境注意事项
- 该方案内存占用仅比原PDF文件大30%左右,128M内存的Lambda实例即可处理100M以内的PDF文件
- 处理大文件时可调整Lambda超时时间和内存配置,内存越大处理速度越快
- 确保Lambda执行角色配置了对应S3存储桶的
s3:GetObject和s3:PutObject权限
内容的提问来源于stack exchange,提问作者MNSH
相关产品推荐
相关产品推荐

