Node.js 中为 PDF 文件添加文字或图片水印,可以使用 pdf-libpdfkit 等库来操作 PDF 文件。下面是使用 pdf-lib 库为 PDF 文件添加水印的示例代码。

安装 pdf-lib

首先,需要安装 pdf-lib

npm install pdf-lib

给 PDF 添加文字水印

以下是一个添加文字水印的示例:

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

// 读取 PDF 文件
async function addWatermarkToPdf() {
  const existingPdfBytes = fs.readFileSync('input.pdf');
  
  // 加载现有的 PDF 文档
  const pdfDoc = await PDFDocument.load(existingPdfBytes);
  
  // 获取 PDF 中的所有页面
  const pages = pdfDoc.getPages();
  
  // 设置水印的文字
  const watermarkText = 'CONFIDENTIAL';
  const font = await pdfDoc.embedFont(PDFDocument.Font.Helvetica);
  const fontSize = 50;
  
  // 在每一页上添加水印
  pages.forEach(page => {
    const { width, height } = page.getSize();
    
    page.drawText(watermarkText, {
      x: width / 4,
      y: height / 2,
      font: font,
      size: fontSize,
      color: rgb(0.75, 0.75, 0.75), // 设置水印的颜色
      rotate: degrees(-45), // 设置旋转角度
    });
  });
  
  // 保存修改后的 PDF 文件
  const pdfBytes = await pdfDoc.save();
  fs.writeFileSync('output_with_watermark.pdf', pdfBytes);
}

addWatermarkToPdf().then(() => {
  console.log('Watermark added successfully!');
}).catch(err => {
  console.error('Error adding watermark:', err);
});

给 PDF 添加图片水印

要添加图片水印,首先需要加载图片并将其嵌入到 PDF 中:

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

async function addImageWatermarkToPdf() {
  const existingPdfBytes = fs.readFileSync('input.pdf');
  const imageBytes = fs.readFileSync('watermark-image.png');  // 图片水印
  
  const pdfDoc = await PDFDocument.load(existingPdfBytes);
  const image = await pdfDoc.embedPng(imageBytes); // 加载图片
  const imageDims = image.scale(0.2); // 调整图片大小
  
  const pages = pdfDoc.getPages();
  
  pages.forEach(page => {
    const { width, height } = page.getSize();
    
    page.drawImage(image, {
      x: width / 4,
      y: height / 2,
      width: imageDims.width,
      height: imageDims.height,
      rotate: degrees(-45), // 设置旋转角度
    });
  });

  const pdfBytes = await pdfDoc.save();
  fs.writeFileSync('output_with_image_watermark.pdf', pdfBytes);
}

addImageWatermarkToPdf().then(() => {
  console.log('Image watermark added successfully!');
}).catch(err => {
  console.error('Error adding image watermark:', err);
});

注意事项

  1. PDF 字体pdf-lib 内建了几个字体(如 Helvetica),如果想使用自定义字体,可能需要手动嵌入字体文件。
  2. 旋转与定位:水印的位置和旋转角度可以根据需要进行调整。
  3. 图片尺寸:使用 image.scale() 来调整图片水印的大小。

这种方法适用于生成简单的水印,如果需要更复杂的操作,pdf-lib 也提供了更灵活的 API 来操作 PDF 内容。