本文目录导读:

我来提供几个不同语言和场景的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方案,因为它性能好、功能强大且易于使用。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播