如何写PDF加水印脚本

wen 实用脚本 23

本文目录导读:

如何写PDF加水印脚本

  1. Python方案(最推荐)
  2. Node.js方案
  3. 命令行工具方案
  4. 完整功能脚本(Python)
  5. 安装依赖
  6. 使用方式
  7. 注意事项

我来提供几个不同语言和场景的PDF加水印脚本方案。

Python方案(最推荐)

使用 PyMuPDF(fitz)

import fitz  # PyMuPDF
def add_watermark_pymupdf(input_pdf, output_pdf, watermark_text, opacity=0.3):
    """
    使用PyMuPDF给PDF添加文字水印
    """
    # 打开PDF文件
    doc = fitz.open(input_pdf)
    # 为每一页添加水印
    for page_num in range(len(doc)):
        page = doc[page_num]
        # 获取页面尺寸
        rect = page.rect
        width = rect.width
        height = rect.height
        # 创建水印文本形状
        shape = page.new_shape()
        # 设置水印参数
        shape.insert_text(
            fitz.Point(width/4, height/2),  # 位置(居中偏移)
            watermark_text,
            fontsize=48,
            color=(0, 0, 0),  # 黑色
            opacity=opacity
        )
        # 应用水印
        shape.commit()
    # 保存文件
    doc.save(output_pdf)
    doc.close()
    print(f"水印已添加完成,保存到:{output_pdf}")
# 使用示例
add_watermark_pymupdf("input.pdf", "output.pdf", "机密文档", opacity=0.3)

使用 reportlab + PyPDF2

from PyPDF2 import PdfReader, PdfWriter
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
import io
def add_watermark_pypdf2(input_pdf, output_pdf, watermark_text):
    """
    使用PyPDF2和reportlab添加水印
    """
    # 创建水印PDF
    watermark_pdf = io.BytesIO()
    c = canvas.Canvas(watermark_pdf, pagesize=letter)
    # 旋转45度添加水印
    c.saveState()
    c.setFillColorRGB(0.5, 0.5, 0.5, alpha=0.3)  # 灰色半透明
    c.setFont("Helvetica", 48)
    c.translate(300, 400)
    c.rotate(45)
    c.drawCentredString(0, 0, watermark_text)
    c.restoreState()
    c.save()
    watermark_pdf.seek(0)
    # 打开原PDF和水印PDF
    reader = PdfReader(input_pdf)
    watermark_reader = PdfReader(watermark_pdf)
    writer = PdfWriter()
    # 为每一页添加水印
    for page_num in range(len(reader.pages)):
        page = reader.pages[page_num]
        page.merge_page(watermark_reader.pages[0])
        writer.add_page(page)
    # 保存文件
    with open(output_pdf, 'wb') as f:
        writer.write(f)
    print(f"水印已添加完成,保存到:{output_pdf}")
# 使用示例
add_watermark_pypdf2("input.pdf", "output.pdf", "机密文档")

Node.js方案

const PDFDocument = require('pdf-lib').PDFDocument;
const fs = require('fs');
async function addWatermark(inputPath, outputPath, watermarkText) {
    // 读取PDF文件
    const pdfBytes = fs.readFileSync(inputPath);
    const pdfDoc = await PDFDocument.load(pdfBytes);
    // 获取字体(使用标准字体)
    const font = await pdfDoc.embedFont('Helvetica');
    // 获取每一页
    const pages = pdfDoc.getPages();
    pages.forEach((page) => {
        const { width, height } = page.getSize();
        // 添加水印文本
        page.drawText(watermarkText, {
            x: width / 2 - 100,
            y: height / 2,
            size: 48,
            font: font,
            color: { r: 0.5, g: 0.5, b: 0.5, alpha: 0.3 },
            rotate: { angle: 45 }
        });
    });
    // 保存文件
    const pdfBytesModified = await pdfDoc.save();
    fs.writeFileSync(outputPath, pdfBytesModified);
    console.log(`水印已添加完成,保存到:${outputPath}`);
}
// 使用示例
addWatermark('input.pdf', 'output.pdf', '机密文档')
    .catch(console.error);

需要安装:

npm install pdf-lib

命令行工具方案

使用 ImageMagick(最简单)

#!/bin/bash
# add_watermark.sh
INPUT_PDF="$1"
OUTPUT_PDF="$2"
WATERMARK_TEXT="$3"
# 使用ImageMagick添加水印
convert "$INPUT_PDF" \
    -pointsize 48 \
    -fill "rgba(128,128,128,0.3)" \
    -gravity center \
    -annotate -45x-45 "$WATERMARK_TEXT" \
    "$OUTPUT_PDF"
echo "水印已添加完成"

使用方式:

chmod +x add_watermark.sh
./add_watermark.sh input.pdf output.pdf "机密文档"

完整功能脚本(Python)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import fitz
import argparse
import sys
from pathlib import Path
class PDFWatermarker:
    def __init__(self):
        self.supported_formats = ['.pdf']
    def add_watermark(self, input_path, output_path, text, 
                     opacity=0.3, font_size=48, color='black',
                     rotation=0, position='center'):
        """
        完整的PDF水印添加功能
        """
        try:
            # 验证输入文件
            if not Path(input_path).exists():
                raise FileNotFoundError(f"输入文件不存在:{input_path}")
            # 打开PDF
            doc = fitz.open(input_path)
            # 颜色处理
            color_map = {
                'black': (0, 0, 0),
                'red': (1, 0, 0),
                'blue': (0, 0, 1),
                'green': (0, 1, 0),
                'gray': (0.5, 0.5, 0.5)
            }
            rgb_color = color_map.get(color.lower(), (0, 0, 0))
            # 处理每一页
            for page_num in range(len(doc)):
                page = doc[page_num]
                rect = page.rect
                # 计算位置
                if position == 'center':
                    pos = fitz.Point(rect.width/3, rect.height/2)
                elif position == 'top':
                    pos = fitz.Point(rect.width/3, 100)
                elif position == 'bottom':
                    pos = fitz.Point(rect.width/3, rect.height - 100)
                else:
                    pos = fitz.Point(rect.width/3, rect.height/2)
                # 创建并添加水印
                shape = page.new_shape()
                shape.insert_text(
                    pos,
                    text,
                    fontsize=font_size,
                    color=rgb_color,
                    opacity=opacity
                )
                shape.commit()
            # 保存
            doc.save(output_path)
            doc.close()
            print(f"✓ 水印添加成功")
            print(f"  输入文件:{input_path}")
            print(f"  输出文件:{output_path}")
            print(f"  水印文本:'{text}'")
        except Exception as e:
            print(f"✗ 错误:{str(e)}")
            sys.exit(1)
def main():
    parser = argparse.ArgumentParser(
        description='PDF水印添加工具',
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
示例:
  %(prog)s input.pdf output.pdf "机密"
  %(prog)s input.pdf output.pdf "草稿" --opacity 0.5 --color red
  %(prog)s input.pdf output.pdf "COPY" --rotation 45 --position bottom
        """
    )
    parser.add_argument('input', help='输入PDF文件路径')
    parser.add_argument('output', help='输出PDF文件路径')
    parser.add_argument('text', help='水印文本')
    parser.add_argument('--opacity', type=float, default=0.3,
                       help='透明度 (0-1),默认0.3')
    parser.add_argument('--font-size', type=int, default=48,
                       help='字体大小,默认48')
    parser.add_argument('--color', default='black',
                       choices=['black', 'red', 'blue', 'green', 'gray'],
                       help='颜色,默认黑色')
    parser.add_argument('--rotation', type=int, default=0,
                       help='旋转角度,默认0')
    parser.add_argument('--position', default='center',
                       choices=['center', 'top', 'bottom'],
                       help='位置,默认居中')
    args = parser.parse_args()
    watermarker = PDFWatermarker()
    watermarker.add_watermark(
        args.input,
        args.output,
        args.text,
        opacity=args.opacity,
        font_size=args.font_size,
        color=args.color,
        rotation=args.rotation,
        position=args.position
    )
if __name__ == '__main__':
    main()

安装依赖

Python版本:

pip install PyMuPDF
# 或
pip install PyPDF2 reportlab

Node.js版本:

npm install pdf-lib

使用方式

基础用法:

# Python简单脚本
python watermark_pdf.py
# 完整功能脚本
python pdf_watermarker.py input.pdf output.pdf "机密文档"
python pdf_watermarker.py input.pdf output.pdf "草稿" --opacity 0.5 --color red

注意事项

  1. 备份原文件:建议先备份原PDF文件
  2. 字体支持:中文水印可能需要中文字体支持
  3. 性能考虑:大文件处理可能需要较长时间
  4. 版权问题:确保你有权限修改目标PDF文件
  5. 水印样式:可以根据需求调整透明度、颜色、大小和位置

推荐使用Python的PyMuPDF方案,因为它性能好、功能强大且易于使用。

抱歉,评论功能暂时关闭!