如何用NodeJS为pdf-creator-node生成的PDF加密码(无需CLI或pdfq)
无需CLI工具,用NodeJS为PDF添加密码保护(基于pdf-creator-node)
可以实现,不需要依赖pdfq或任何CLI命令,只需借助纯NodeJS的PDF处理库(比如pdf-lib),在pdf-creator-node生成PDF后,对文件进行加密处理即可。
实现步骤
安装所需依赖:
npm install pdf-creator-node pdf-lib修改原有代码,添加加密逻辑:
先通过pdf-creator-node生成未加密的PDF,再用pdf-lib加载该PDF并设置密码保护。你可以选择生成中间文件后处理,或者直接在内存中完成(更高效)。
方案1:生成中间文件后加密
const fs = require("fs"); const pdfCreator = require("pdf-creator-node"); const { PDFDocument, StandardPermissions } = require("pdf-lib"); const data = require("./utils/data"); // 读取HTML模板 const htmlTemplate = fs.readFileSync("./templates/html/template.html", "utf8"); // PDF生成配置 const options = { format: "A4", orientation: "portrait", }; const document = { html: htmlTemplate, data, path: "output.pdf", // 生成未加密的临时PDF }; pdfCreator .create(document, options) .then(async () => { console.log("基础PDF生成完成,开始加密..."); // 读取临时PDF文件 const pdfBytes = fs.readFileSync("output.pdf"); // 加载PDF文档 const pdfDoc = await PDFDocument.load(pdfBytes); // 设置密码:用户密码(打开需输入)、所有者密码(获取完整权限) const userPassword = "your-user-password"; const ownerPassword = "your-owner-password"; // 配置权限:按需调整,示例为允许打印、禁止修改和复制 pdfDoc.setPermissions({ ...StandardPermissions.AllowPrinting, ...StandardPermissions.DenyModification, ...StandardPermissions.DenyCopying, }); // 执行加密 await pdfDoc.encrypt({ userPassword, ownerPassword }); // 保存加密后的PDF const encryptedPdfBytes = await pdfDoc.save(); fs.writeFileSync("output-protected.pdf", encryptedPdfBytes); console.log("PDF加密完成,已保存为 output-protected.pdf"); // 可选:删除临时未加密文件 // fs.unlinkSync("output.pdf"); }) .catch((error) => { console.error("PDF生成或加密失败:", error); });
方案2:内存中直接处理(无中间文件)
如果不想生成临时文件,可以让pdf-creator-node直接返回PDF Buffer,再进行加密:
const fs = require("fs"); const pdfCreator = require("pdf-creator-node"); const { PDFDocument, StandardPermissions } = require("pdf-lib"); const data = require("./utils/data"); const htmlTemplate = fs.readFileSync("./templates/html/template.html", "utf8"); const options = { format: "A4", orientation: "portrait", }; // 不设置path,让pdf-creator-node返回Buffer const document = { html: htmlTemplate, data, }; pdfCreator .create(document, options) .then(async (result) => { console.log("基础PDF生成完成,开始加密..."); // 直接使用生成的Buffer const pdfBytes = result.buffer; const pdfDoc = await PDFDocument.load(pdfBytes); const userPassword = "your-user-password"; const ownerPassword = "your-owner-password"; pdfDoc.setPermissions({ ...StandardPermissions.AllowPrinting, ...StandardPermissions.DenyModification, }); await pdfDoc.encrypt({ userPassword, ownerPassword }); const encryptedPdfBytes = await pdfDoc.save(); fs.writeFileSync("output-protected.pdf", encryptedPdfBytes); console.log("PDF加密完成"); }) .catch((error) => { console.error("操作失败:", error); });
关键说明
pdf-lib是纯JavaScript库,完全在NodeJS环境运行,无需依赖任何外部CLI工具。- 权限配置可根据需求调整,比如
StandardPermissions.AllowModification允许修改,StandardPermissions.DenyPrinting禁止打印等。 - 用户密码和所有者密码可以相同,也可以设置不同的密码区分权限。
内容的提问来源于stack exchange,提问作者Poor programmer
相关产品推荐
相关产品推荐

