当前位置: 首页 > article >正文

使用 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 文档添加水印。这种方法具有高度的可定制性,并且可以根据需要集成到更大的自动化工作流程中。如果你遇到任何问题或有进一步的问题,请随时提问!


http://www.kler.cn/a/451988.html

相关文章:

  • C#调用OpenXml,读取excel行数据,遇到空单元跳过现象处理
  • 后端接口设计
  • dify的ChatFlow自定义上传图片并通过HTTP请求到SpringBoot后端
  • 《三角洲行动》游戏运行时提示“缺失kernel32.dll”:问题解析与解决方案
  • C++中的字符串实现
  • 链接数据Linked Data的深层解读
  • 【Android】BuildConfig类找不到(无法生成问题解决)
  • 【Golang 面试题】每日 3 题(四)
  • 安装k8s涉及命令(方便放到txt离线使用)
  • 常见设计原则
  • 如何解决 Apache 中 “CORS no allow credentials” 错误 ?
  • 由于这些关键原因,我总是手边有一台虚拟机
  • 微信小程序用户信息解密 AES/CBC/NoPadding 解密失败问题
  • Linux环境下使用tomcat+nginx部署若依项目
  • --spring.profiles.active=prod
  • 100V宽压输入反激隔离电源,适用于N道沟MOSFET或GaN或5V栅极驱动器,无需光耦合
  • 全国硕士研究生入学考试(考研)备考要点之具体科目
  • 如何系统全面地自学Java语言?
  • 【工具变量】山水工程试点政策DID(2000-2023年)
  • 机器学习DAY4续:梯度提升与 XGBoost (完)
  • lua-debug for Sublime
  • Flink定时器
  • 嵌入式学习-QT-Day08
  • Word窗体联动Excel实现级联组合框
  • 机试题——最大时间
  • STM32单片机芯片与内部41 DAC TIM触发双DAC DMA搬运同步输出正弦波