【问题标题】:Mismatched font issue when converting PDF to JPEG using ImageMagick on Ubuntu?在 Ubuntu 上使用 ImageMagick 将 PDF 转换为 JPEG 时出现不匹配的字体问题?
【发布时间】:2015-05-06 21:15:45
【问题描述】:

我正在使用此命令将 PDF 转换为一组 JPEG 文件:

convert -strip -quality 100 -alpha off \
        -density 165% -scene 1 tmp3GtW_h.pdf /tmp/a1.jpg

这是原始 PDF:

字体更细,更类似于 Helvetica。

结果如下:

输出的 JPEG 文件中的字体不同且更粗。

convert 命令显示此警告:

   **** Warning:  An error occurred while reading an XREF table.
   **** The file has been damaged.  This may have been caused
   **** by a problem while converting or transfering the file.
   **** Ghostscript will attempt to recover the data.

   **** This file had errors that were repaired or ignored.
   **** The file was produced by: 
   **** >>>> Microsoft? PowerPoint? 2013 <<<<
   **** Please notify the author of the software that produced this
   **** file that it does not conform to Adobe's published PDF
   **** specification.

转换的版本是:

$ convert --version
Version: ImageMagick 6.8.9-7 Q16 x86_64 2014-12-30 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2014 ImageMagick Studio LLC
Features: DPC OpenMP
Delegates: jng jpeg png x xml zlib

Ghostscript 版本是:

$ gs --version
9.10

我的问题是

1) 我该如何解决这个问题?

2) 如何判断PDF文件使用的是什么字体?

3) 我如何知道convertgs 可以使用哪些字体?

编辑:找到问题 2 的答案。这是pdffonts 命令的结果:

name                                 type              encoding         emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
Intro Black Italic                   Type 1            WinAnsi          no  no  no     145  0
Intro Regular                        Type 1            WinAnsi          no  no  no     147  0
Intro Black Inline Caps              Type 1            WinAnsi          no  no  no     388  0
ABCDEE+Segoe UI                      TrueType          WinAnsi          yes yes no    2233  0
ABCDEE+Segoe UI,Italic               CID TrueType      Identity-H       yes yes yes   2607  0
ABCDEE+Segoe UI,Italic               TrueType          WinAnsi          yes yes no    2612  0
Intro Bold Italic                    Type 1            WinAnsi          no  no  no    3781  0

【问题讨论】:

    标签: ubuntu pdf imagemagick


    【解决方案1】:

    如果您想了解有关 PDF 文档使用的字体的所有相关详细信息,请使用

    pdffonts the.pdf
    

    如果嵌入了字体,您会在emb 列中看到yesno

    如果字体嵌入,就会发生如您所见的情况:PDF 渲染器在文件中找不到该字体,因此它使用替代字体:

    1. 如果幸运的话,它会在本地系统上找到具有相同或相似名称的文件,并且呈现的页面看起来就像是在寻找 PDF 的生产者(他必须有使用名称的字体由他的系统上的PDF)。
    2. 如果你比较倒霉,它会使用一种不太合适的替换字体,而且看起来不好看也不“正确”。
    3. 如果您非常不走运,替换根本不起作用,页面看起来像垃圾。

    但文档的外观很可能因查看器和系统的不同而不同。因为每个查看器使用不同的算法来替换缺失的字体。

    pdffonts 命令具有-subst 参数。所以

    pdffonts -subst the.pdf
    

    将报告,可以使用哪些替代字体。由于 Poppler 库 pdffonts 基于使用 FreeType 作为其字体引擎,因此报告的替换字体可能对所有使用 FreeType 的查看器都有效。

    例如,Acrobat 使用 FreeType,但它自己的字体渲染引擎。所以在 Adob​​e Reader 中你可能会得到不同的替换字体。


    Ghostscript:

    命令

    gs -h
    

    将报告(除其他事项外)它将使用哪些目录作为其搜索字体的路径。

    你运行的任何 Ghostscript 命令都可以修改

    -sFONTPATH=/path/to/dir:/path/to/other/dir
    

    告诉 Ghostscript 在当前命令执行期间在其他目录中查找所需的字体。

    ImageMagick:

    这个命令

    convert -list font
    

    将报告 ImageMagick 在系统上找到的所有字体。


    更新:(更新问题后)

    非常清楚,PDF 中没有嵌入四种不同的Intro 字体。这是一种非常罕见的字体,肯定不在全球 PDF 中使用的前 200 种字体中(我应该知道,因为我已经从网络上收集了 1.000.000 个 PDF,并且目前正在创建一个关于它们的各种属性的统计数据库——我没有那里没有一个Intro...)。

    创建该 PDF 的人或创建该 PDF 的任何软件显然对文档处理一无所知。因为必须打开、查看或处理该文档的所有其他系统或用户或应用程序使用这些字体看到的页面视图将与创建者看到的完全不同。

    为了将此 PDF 处理成图像,您不应依赖 ImageMagick,而应直接运行 Ghostscript:

    1. 找到四个Intro字体所在的目录。
    2. 如上所述,使用 -sFONTPATH=... 参数运行 Ghostscript 命令。

    让我再重复一遍:

    1. 您不能强制或建议convert 使用任何字体将 PDF 页面呈现为光栅图像。
    2. 这是因为 ImageMagick 永远无法看到 PDF 本身。 ImageMagick 接收的是由 Ghostscript 生成的光栅图像。
    3. Ghostscript 完成工作后,事故已经发生,convert 无法在之后将任何“字体”插入到栅格数据中。
    4. convert 可以使用的字体仅用于自己的绘图、书写、字幕和注释操作。
    5. 因此您必须直接运行 Ghostscript,并提供 -sFONTPATH=... 参数。
    6. 您必须自己找出Intro 字体系列在您的系统上的什么位置。抱歉,我不能为你这样做。

    运行 convert -verbose 将让您了解 ImageMagick 如何准确地使用 Ghostscript 作为其 'delegate' 进行 PDF 输入处理,以及它使用哪些命令行参数......

    【讨论】:

    • 我这里也有类似的问题,你知道怎么解决吗? stackoverflow.com/questions/52407788/…
    • 哦,是的。那么你的问题的解决方法当然和上面介绍的解决方法差不多……
    猜你喜欢
    • 1970-01-01
    • 2015-09-05
    • 2012-03-02
    • 2016-07-13
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    相关资源
    最近更新 更多