Ghostscript输出PDF:文本无法复制

时间:2015-05-09 16:42:14

标签: pdf ghostscript postscript

我正在使用TCPDF来创建PDF文件。

因为TCPDF在字体子集中有错误(link to bug),所以 我使用以下Ghostscript命令在TCPDF创建的PDF文件中对字体进行子集化:

gswin64c.exe -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 \
    -dPDFSETTINGS=/prepress -dUseFlateCompression=false -dEmbedAllFonts=true \
    -dSubsetFonts=true -sOutputFile="out.pdf" "input.pdf"

效果很好,缩小了文件大小。但是当我尝试将PDF文件解析为文本时(使用poppler - > pdftotext),或者当我在PDF查看器中打开文件并选择文本时,我会对UTF-8字体进行乱码。

为了在此重现,file before ghostscriptfile after ghostscript

如果您在Adobe Reader中打开文本并将其粘贴到其他地方,您可以看到您可以“在GS之前”复制文件中的文本。但是在第二个文件中,除非你复制英文字符(文件是希伯来语),否则你会得到胡言乱语。

除此之外文件看起来很棒。

您是否知道如何在Ghostscript中保留UTF8字体?

1 个答案:

答案 0 :(得分:1)

是的,不要将字体分组。对字体进行子设置会导致它们被重新编码。因为你的字体没有ToUnicode CMap,所以复制/粘贴只能通过启发式工作(即字符代码必须有意义)在你的情况下,字符代码是或似乎是Unicode,所以你在好运,启发式工作。

一旦你对字体进行了子集,Ghostscript会对它们进行重新编码。所以字符代码不再是Unicode。在没有ToUnicode CMap的情况下,复制/粘贴不再有效。

唯一可以让它工作的方法是不重新编码字体,这意味着你不能使用Ghostscript的pdfwrite设备对它们进行子集化。事实上,因为你使用带有TrueType轮廓的CIDFonts,所以你不能避免对字体进行子集化,所以基本上,这不会起作用。

请记住,Ghostscript的pdfwrite设备不是用来操作PDF文件的工具!

顺便说一下,你的PDF文件有其他问题,它将字体(Tf操作符)缩放为0,并且它有一个BBox表格,其中所有坐标都是0(事实上表格没有内容,如此毫无意义)。这是一个没有ToUnicode CMap的CIDFont的补充。也许您应该考虑使用不同的工具来生成PDF文件。