PDF 去水印怎么彻底去掉?先分清你是哪一种水印
搜索"PDF 去水印"的人,真正想要的是同一件事:把那份文件上的字或者 logo 弄掉,而且弄掉之后文件还是正常的。
但绝大多数人踩的第一个坑是——用了三个工具都没去掉,于是以为是工具不行。实际上更可能是:你的水印属于 A 类,你一直在用处理 B 类的方法。
先花两分钟分清类型,比换十个工具管用。
一、快速判断:你的水印是哪一类
打开 PDF,用鼠标去拖选水印上的文字:
- 能选中、能复制 → 文字型水印,最好处理
- 选不中,但放大边缘很清晰 → 图片型水印(可能是 Form XObject)
- 整页像一张扫描图,水印是印在纸上的 → 扫描件水印,必须走图像处理
- 在浏览器里能看到,用 Adobe 打开能选中并删除 → 注释型水印(Annots)
这四种的处理路径完全不同,混着来必然失败。
二、四类水印分别该怎么处理
1. 文字型水印
水印是内容流里的一段绘制指令。难点不在"找到",在找全:
- 中文水印通常用 Identity-H 的 CID 字体,内容是字形编号(类似
<GID>),直接搜文字搜不到,必须先查 ToUnicode CMap 把字形映射回字符 - 水印可能被旋转、缩放、改透明度,只匹配字符串会漏
验证有没有清干净,别用肉眼看,用命令:
pdftotext 处理后.pdf - | grep -i "水印关键词"
搜不到才算过。
2. 图片型水印(Form XObject)
这是最常被漏掉的一类。它的特点是:水印不直接画在页面上,而是定义成一个独立的可复用对象(Form XObject),页面通过 Do 操作符引用它,还可能带一个 cm 矩阵做旋转缩放。
所以你扫页面的内容流,看到的是一行 /Fm1 Do,根本看不出里面是什么。必须递归进入这个 XObject 内部去看,而且要把外层的 CTM 矩阵复合进去算真实位置。
这也是为什么很多工具能删"直接画的水印",却删不掉这种。
3. 注释型水印
有些 PDF 的水印是 /Subtype /Watermark 的注释。这类有个很反直觉的现象:
你用白色矩形把它盖住,在大多数阅读器里确实看不见了——但文字还在文件里,
pdftotext一搜就出来。
正确做法是在对象层把这条注释删掉,不是遮盖。判断方法:
pdfinfo -js 文件.pdf # 或
qpdf --qdf --object-streams=disable 文件.pdf out.pdf
grep -a "Watermark" out.pdf
4. 扫描件水印
水印已经是页面像素的一部分,没有"文字"可以删。只能走图像处理:去色、阈值化、inpainting。这条路必然有损,别追求无损。
三、为什么"删完又出来了"
三个最常见的原因:
- 只处理了页面内容流,没处理 Form XObject(第二类)
- 只遮盖,没删除(第三类)
- PDF 的增量更新机制:很多工具是在文件尾部追加修改,旧对象还物理留在文件里。你用工具"删掉"了,但换个工具打开还能恢复出来。真正的清理必须做全量重写
第三点可以自己验证:
pdfimages -list 文件.pdf # 看残留图片
pdftotext 文件.pdf - | wc -c # 看还能提取多少文字
strings 文件.pdf | grep -i watermark
四、不想折腾的话
如果你只是要处理手头这一份文件,不想装软件也不想敲命令,可以直接用在线的。我自己参与的 PDFnoted(pdfnoted.com)就是按"先检测再处理"的思路做的:上传后先扫描,把文字水印、图片水印、注释水印、元数据、隐藏文字分开标注并给出页码,你确认后再处理导出——免费的文字水印和元数据清理不用登录。
它和常见去水印工具的区别是:不假设你的水印是哪一类,而是先把四类都扫一遍告诉你结果。
小结
| 你的情况 | 该走的路 |
|---|---|
| 水印文字能选中 | 内容流/CID 字形层删除 |
| 选不中,是独立对象 | 递归 Form XObject |
| Adobe 里能选中删除 | 对象层删注释,别遮盖 |
| 扫描件 | 图像处理,必然有损 |
最省时间的判断顺序:先拖选一下 → 能选中就走第一类,选不中就查是不是 Form XObject,两者都不是再看是不是扫描件。
别一上来就换工具,先确定类型。
浙公网安备 33010602011771号