使用 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. 将水印与每一页合并
    4. 遍历原始 PDF 的每一页。
    5. 使用 merge_page 将水印叠加到当前页。
    6. 将合并后的页面添加到 PdfWriter 对象。
    7. 写出输出 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 文档添加水印。这种方法具有高度的可定制性,并且可以根据需要集成到更大的自动化工作流程中。如果你遇到任何问题或有进一步的问题,请随时提问!

    作者:Channing Lewis

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用 Python 为 PDF 添加水印

    发表回复