使用 PDFtk 和文本编辑器轻松去除 PDF 文件中的文字和图片水印

本文的方法仅供学习交流使用,本人不支持对正版 PDF 进行去除水印以牟利等非法行为.本人只是想看一些文档的时候不要被巨大的水印阻挡了视线,影响阅读体验.

具体方法

  1. 安装 PDFtk,这是个命令行工具.Windows用户请按照官网提示安装.Linux 用户一般使用包管理工具从软件源安装即可,例如 pacman -S pdftkapt install pdftk

  2. 解压要处理的 PDF 文件,PDF 文件默认都是有压缩的,我们需要解压方便我们后续的操作.解压命令 pdftk INPUT.pdf output OUTPUT.pdf uncompress,根据需要替换成你的 PDF 文件名.

  3. 使用文本编辑器编辑 OUTPUT.pdf,不断尝试删除一些元素,并检查 PDF 文件中的水印是否已经出去.建议每次只删除一个元素.这就是个不断尝试的过程.

    1. 针对文字水印,一般是放在一个 /BBox 里,找到对应的 /BBox 之后删除即可.文字水印一般是一个字对应一个 /BBox.此外,还需注意文档中的每一页都有的文字水印,可能还是每一页都有相同的 /BBox.因此,在确认删除特定的 /BBox 之后,我们可以考虑用正则表达式删除全部的 /BBox .例如,我们找到了 /BBox [110.6, 517.8, 199.366, 594.48] 这个是个水印,我们使用正则表达式删除它:sed -i "/394.44 230.64 460.8 295.92/d" OUTPUT.pdf.注意,这里我们假设文字水印在每一页出现的位置都是固定的.如果不是,那就得一页一页的尝试删除了.
    2. 针对图像水印,我们可以尝试删除 pdf 文件中的 obj 对象.在文件中找到类似 5 0 obj 这样的行,其中 5 是 obj 的编号,0 的意义我不太不清楚,但是没有看到其他的取值,删掉该行,看看水印是否还在.不断地尝试,直到水印被删除.

小结

简单来说,本文介绍的去除 PDF 水印的方法就是将 PDF 文件解压后,使用文本编辑器,尝试删除特定的对象,看看是否能够成功去除水印.

需要说明的是,此方法仅仅使得 PDF 文件不显示水印,但是水印的信息还是保存在文件中的.如果需要删除,也许应该删除掉从 5 0 objendobj 的行,这样才是完整的删除了一个对象.而对于文字水印,则应该删除包含该 /BBox 的对象.但是似乎这样会破坏 PDF 文件,导致如果后面使用 PyPDF2 去解析的时候会有些问题.不过这是后话,不是本文的重点,就先忽略了吧.

参考

Removing watermarks from pdfs with pdftk