【问题标题】:Ghostscript output PDF: text can not be copiedGhostscript输出PDF:文本无法复制
【发布时间】:2015-07-20 11:21:00
【问题描述】:

我正在使用 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

如果您在 Adob​​e 阅读器中打开它,复制文本并将其粘贴到其他位置,您可以看到您可以从“GS 之前”的文件中复制文本。但是在第二个文件中,除非你复制英文字符(文件是希伯来语),否则你会得到乱码。

除了文件看起来很棒。

您对如何在 Ghostscript 中保留 UTF8 字体有任何想法吗?

【问题讨论】:

  • 你把你的问题描述得很好,然后你想让我们“重现它”,但不要给我们你的Ghostscript版本?!那么:您使用的是哪个版本? (输出gs -version
  • 我在问题里加了,版本是9.16

标签: pdf ghostscript postscript


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 谢谢...我正在从 TCPDF 转到 mPdf,希望在那里获得更多的运气。 :-)
  • 顺便问一下,你用什么工具检查了我的PDF?我不熟悉 PDF 测试工具。
  • 基本上,我没有。我使用 MuPDF 解压缩 PDF 文件,然后使用文本编辑器(不进行 CR/LF 翻译)阅读它
  • @KenS:为什么你说字体没有“ToUnicode”映射?据我所知,输入和输出文件实际上都有所涉及字体的 ToUnicode 映射。
  • 是的,我在那里太仓促了,PDF 文件很复杂而且结构也很奇怪。我明天再看一遍。不过,拥有一个(更)简单的文件会很方便。
猜你喜欢
  • 2017-02-06
  • 2013-12-22
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多