自学内容网 自学内容网

使用 Python 为 PDF 添加水印

概述

  1. 安装所需库
  2. 创建水印 PDF
  3. 将水印应用到你的 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}")

解释:

  1. 打开原始 PDF:使用 PyPDF2.PdfReader 读取输入 PDF。
  2. 打开水印 PDF:读取我们之前创建的水印 PDF。
  3. 将水印与每一页合并
    • 遍历原始 PDF 的每一页。
    • 使用 merge_page 将水印叠加到当前页。
    • 将合并后的页面添加到 PdfWriter 对象。
  4. 写出输出 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}'。")

使用方法:

  1. 准备你的输入 PDF:确保在脚本所在的目录中有 input.pdf,或提供正确的路径。
  2. 运行脚本:使用 Python 执行脚本。
python add_watermark.py

运行后,你将获得一个名为 watermarked.pdf 的文件,每一页上都带有“CONFIDENTIAL”水印。

额外提示

  • 每页不同的水印:如果你想在不同的页面上使用不同的水印,可以修改 add_watermark 函数以处理多个水印 PDF 或动态生成它们。
  • 定位:通过调整 create_watermark 函数中的 translaterotate 参数,可以改变水印的位置和角度。
  • 多个水印:你可以通过在每个 PDF 页面上合并多个水印页面来叠加多个水印。
  • 错误处理:对于生产环境的脚本,建议添加错误处理,以管理诸如文件缺失或 PDF 格式不兼容等问题。

替代库

虽然 PyPDF2reportlab 功能强大且广泛使用,但你可能还会考虑以下替代库:

  • PyMuPDF (fitz):一个快速且多功能的 PDF 操作库。

    pip install PyMuPDF
    
  • pdfplumber:主要用于提取信息,但可以与其他库结合使用进行操作。

  • pdfrw:另一个用于读取和写入 PDF 的库,通常与 reportlab 一起使用。

根据你的项目需求和熟悉程度,选择最适合的库。

结论

通过遵循上述步骤,你可以高效地使用 Python 为 PDF 文档添加水印。这种方法具有高度的可定制性,并且可以根据需要集成到更大的自动化工作流程中。如果你遇到任何问题或有进一步的问题,请随时提问!


原文地址:https://blog.csdn.net/lycwhu/article/details/144717653

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!