作者花了几个月构建一个 PDF 编辑器,发现"改一个词、其余不动"这个看似最简单的功能最耗时间。核心原因是一个 PDF 并不存储文本,只存储绘图指令——一行字是带字距调整的碎片序列,文件里根本没有"Welcome"这样的字符串,所谓段落与行都是读文件的人推断出来的。因此查找替换不是字符串操作,而是从定位的字形重建逻辑文本、找出目标、再绘制出看起来本来就存在的新内容。作者还踩过一个坑:测试文件用干净字库生成的假用例永远通过,下载真实 arXiv 论文却立刻失败——真实文档里的字体命名(如 Times 克隆叫 NimbusRomNo9L,不含"roman")根本不在假设里。
🔑 核心要点
PDF 存储的是绘图指令而非文本,一行字是带字距调整的碎片序列,文件里根本没有字符串概念。
要让替换"隐形",需要恢复原始字体、字号、基线和颜色,而这四样几乎都无法可靠获取。
真实文档里的字体命名(如 LaTeX 的 Times 克隆叫 NimbusRomNo9L)不含关键词"roman",导致用假用例测过的代码在真实文档上必然失败。
PDF 通常只嵌入已用到字形的字体子集,若要替换的词需要文档里没有的字形,就必须用外观相近的备用字体兜底。