在Ubuntu上使用ImageMagick将PDF转换为JPEG时出现不匹配的字体问题?

时间:2015-05-06 21:15:45

标签: ubuntu pdf imagemagick

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

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

以下是原始PDF:

enter image description here

字体更薄,更类似于Helvetica。

结果如下:

enter image description here

输出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

1 个答案:

答案 0 :(得分:3)

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

pdffonts the.pdf

如果嵌入了字体,您会在embyes所示的列no中看到。

如果嵌入了 NOT 字体,则会发生这样的事情:PDF渲染器在文件中找不到字体,因此它使用替换字体:

  1. 如果幸运的话,它会在本地系统上找到一个名称相同或类似的页面,并且呈现的页面看起来就像是在查找PDF的制作者(必须有一个使用名称的字体)通过 他的 系统上的PDF。
  2. 如果你更不走运,它会使用不太合适的替换字体,看起来不太好或“不对”。
  3. 如果你非常运气不好,替换根本不起作用,页面看起来像垃圾。
  4. 但是,从观看者到观看者以及从系统到系统,文档很可能看起来不同。因为每个查看器使用不同的算法来替换丢失的字体。

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

    pdffonts -subst the.pdf
    

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

    Acrobat例如 NOT 使用FreeType,但它自己的字体渲染引擎。因此,在Adobe Reader中,您可能会获得不同的替换字体。

    <强>的Ghostscript:

    命令

    gs -h
    

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

    您运行的任何Ghostscript命令都可以通过

    进行修改
    -sFONTPATH=/path/to/dir:/path/to/other/dir
    

    告诉Ghostscript在当前命令的持续时间内在其他目录中查找所需的字体。

    <强> ImageMagick的:

    此命令

    convert -list font
    

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

    更新:(更新后提问)

    非常清楚地说,PDF中没有嵌入四种不同的Intro字体。这是一种非常罕见的字体,当然不会出现在全球使用的前200个PDF中(我应该知道,因为我从网上收集了1.000.000个PDF,目前正在创建一个关于各种属性的统计数据库 - 我不知道那里有一个Intro ......)。

    无论是谁创建了这个PDF,或者哪个软件都这样做了,显然对文档处理没有多少线索。因为必须打开,查看或处理该文档的每个其他系统或用户或应用程序将使用这些字体从其创建者看到的那些字体中看到非常不同的视图。

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

    1. 找到要找到四个Intro字体的目录。
    2. 使用-sFONTPATH=...参数运行Ghostscript命令,如上所述。
    3. 让我重复一遍:

      1. 您不能强制或建议convert使用任何字体将PDF页面渲染为光栅图像。
      2. 这是因为ImageMagick永远不会看到PDF本身。 ImageMagick接收的是一个由Ghostscript生成的光栅图像。
      3. 一旦Ghostscript完成其工作,事故已经发生,并且convert无法在后果中将任何“字体”插入栅格数据。
      4. convert可以使用的字体仅用于其自己的绘图,书写,字幕和注释操作。
      5. 所以你必须直接运行Ghostscript,并提供-sFONTPATH=...参数。
      6. 您必须找到自己,系统中Intro字体系列的位置。抱歉,我不能帮你那样做。
      7. 运行convert -verbose可以让您深入了解ImageMagick如何将Ghostscript用作PDF输入处理的'委托',以及它使用的命令行参数....