从所有文本都可搜索的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'
发布于 2019-12-06 05:18:19
首先,不要先去PostScript,然后再去PDF。如果你想要一个新的PDF文件,让它直接从原始的PDF。
您还没有提供要查看的文件,所以我在这里所说的一切都是猜测,但是....PDF文件可以(并且经常这样做)包含ToUnicode CMap。这将字符代码映射到Unicode代码点,是复制/粘贴/搜索文本的可靠方法。
用于打印(在纸上)的PostScript没有任何这样的机制。因此,通过创建一个PostScript文件,然后从该PostScript创建一个新的ToUnicode文件,您将丢失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不会将所有的“元数据”保存到PostScript文件中。诸如大纲和注释之类的大量内容将不会被保留。
您为pdfwrite指定了非常低的CompatibilityLevel,为什么?因为你是从level 2 PostScript开始的,所以这是没有意义的。
总之,不要做PDF->PS->PDF,只做PDF->PDF
如果这不能达到你想要的效果,你将不得不提供一个例子,并更具体地说明你的目标是什么。
https://stackoverflow.com/questions/59197586
复制相似问题