![如何将 PDF 转换为 ASCII Postscript 以便可以搜索/替换其中包含的文本?](https://linux22.com/image/1279750/%E5%A6%82%E4%BD%95%E5%B0%86%20PDF%20%E8%BD%AC%E6%8D%A2%E4%B8%BA%20ASCII%20Postscript%20%E4%BB%A5%E4%BE%BF%E5%8F%AF%E4%BB%A5%E6%90%9C%E7%B4%A2%2F%E6%9B%BF%E6%8D%A2%E5%85%B6%E4%B8%AD%E5%8C%85%E5%90%AB%E7%9A%84%E6%96%87%E6%9C%AC%EF%BC%9F.png)
根据《PostScript 语言参考,“PostScript 语言有三种编码:ASCII、二进制标记和二进制对象序列”。
我们已经使用 PrinceXML 从 HTML/CSS 生成 PDF 文件一段时间了。最近,在与另一家公司合作时出现了一个新需求,需要将我们的 PDF 文件内容转换为 Postscript。当使用 pdf2ps、pdftops、a2ping 或其他工具通过命令行将 PDF 转换为 PS 时,生成的 PS 文件似乎具有二进制编码之一,因为无法搜索文本。
我们在印刷前几天交付 PS 文件,事先不知道印刷日期,但根据要求,需要打印印刷日期。因此,我们需要插入一个日期占位符 (##.##.####),印刷时会自动替换该占位符。
如果我们在 HTML/CSS 表示中插入该占位符,则无法在 postscript 文件的内容中搜索它,因此无法在打印之前将其替换为当前日期。
是否有人知道如何将 PDF 转换为 ASCII PostScript,以便可以搜索和替换其中包含的文本?
答案1
我对 pd2fps 没什么好感。
使用与 poppler 捆绑在一起的 pdftops 版本 0.12.4,我可以在 PS 代码中找到文本,但一次只能找到一个单词(每个单词都用括号括起来)。
例如下载
wget ctan.org/tex-archive/macros/latex/contrib/lipsum/lipsum.pdf
pdftops lipsum.pdf
sed 's;2011/;2012/;' lipsum.ps > lipsum2.ps
这会将年份(位于文件开头)从 2011 更改为 2012,但请注意,因为您不能总是简单地更改文本,根据 PS 代码的结构,可能没有足够的空间来替换文本。尝试将前面的示例用 2013 代替 2012,您就会明白。
我不懂 postscript,但我怀疑某些转换可能会导致部分二进制和部分文本文件,如果是这样,请尝试使用 sed,它将保留非文本字节。
答案2
另一个解决方案是修改原始 pdf,使日期以表格形式显示,然后使用 flpsed 进行填充!请在此处查看:http://freshmeat.net/projects/flpsed