使用 Python 为 PDF 添加水印
概述
- 安装所需库
- 创建水印 PDF
- 将水印应用到你的 PDF
1. 安装所需库
首先,确保你的系统上安装了 Python。然后,使用 pip
安装必要的库:
pip install PyPDF2 reportlab
- PyPDF2:一个用于读取和操作 PDF 文件的库。
- reportlab:一个用于创建 PDF 文档的库,我们将使用它来创建水印。
2. 创建水印 PDF
我们将创建一个简单的水印 PDF,其中包含“CONFIDENTIAL”(机密)字样,以对角线形式覆盖在页面上。你可以根据需要自定义文本、字体、大小、颜色和位置。
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib import colors
def create_watermark(watermark_text, watermark_pdf_path):
c = canvas.Canvas(watermark_pdf_path, pagesize=letter)
width, height = letter
# 设置透明度(可选)
c.setFillColor(colors.grey, alpha=0.3)
# 设置字体和大小
c.setFont("Helvetica-Bold", 50)
# 旋转画布以绘制对角线文本
c.saveState()
c.translate(width / 2, height / 2)
c.rotate(45)
c.drawCentredString(0, 0, watermark_text)
c.restoreState()
c.save()
if __name__ == "__main__":
create_watermark("CONFIDENTIAL", "watermark.pdf")
解释:
- canvas.Canvas:创建一个新的 PDF 画布。
- setFillColor:设置文本颜色和透明度。
- setFont:设置字体类型和大小。
- saveState & restoreState:保存和恢复画布状态,以应用旋转等变换,而不影响后续的绘制。
- translate & rotate:移动并旋转画布,以对角线形式定位文本。
- drawCentredString:在指定位置居中绘制水印文本。
运行此脚本以生成 watermark.pdf
。
3. 将水印应用到你的 PDF
现在,我们将创建的水印应用到目标 PDF 的每一页。
import PyPDF2
def add_watermark(input_pdf_path, output_pdf_path, watermark_pdf_path):
# 打开原始 PDF
with open(input_pdf_path, 'rb') as input_file:
reader = PyPDF2.PdfReader(input_file)
writer = PyPDF2.PdfWriter()
# 打开水印 PDF
with open(watermark_pdf_path, 'rb') as watermark_file:
watermark = PyPDF2.PdfReader(watermark_file)
watermark_page = watermark.pages[0]
# 遍历所有页面并合并水印
for page_number in range(len(reader.pages)):
page = reader.pages[page_number]
page.merge_page(watermark_page)
writer.add_page(page)
# 写出带水印的 PDF
with open(output_pdf_path, 'wb') as output_file:
writer.write(output_file)
if __name__ == "__main__":
input_pdf = "input.pdf" # 替换为你的输入 PDF 路径
output_pdf = "watermarked.pdf" # 期望的输出 PDF 路径
watermark_pdf = "watermark.pdf" # 我们之前创建的水印 PDF
add_watermark(input_pdf, output_pdf, watermark_pdf)
print(f"带水印的 PDF 已保存为 {output_pdf}")
解释:
- 打开原始 PDF:使用
PyPDF2.PdfReader
读取输入 PDF。 - 打开水印 PDF:读取我们之前创建的水印 PDF。
- 将水印与每一页合并:
- 遍历原始 PDF 的每一页。
- 使用
merge_page
将水印叠加到当前页。 - 将合并后的页面添加到
PdfWriter
对象。
- 写出输出 PDF:将带水印的页面保存到新的 PDF 文件中。
注意事项:
- 兼容性:确保水印 PDF 的页面大小与输入 PDF 相同,以避免缩放问题。
- 透明度:水印 PDF 中设置的透明度确保水印不会过度遮挡原始内容。
- 自定义:你可以通过修改
create_watermark
函数来调整水印的外观(例如更改文本、颜色、旋转角度)。
完整的工作流程示例
为了方便起见,以下是将上述两个步骤组合到一个脚本中的完整示例。此脚本首先创建水印,然后将其应用到目标 PDF。
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib import colors
import PyPDF2
def create_watermark(watermark_text, watermark_pdf_path):
c = canvas.Canvas(watermark_pdf_path, pagesize=letter)
width, height = letter
# 设置透明度(可选)
c.setFillColor(colors.grey, alpha=0.3)
# 设置字体和大小
c.setFont("Helvetica-Bold", 50)
# 旋转画布以绘制对角线文本
c.saveState()
c.translate(width / 2, height / 2)
c.rotate(45)
c.drawCentredString(0, 0, watermark_text)
c.restoreState()
c.save()
def add_watermark(input_pdf_path, output_pdf_path, watermark_pdf_path):
# 打开原始 PDF
with open(input_pdf_path, 'rb') as input_file:
reader = PyPDF2.PdfReader(input_file)
writer = PyPDF2.PdfWriter()
# 打开水印 PDF
with open(watermark_pdf_path, 'rb') as watermark_file:
watermark = PyPDF2.PdfReader(watermark_file)
watermark_page = watermark.pages[0]
# 遍历所有页面并合并水印
for page_number in range(len(reader.pages)):
page = reader.pages[page_number]
page.merge_page(watermark_page)
writer.add_page(page)
# 写出带水印的 PDF
with open(output_pdf_path, 'wb') as output_file:
writer.write(output_file)
if __name__ == "__main__":
# 参数
watermark_text = "CONFIDENTIAL"
watermark_pdf = "watermark.pdf"
input_pdf = "input.pdf" # 替换为你的输入 PDF 路径
output_pdf = "watermarked.pdf" # 期望的输出 PDF 路径
# 创建水印
create_watermark(watermark_text, watermark_pdf)
print(f"水印 PDF '{watermark_pdf}' 已创建。")
# 将水印添加到 PDF
add_watermark(input_pdf, output_pdf, watermark_pdf)
print(f"带水印的 PDF 已保存为 '{output_pdf}'。")
使用方法:
- 准备你的输入 PDF:确保在脚本所在的目录中有
input.pdf
,或提供正确的路径。 - 运行脚本:使用 Python 执行脚本。
python add_watermark.py
运行后,你将获得一个名为 watermarked.pdf
的文件,每一页上都带有“CONFIDENTIAL”水印。
额外提示
- 每页不同的水印:如果你想在不同的页面上使用不同的水印,可以修改
add_watermark
函数以处理多个水印 PDF 或动态生成它们。 - 定位:通过调整
create_watermark
函数中的translate
和rotate
参数,可以改变水印的位置和角度。 - 多个水印:你可以通过在每个 PDF 页面上合并多个水印页面来叠加多个水印。
- 错误处理:对于生产环境的脚本,建议添加错误处理,以管理诸如文件缺失或 PDF 格式不兼容等问题。
替代库
虽然 PyPDF2
和 reportlab
功能强大且广泛使用,但你可能还会考虑以下替代库:
-
PyMuPDF (fitz):一个快速且多功能的 PDF 操作库。
pip install PyMuPDF
-
pdfplumber:主要用于提取信息,但可以与其他库结合使用进行操作。
-
pdfrw:另一个用于读取和写入 PDF 的库,通常与
reportlab
一起使用。
根据你的项目需求和熟悉程度,选择最适合的库。
结论
通过遵循上述步骤,你可以高效地使用 Python 为 PDF 文档添加水印。这种方法具有高度的可定制性,并且可以根据需要集成到更大的自动化工作流程中。如果你遇到任何问题或有进一步的问题,请随时提问!