0

从一个所有文本都可搜索的 pdf 文件开始,我使用以下命令将其转换为一个新的 ps 文件:

gswin64c -q -dSAFER -dNOPAUSE -dBATCH  -sDEVICE=ps2write -dDOPDFMARKS -dLanguageLevel=2 -sOutputFile="new.ps" "old.pdf"

之后,我new.ps使用以下命令将文件转换为 pdf:

gswin64c -q -r400 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite  -dSubsetFonts=false -dAutoRotatePages=/PageByPage -dAutoRot -dCompatibilityLevel=1.2 -sOutputFile="new.pdf" new.ps

在 new.pdf 文件中,我无法搜索文本,尽管一切都是可见的。我怎么解决这个问题?

这就是我正在使用的:GPL Ghostscript 9.20 (2016-09-26)

这是 new.ps 文件的输出:

'https://pastebin.com/HTXZJnKY'
4

1 回答 1

0

首先; 不要转到 PostScript,然后转到 PDF。如果您想要一个新的 PDF 文件,请直接从原始 PDF 制作它。

您还没有提供要查看的文件,所以我在这里所说的一切都是推测,但是.... PDF 文件可以(并且经常)包含 ToUnicode CMap。这会将字符代码映射到 Unicode 代码点,并且是复制/粘贴/搜索文本的可靠方式。

用于打印(在纸上)的 PostScript 没有任何此类机制。因此,通过创建一个 PostScript 文件,然后从该 PostScript 创建一个新的 PDF 文件,如果存在 ToUnicode 信息,您将丢失它。

此外,如果原始文件缺少 ToUnicode,则可能是所使用的字符代码恰好与 ASCII 匹配。ps2write 和 pdfwrite 的默认设置是子集字体。这具有更改字符代码的效果,以便第一个字形获得字符代码 1,第二个字形获得字符代码 2,依此类推。所以 Hello 变成了 0x01, 0x02, 0x03, 0x03, 0x04。

您还使用了 3 年的 Ghostscript 版本。当前版本是 9.50,无论如何您都应该升级到该版本,即使它不会影响这种特殊情况。

你的命令行有问题;您不需要为 ps2write 指定 LanguageLevel=2,这是默认设置。您没有为 ps2write 指定 -dSubsetFonts=false,因此为 pdfwrite 指定它没有意义,损坏是在第一遍中完成的。-dAuoRot不会做任何事情。除非您有充分的理由,否则不应更改分辨率。设置 -dDOPDFMARKS 不会将 PDF 文件中的所有“元数据”保留到 PostScript 文件中。诸如大纲和注释之类的大量内容将不会被保留。

您为 pdfwrite 指定了非常低的 CompatibilityLevel,这是为什么呢?无论如何,这毫无意义,因为您是从 2 级 PostScript 开始的。

总而言之;不要做PDF->PS->PDF,只做PDF->PDF

如果这不能达到你想要的,你将不得不提供一个例子,并更具体地说明你的目标是什么。

于 2019-12-05T21:18:19.150 回答