出于各种原因,我在工作中常常需要去除 PDF 文件中的水印。此水印,特指“watermark”,既非以标注格式浮于 PDF 页面的文本,这种情况,在多数阅读器中可当即移除,毫无技术难度;也非和正文融为一体、展平后的图像,这种情况恐怕只能期待人工智能有所表现。
在技术上,这些水印其实是难以直接编辑的文本层。如果你把 PDF 视作一场皮影戏,或者回忆一下 Photoshop 中分图层的编辑界面,那么 PDF 大约也有类似的分层构造,而那些顽固的水印也只是其中的一层。问题在于,文本层形式的水印通常不能直接删除,要么得去一些很吊诡的软件里碰运气,看看有没有擦除功能;要么一步到位,怒斥重金买下万能 PDF 编辑工具 Adobe Acrobat Pro,但问题都在于,你可能得用橡皮擦一点一点扣掉它们,非常浪费世界。
但如果转换视角,避免在“移除水印”的功能主义小道上走到黑,转向材料思维,将 PDF 作为一种材料,追问消除水印背后的对象和原理,则不难找到更简单的方法,并且可以一次性、批量、瞬间移除水印。本文介绍一简一繁两种方案,供诸位参考。
极简方案:线性化(linearized)
如前文所述,PDF 文件中其实没有“水印”这个对象,有的只是文本层。那么,若破坏文本层,岂不就能消灭水印?这一思路完全可行,并且不需要任何特殊的工具,例如在 macOS 上,原生的预览工具就能完成:打开 PDF 文件并直接导出,同时选中线性化(linearized)。
所谓线性化,乃一种令 PDF 元素逐步加载的技术,通常用于在线呈现 PDF,如此处理后,无需等待 PDF 下载完成,即可像浏览普通网页一样看一点、加载一点。此技术有大量副作用,往往导致元素显示异常,实际上,我几乎不曾见过哪个网站在使用线性化的 PDF,无论上市公司的财报还是政府官方的文件,我印象中几乎全是普通的 PDF。
——然而,若是巧妙利用线性化的破坏效果,其实可以一口气消灭水印!预览工具的线性化效果正好可以移除文字层,对于扫描版 PDF 来说,这基本意味着消灭了水印,并且不会触及图像和标注等内容。
惟需注意,若文件本身有 OCR 文字层,则也会遭到牵连,尚需在处理后重新识别文本。
Ghostscript 方案
线性化方案终归属于歪打正着,万一哪天 Apple 突发奇想优化了预览工具的线性化功能,锉钝了这把利刃,上一节的方案反倒会失效。此外,我也不能保证其他 PDF 阅读器的导出效果与预览工具一致。
本节介绍另一种思路:依托瑞士军刀式的 PDF 处理工具 Ghostscript,精确移除文本层,而非简单将其破坏。Ghostscript 是一款命令行工具,并无直观的图形界面,但恰好移除水印正需要一键式的操作,不妨在稍稍掌握 Ghostscript 命令后将其打包为自动化动作(稍后附下载链接)。
以下 Ghostscript 命令可以指定移除 PDF 中的文本层,但理论上不影响其他内容:
gs -o "处理后.pdf" -sDEVICE=pdfwrite -dFILTERVECTOR -dFILTERTEXT "处理前.pdf"
Ghostscript 方案有的放矢,且不依赖原理未知的封闭软件(比如上一节所依托的预览工具),将来系统升级时或许更
