2015-02-09 19 views
0

我正在使用将大.pdf文件拆分为较小部分的工具,并且它使用Ghostscript来减小新生成文件的大小。 今天我运行了这个工具来分割来自itext-paulo-155的pdf,并且所有文件似乎都已经正确创建。然而,当我选择和新的和小.pdf文件的字符复制到文本编辑器,它们都遭到了损坏这样的:Ghostscript 9.15 - 从大.pdf文件中分割出来的文件已损坏

ỘỔỎồỌỐỗ ờ. ỌộỏỌ 
ọχτφσ Ởωχκκω, Ọυω. • Ọσσ Ọχητχ, ỘỔ 
ζσιζς@βςξθν.κιβ • 

我更新了我的ghostscript版本到最新的一个9.15,它仍然发生。我给自己定了以下PARAMS在我的代码:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dBATCH -dQUIET -sOutputFile=

的Ghostscript显然不能支持这种似乎是常见的.pdf文件,他们没有扫描图像。你有什么想法是什么会导致这种奇怪的行为,我该怎么做才能使ghostscript不腐败的字符? 感谢您的帮助。

回答

1

您不是“拆分”PDF文件,而是从原始PDF创建许多全新的PDF文件。 Ghostscript解释PDF文件,产生一系列图形原语,然后pdfwrite设备将这些原语重新组合成一个全新的输出文件。

因为你这样做,你也能适用的处理基本图形控件,例如子集化字体,缩减图像,转换色彩空间等

但文件的输出结果是不与原始文件相同。如果你想分割文件,使用像pdftk或MuPDF这样的东西。这些应用程序将保持数据不变,并将其吐出到新文件中,而Ghostscript则不会。

现在,如果文件在屏幕上正确呈现,它是不是已损坏。可能无法复制和粘贴文本,但这绝不是同一件事。

最可能的问题是,原始PDF文件包含字体中的文本,但没有包含ToUnicode CMap,但它可能包含整个字体,或者至少使用WinAnsiEncoding进行编码。

提供ToUnicode映射,Acrobat和其他查看器可以选择文本。如果没有ToUnicode,那么他们会回到其他启发式方法。如果文本是拉丁语言,并且字体以拉丁编码(例如ascii)编码,则复制和粘贴将起作用。

但是,PDFSETTINGS = /屏幕包含切换到子集字体的子集。一旦字体是子集,它们就不再具有WinAnsi或ASCII编码。遇到的第一个字符是字符代码1,第二个字符代码是2,依此类推。如果有一个ToUnicode CMap,那么这并不重要,因为它仍然可以检索每个字符的Unicode值。但是,如果没有Unicode信息,那么该文本不再处于ASCII值的事实将意味着您不能再可懂地复制/粘贴它。

如果你不想这样做,那么不要启用字体子集化,当然这意味着你将不得不停止使用-dPDFSETTINGS,但是不管怎样,它使用IMO是一个坏主意,因为它设置了一些控件同时大多数人不知道他们已经设置了哪些控制,或者其影响是什么。

+0

感谢您的完整答案。原始.pdf文件具有Identity-H编码。我想知道这是否有所作为。是否有另一种解决方法的文件有这种类型的编码? – mariana 2015-02-10 19:51:42

+0

与编码没有任何关系。正如我已经说过的,它最有可能缺少一个ToUnicode CMap以及一个子集字体指令。如果您不希望发生这种情况,请勿将字体分组。 – KenS 2015-02-11 08:01:54