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

如何用NodeJS将HTML转PDF并添加密码保护(基于Buffer)

NodeJS实现HTML转加密PDF并上传S3的解决方案

完全可以实现你的需求,全程基于Buffer操作,无需生成临时文件。下面是具体的分步实现方案:

1. 安装所需依赖

先安装三个核心库:

  • html-pdf-node:将HTML转换为PDF Buffer
  • pdf-lib:对PDF Buffer进行密码加密
  • @aws-sdk/client-s3:AWS S3官方SDK(用于上传Buffer)

执行安装命令:

npm install html-pdf-node pdf-lib @aws-sdk/client-s3

2. HTML转PDF Buffer

使用html-pdf-node直接生成PDF Buffer,支持自定义HTML内容或远程URL:

const html_to_pdf = require('html-pdf-node');

async function htmlToPdfBuffer(htmlContent) {
  const options = { format: 'A4' }; // 可自定义尺寸、方向、页边距等参数
  const file = { content: htmlContent };
  // 生成PDF Buffer
  const pdfBuffer = await html_to_pdf.generatePdf(file, options);
  return pdfBuffer;
}

// 示例调用:传入HTML字符串
const sampleHtml = `<h1>测试PDF内容</h1><p>这是通过NodeJS生成的加密PDF</p>`;
// const pdfBuffer = await htmlToPdfBuffer(sampleHtml);

3. 为PDF Buffer添加密码保护

用pdf-lib加载原始PDF Buffer,设置打开密码和权限密码(可设为同一个),生成加密后的Buffer:

const { PDFDocument, StandardPermissions } = require('pdf-lib');

async function encryptPdfBuffer(originalPdfBuffer, userPassword, ownerPassword) {
  // 加载原始PDF
  const pdfDoc = await PDFDocument.load(originalPdfBuffer);
  
  // 设置加密参数:打开密码、权限密码,以及文档操作权限
  pdfDoc.setEncryption({
    userPassword,
    ownerPassword,
    permissions: StandardPermissions.AllowPrinting, // 可自定义权限,比如禁止复制、编辑等
  });

  // 生成加密后的PDF Buffer
  const encryptedPdfBuffer = await pdfDoc.save();
  return encryptedPdfBuffer;
}

// 示例调用:
// const encryptedBuffer = await encryptPdfBuffer(pdfBuffer, 'user123', 'owner456');

4. 上传加密PDF Buffer到S3

使用AWS SDK v3的S3Client和PutObjectCommand直接上传Buffer:

const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3');

// 初始化S3客户端
const s3Client = new S3Client({
  region: 'your-region', // 替换为你的S3区域,比如us-east-1
  credentials: {
    accessKeyId: 'your-access-key', // 替换为你的AWS访问密钥
    secretAccessKey: 'your-secret-key',
  },
});

async function uploadToS3(buffer, bucketName, keyName) {
  const params = {
    Bucket: bucketName,
    Key: keyName, // 上传后的文件名,比如'encrypted-test.pdf'
    Body: buffer,
    ContentType: 'application/pdf',
  };

  const command = new PutObjectCommand(params);
  await s3Client.send(command);
  console.log(`文件已成功上传到S3:s3://${bucketName}/${keyName}`);
}

完整流程整合

将以上步骤串联起来,形成完整的执行流程:

async function fullWorkflow(htmlContent, userPassword, ownerPassword, bucketName, s3Key) {
  try {
    // 1. HTML转PDF Buffer
    const pdfBuffer = await htmlToPdfBuffer(htmlContent);
    // 2. 加密PDF
    const encryptedBuffer = await encryptPdfBuffer(pdfBuffer, userPassword, ownerPassword);
    // 3. 上传到S3
    await uploadToS3(encryptedBuffer, bucketName, s3Key);
    return '流程执行完成';
  } catch (error) {
    console.error('执行出错:', error);
    throw error;
  }
}

// 调用完整流程
fullWorkflow(
  `<h1>测试文档</h1><p>加密PDF上传S3测试</p>`,
  'user-pass-123',
  'owner-pass-456',
  'your-bucket-name',
  'encrypted-docs/test.pdf'
);

注意事项

  • 确保AWS权限配置正确:你的IAM用户需要拥有S3的PutObject权限
  • html-pdf-node基于puppeteer,首次运行会下载Chromium,若环境受限可提前配置puppeteer的下载路径
  • 可根据需求调整PDF生成参数(比如页眉页脚、背景色)和加密权限(比如禁止打印、修改)

内容的提问来源于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.11 14:32:11