You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用pypdf为PDF添加水印?附文本修改代码待完善

使用pypdf修改PDF文本并添加透明水印/文本

一、文本替换说明

PDF的文本是基于坐标布局存储的,pypdf没有直接修改原PDF文本的原生API。如果需要替换文本,有两种常见方案:

方案1:覆盖式替换(适合纯文本PDF,会丢失原格式)

如果你的PDF是纯文本内容,可清空原页面内容后重新写入替换后的文本:

# 在循环内的页面处理部分添加
canvas = Canvas(page)
canvas.set_font("Helvetica", 12)  # 设置字体和大小
width = page.mediabox.width
height = page.mediabox.height
canvas.draw_text(new_text, x=50, y=height-50)  # 从页面左上角开始写入
page = canvas.get_page()

方案2:精准定位替换(复杂但保留原格式)

通过extract_words=True提取每个文本块的坐标,再用新文本覆盖对应位置:

# 提取带坐标的文本块
words = page.extract_words(extract_words=True)
canvas = Canvas(page)
canvas.set_font("Helvetica", 12)
canvas.set_fill_color("white")  # 用白色覆盖原文本
canvas.set_stroke_color("white")
for word in words:
    if word["text"] == "text":
        # 覆盖原文本位置
        canvas.rectangle(word["x0"], word["y0"], word["x1"]-word["x0"], word["y1"]-word["y0"], fill=True)
        # 写入新文本
        canvas.draw_text("test", x=word["x0"], y=word["y0"])
page.merge_page(canvas.get_page())

二、添加透明文本水印

通过pypdf的Canvas和ExtGState设置透明度,实现透明水印效果:

完整代码示例

from pypdf import PdfReader, PdfWriter
from pypdf.canvas.draw import Canvas
from pypdf.generic import DictionaryObject, NameObject, NumberObject

def add_transparent_text_watermark(page, watermark_text, opacity=0.3):
    # 创建Canvas用于绘制水印
    canvas = Canvas(page)
    
    # 设置透明度参数
    transparency = DictionaryObject()
    transparency[NameObject("/CA")] = NumberObject(opacity)  # 透明度值0-1
    transparency[NameObject("/BM")] = NameObject("/Normal")
    extgstate = DictionaryObject()
    extgstate[NameObject("/GS1")] = transparency
    page[NameObject("/ExtGState")] = extgstate
    
    # 启用透明度并绘制水印
    canvas.begin_marked_content(NameObject("/GS1"))
    canvas.set_font("Helvetica", 40)  # 设置水印字体和大小
    canvas.set_fill_color("gray")  # 设置水印颜色
    page_width = page.mediabox.width
    page_height = page.mediabox.height
    
    # 调整水印位置:居中旋转45度
    canvas.translate(page_width/2, page_height/2)
    canvas.rotate(45)
    canvas.draw_text(watermark_text, x=-180, y=-25)  # 调整偏移量适配文本长度
    canvas.end_marked_content()
    
    # 将水印合并到原页面
    page.merge_page(canvas.get_page())

# 主逻辑
pdf_path = "input.pdf"
reader = PdfReader(pdf_path)
writer = PdfWriter()

for page in reader.pages:
    # --- 处理文本替换(按需选择上述方案)---
    original_text = page.extract_text()
    if original_text:
        new_text = original_text.replace("text", "test")
        # 这里可以加入方案1或方案2的代码
    
    # --- 添加透明水印 ---
    add_transparent_text_watermark(page, "CONFIDENTIAL", opacity=0.2)
    
    writer.add_page(page)

with open("new.pdf", "wb") as output:
    writer.write(output)

关键注意事项

  • 确保使用**pypdf 3.0+**版本,旧版本API不兼容部分功能。
  • 水印的字体、大小、颜色、位置、旋转角度可根据需求调整。
  • 精准文本替换需要处理不同字体、字号的适配,可能需要额外调试坐标。

内容的提问来源于stack exchange,提问作者david lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:45:32