使用 Python 为 PDF 添加水印

embedded/2024/12/26 21:09:29/

概述

  1. 安装所需库
  2. 创建水印 PDF
  3. 将水印应用到你的 PDF

1. 安装所需库

首先,确保你的系统上安装了 Python。然后,使用 pip 安装必要的库:

pip install PyPDF2 reportlab
  • PyPDF2:一个用于读取和操作 PDF 文件的库。
  • reportlab:一个用于创建 PDF 文档的库,我们将使用它来创建水印。

2. 创建水印 PDF

我们将创建一个简单的水印 PDF,其中包含“CONFIDENTIAL”(机密)字样,以对角线形式覆盖在页面上。你可以根据需要自定义文本、字体、大小、颜色和位置。

python">from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib import colorsdef 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 的每一页。

python">import PyPDF2def add_watermark(input_pdf_path, output_pdf_path, watermark_pdf_path):# 打开原始 PDFwith open(input_pdf_path, 'rb') as input_file:reader = PyPDF2.PdfReader(input_file)writer = PyPDF2.PdfWriter()# 打开水印 PDFwith 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)# 写出带水印的 PDFwith 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"  # 我们之前创建的水印 PDFadd_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。

python">from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib import colors
import PyPDF2def 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):# 打开原始 PDFwith open(input_pdf_path, 'rb') as input_file:reader = PyPDF2.PdfReader(input_file)writer = PyPDF2.PdfWriter()# 打开水印 PDFwith 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)# 写出带水印的 PDFwith 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}' 已创建。")# 将水印添加到 PDFadd_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.ppmy.cn/embedded/148996.html

相关文章

如何使用 Wireshark:从入门到进阶的网络分析工具

简述 Wireshark 是全球最受欢迎的网络协议分析工具,它帮助用户捕获和分析网络流量,诊断网络问题,排查安全漏洞,甚至恢复丢失的数据文件。作为一名网络工程师、安全专家、甚至是开发者,Wireshark 都是你必须掌握的工具…

WPF制作图片闪烁的自定义控件

1.定义自定义控件 BlinkingImage.cs: using System; using System.Windows; using System.Windows.Controls; using System.Windows.Media.Animation; using System.Windows.Media.Imaging;namespace YourNamespace {public class BlinkingImage : Control{public static rea…

LeetCode 3218.切蛋糕的最小总开销 I:记忆化搜索(深度优先搜索DFS)

【LetMeFly】3218.切蛋糕的最小总开销 I:记忆化搜索(深度优先搜索DFS) 力扣题目链接:https://leetcode.cn/problems/minimum-cost-for-cutting-cake-i/ 有一个 m x n 大小的矩形蛋糕,需要切成 1 x 1 的小块。 给你整数 m ,n 和…

计算机网络:运输层 —— TCP 的选择确认(SACK)

文章目录 TCP 的选择确认协商与启用工作机制接收方发送方 TCP 的选择确认 在 TCP 传输过程中,由于网络拥塞、链路故障等因素,数据可能会出现丢失或乱序的情况。传统的 TCP 确认机制是累积确认,TCP 接收方只能对按序收到的数据中的最高序号给…

MongoDB部署高可用集群

一、准备工作 修改3台服务器的hostname为mongodb0、mongodb1和mongodb2 vim /etc/hostname vim /etc/hosts 分别配置3个节点的域名 10.5.30.19 mongodb0 10.5.30.14 mongodb1 10.5.30.18 mongodb2关闭防火墙下载mongodb安装包并解压:mongod…

arcface

GitHub - bubbliiiing/arcface-pytorch: 这是一个arcface-pytorch的源码,可以用于训练自己的模型。 https://github.com/deepinsight/insightface/tree/master/recognition/arcface_torch 参考博客 Arcface部署应用实战-CSDN博客 https://zhuanlan.zhihu.com/p/16…

威尔克斯(Wilks)分布

内容来源 应用多元统计分析 北京大学出版社 高惠璇编著 威尔克斯 Λ \Lambda Λ 分布 回顾一元统计中的 F F F 分布 设 ξ ∼ χ 2 ( m ) , η ∼ χ 2 ( n ) \xi\sim\chi^2(m),\eta\sim\chi^2(n) ξ∼χ2(m),η∼χ2(n),且相互独立,则 F ξ / m η…

游戏引擎学习第59天

回顾并计划接下来的一天 在处理实体的空间划分时,遇到了一些问题。例如,虽然树和玩家应该在某些情况下被排除在外,但目前的系统仍然会出现不合逻辑的渲染结果,这在视觉上并不符合预期。尽管这些问题主要是渲染上的,并…