如何使用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
相关产品推荐
相关产品推荐

