本文目录导读:

我来提供几个不同语言和场景的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
注意事项
- 备份原文件:建议先备份原PDF文件
- 字体支持:中文水印可能需要中文字体支持
- 性能考虑:大文件处理可能需要较长时间
- 版权问题:确保你有权限修改目标PDF文件
- 水印样式:可以根据需求调整透明度、颜色、大小和位置
推荐使用Python的PyMuPDF方案,因为它性能好、功能强大且易于使用。