Ghostscript 输出 PDF:无法复制文本

Ghostscript output PDF: text can not be copied

我正在使用 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 查看器和 select 文本中打开文件时,我在 UTF-8 字体上出现乱码。

为了在此处重现它是 file before ghostscript and file after ghostscript

如果你在Adobe中打开它reader复制文本并粘贴到其他地方,你可以看到你可以从文件"before GS"复制文本。但是在第二个文件中你会得到乱码,除非你复制英文字符(文件是希伯来语)。

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

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

是的,不要子集字体。子集字体会导致它们被重新编码。因为你的字体没有 ToUnicode CMap,所以 copy/paste 只能通过启发式方法工作(即字符代码必须有意义)在你的情况下,字符代码是,或者看起来是,Unicode,所以你在运气好,启发式工作。

一旦您对字体进行子集化,Ghostscript 就会对其重新编码。所以字符代码不再是 Unicode。在没有 ToUnicode CMap 的情况下,copy/paste 不再有效。

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

请记住,Ghostscript 的 pdfwrite 设备并非旨在用作处理 PDF 文件的工具!

顺便说一下,您的 PDF 文件还有其他问题,它将字体(Tf 运算符)缩放为 0,并且它有一个 BBox 用于所有坐标为 0 的表单(实际上表单没有内容,毫无意义)。这是对没有 ToUnicode CMap 的 CIDFont 的补充。也许您应该考虑使用其他工具来生成 PDF 文件。