【问题标题】:Ghostscript: convert PDF to EPS with embeded font rather than outlined curveGhostscript:使用嵌入字体而不是轮廓曲线将 PDF 转换为 EPS
【发布时间】:2015-04-20 23:25:48
【问题描述】:

我使用以下命令将 PDF 转换为 EPS:

gswin32 -dNOCACHE -dNOPAUSE -dBATCH -dSAFER -sDEVICE=epswrite -dLanguageLevel=2 -sOutputFile=test.eps -f test.pdf

然后我使用以下命令将 EPS 转换为另一个 PDF (test2.pdf) 以查看 EPS 图。

gswin32 -dSAFER -dNOPLATFONTS -dNOPAUSE -dBATCH -dEPSCrop -sDEVICE=pdfwrite -dPDFSETTINGS=/printer -dCompatibilityLevel=1.4 -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true -sOutputFile=test2.pdf -f test.eps

我发现生成的 test2.pdf 中的文本已转换为轮廓曲线。也没有嵌入字体了。

是否可以在不将文本转换为轮廓的情况下将 PDF 转换为 EPS?我的意思是,嵌入字体和文本的 EPS。

同样经过转换(test.pdf -> test.eps -> test2.pdf),PDF图(test2.pdf)的高宽比原PDF(test.pdf)小了一点:

test.pdf:

test2.pdf:

转换后可以保持图形的宽高吗?

这里是test.pdf:https://dl.dropboxusercontent.com/u/45318932/test.pdf


我尝试了 KenS 的建议:

gswin32 -dNOPAUSE -dBATCH -dSAFER -sDEVICE=eps2write -dLanguageLevel=2 -sOutputFile=test.eps -f test.pdf
gswin32 -dSAFER -dNOPLATFONTS -dNOPAUSE -dBATCH -dEPSCrop -sDEVICE=pdfwrite -dPDFSETTINGS=/printer -dCompatibilityLevel=1.4 -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true -sOutputFile=test2.pdf -f test.eps

我可以看到转换后的 test2.pdf 有很奇怪的字体:

这与 test.pdf 中的原始字体不同:

当我从 test2.pdf 复制文本时,我只得到几个符号,例如:

✕ ✖ ✗✘✙ ✚✛

这里是test2.pdf:https://dl.dropboxusercontent.com/u/45318932/test2.pdf

我使用的是最新的 Ghostscript 9.15。那么问题出在哪里?

【问题讨论】:

    标签: pdf converter ghostscript eps


    【解决方案1】:

    我刚刚注意到您正在使用 epswrite,您不想这样做。该设备很糟糕,已被弃用(现在已删除)。请改用 eps2write 设备(您需要相对较新的 Ghostscript 版本)。

    除了扔掉它之外,你对 epswrite 无能为力,它会生成可怕的 EPS 文件。无论您将 -dLanguageLevel 设置为什么,它也无法制作 2 级文件

    哦,不要使用 -dNOCACHE,它会阻止处理字体并将所有内容分解为轮廓或位图。

    更新

    您将子集字体设置为 true。通过这样做,所使用的字符代码或多或少是随机的。文档中的第一个字形(例如“Hello World”中的“H”)获得代码 1,第二个字形(例如“e”)获得代码 2,依此类推。

    如果您有一个 ToUnicode CMap,那么 Acrobat 和其他阅读器可以将这些字符代码转换为 Unicode 代码点,而读者不必依赖启发式方法,最后一个是“将其视为 ASCII”。因为编码安排不是 ASCII,所以你会得到乱码。 MS Windows 的 PostScript 输出可以包含额外的 ToUnicode 信息,但这不是我们试图在 ps2write 中模仿的东西。毕竟,大概你已经有一个 PDF 文件了....

    每次您进行转换时,都会冒着这种退化的风险,您应该真正尝试在您的工作流程中尽量减少这种情况。

    在这种情况下问题更严重,输入的 PDF 文件具有 TrueType CID 字体。基本语言级别 2 PostScript 无法处理 CIDFonts(IIRC 这是在 2015 版中引入的)。由于 eps2write 仅发出基本级别 2,因此它不能将字体写入 CIDFont。因此,它会捕获字形轮廓并将它们存储在 type 3 字体中。

    但是,我们的 EPS/PS 输出不会尝试在 PostScript 中嵌入 ToUnicode 信息(它的非标准,很少有应用程序可以使用它,因此它会使文件变大而没有什么好处)。此外,CIDFonts 使用多个(2 个或更多)字节作为字符代码,因此无法将 type 3 字体编码为 ASCII。

    如果输入包含 CIDFonts,基本上你不能使用 Ghostscript 去 PDF->PS->PDF 并且仍然能够复制/粘贴/搜索文本。

    顺便说一句,设置 -dLanguageLevel 根本没有意义。 eps2write only 创建 2 级输出。

    【讨论】:

    • 我尝试了你的建议,但得到了非常奇怪的结果。详细信息在我的问题中更新。可以看看吗?
    • 所以问题出在文件中使用的CID字体?是因为我在图中嵌入了 CID 字体的符号 (µ) 吗?如何获得 CID 字体并使用普通字体?
    • 它的 CIDFonts 导致了问题,是的。为了将它们嵌入到 PostScript (EPS) 文件中,您需要比 GS 当前支持的输出更高级别的 PostScript。我建议避免使用 CIDFont 的唯一方法是不使用 TrueType 字体。生成 PDF 文件的任何东西都将 TrueType 字体嵌入为 CIDFonts。
    • 但我真的不得不说,往返 (PDF->PS->PDF) 在一般情况下总是会引入一些功能损失。鉴于 PDF 和(尤其是)PostScript 都不是可编辑的,搜索/复制/粘贴始终是运气问题。
    猜你喜欢
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 2010-10-21
    • 2021-06-20
    • 1970-01-01
    • 2012-06-26
    相关资源
    最近更新 更多