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

如何用NodeJS为pdf-creator-node生成的PDF加密码(无需CLI或pdfq)

无需CLI工具,用NodeJS为PDF添加密码保护(基于pdf-creator-node)

可以实现,不需要依赖pdfq或任何CLI命令,只需借助纯NodeJS的PDF处理库(比如pdf-lib),在pdf-creator-node生成PDF后,对文件进行加密处理即可。

实现步骤

  1. 安装所需依赖:

    npm install pdf-creator-node pdf-lib
    
  2. 修改原有代码,添加加密逻辑:
    先通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:57:48