如何批量移除PDF中重复的可选中文字水印?
批量移除PDF固定位置文字水印的可行方案
原脚本失效的常见原因
你的PyMuPDF脚本未成功,大概率是以下原因之一:
- 文本匹配不精准:水印文字可能存在大小写差异、隐藏字符,或PDF文本编码导致搜索不到目标内容
- 红印应用时机错误:原脚本在每个匹配实例后立即执行
apply_redactions,可能干扰后续文本搜索 - 未指定填充色:默认红印可能未完全覆盖水印,导致残留
方案一:优化文本搜索与红印处理
调整脚本逻辑,确保精准匹配并批量处理红印,同时用白色填充覆盖水印:
import fitz pdf_document = "Gravitation CJM21.pdf" doc = fitz.open(pdf_document) target_text = "PHYSICS" for page_idx in range(len(doc)): page = doc.load_page(page_idx) # 忽略大小写搜索所有匹配的文本区域,返回四边形坐标 matches = page.search_for(target_text, quads=True, case=False) if not matches: print(f"第 {page_idx+1} 页未找到目标水印文本") continue # 批量添加红印注释,指定白色填充 for quad in matches: page.add_redact_annot(quad, fill=(1, 1, 1)) # 一次性应用所有红印,彻底移除文本 page.apply_redactions(flags=fitz.REDACT_FLAGS_REMOVE) # 保存时启用压缩,减小输出文件体积 doc.save("output_cleaned.pdf", garbage=4, deflate=True) doc.close()
方案二:固定位置矩形覆盖(更可靠)
由于水印在每页固定位置,直接用与页面背景色一致的矩形覆盖,无需依赖文本搜索,稳定性更高:
步骤1:获取水印的矩形坐标
先运行以下脚本,查看目标水印的坐标(PDF坐标原点在页面左下角):
import fitz doc = fitz.open("Gravitation CJM21.pdf") page = doc.load_page(0) # 查看第一页的文字坐标 for word in page.get_text("words"): # 输出格式:(左边界, 下边界, 右边界, 上边界, 文字内容) print(f"文字: {word[4]}, 坐标: ({word[0]:.2f}, {word[1]:.2f}, {word[2]:.2f}, {word[3]:.2f})") doc.close()
步骤2:批量覆盖水印
将上一步获取的坐标替换到watermark_rect中,运行脚本:
import fitz pdf_document = "Gravitation CJM21.pdf" doc = fitz.open(pdf_document) # 替换为你实际获取的水印矩形坐标(左, 下, 右, 上) watermark_rect = fitz.Rect(150, 60, 350, 90) for page_idx in range(len(doc)): page = doc.load_page(page_idx) # 绘制白色矩形覆盖水印,overlay=True确保矩形在最上层 page.draw_rect(watermark_rect, color=(1, 1, 1), fill=(1, 1, 1), overlay=True) doc.save("output_fixed.pdf", garbage=4, deflate=True) doc.close()
注意事项
- 若页面背景色不是白色,需将填充色
(1,1,1)替换为对应背景的RGB值 - 使用
garbage=4和deflate=True参数可有效压缩PDF,解决原文件过大的问题 - PyMuPDF处理大文件时内存占用低,无需担心性能问题
内容的提问来源于stack exchange,提问作者Abhinav
相关产品推荐
相关产品推荐

