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

在Ubuntu上使用ImageMagick将PDF转换为JPEG时出现字体不匹配问题?,ubuntu,pdf,imagemagick,Ubuntu,Pdf,Imagemagick,我正在使用此命令将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

我正在使用此命令将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.
重影脚本版本为:

$ gs --version
9.10
我的问题是

1) 我如何解决这个问题

2) 我如何知道PDF文件使用的是什么字体

3) 我如何知道哪些字体可用于
convert
gs

编辑:找到问题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

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

pdffonts the.pdf
如果嵌入字体,您将在
emb
列中看到
yes
no
指示

如果字体未嵌入,则会发生如下情况:PDF渲染器在文件中找不到该字体,因此它使用替换字体:

  • 如果幸运的话,它会在本地系统中找到一个名称相同或相似的页面,呈现的页面看起来就像是在寻找PDF的制作人(他必须在他的系统上有一个与PDF使用的名称相同的字体)
  • 如果你更不走运,它会使用一种不太合适的替代字体,看起来也不太好或“正确”
  • 如果您非常不幸,那么替换根本不起作用,页面看起来像垃圾
  • 但是,不同的浏览者,不同的系统,文档的外观很可能会有所不同。因为每个查看器使用不同的算法来替换丢失的字体

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

    pdffonts -subst the.pdf
    
    将报告可能使用的替代字体。由于Poppler库
    pdffonts
    基于使用FreeType作为其字体引擎,因此所报告的替换字体可能对同样使用FreeType的每个查看器都有效

    例如,Acrobat不使用FreeType,而是使用自己的字体渲染引擎。所以在AdobeReader中,您可能会得到不同的替换字体


    鬼脚本:

    命令

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

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

    -sFONTPATH=/path/to/dir:/path/to/other/dir
    
    告诉Ghostscript在当前命令执行期间在其他目录中查找所需字体

    ImageMagick:

    此命令

    convert -list font
    
    将报告ImageMagick在系统上找到的所有字体


    更新:(更新问题后) 很明显,PDF中没有嵌入四种不同的
    Intro
    字体。这是一种非常不常见的字体,当然不在全球PDF使用的前200名中(我应该知道,因为我已经从网络上收集了1000.000 PDF,目前正在创建一个关于其各种属性的统计数据库——我没有一个
    简介

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

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

  • 找到四种
    Intro
    字体所在的目录
  • 如上所述,使用
    -sFONTPATH=…
    参数运行Ghostscript命令

  • 让我再次重申:

  • 您不能强制或建议
    转换
    以使用任何字体将PDF页面呈现为光栅图像
  • 这是因为ImageMagick从未看到PDF本身。ImageMagick接收的是由Ghostscript生成的光栅图像
  • 一旦Ghostscript完成工作,事故就已经发生了,
    convert
    无法在随后的光栅数据中插入任何“字体”
  • convert
    可以使用的字体仅用于自己的绘图、书写、字幕和注释操作
  • 因此,您必须直接运行Ghostscript,并提供
    -sFONTPATH=…
    参数
  • 您必须了解自己,
    Intro
    font系列在您的系统中的位置。对不起,我不能帮你

  • 运行
    convert-verbose
    将让您了解ImageMagick是如何使用Ghostscript作为PDF输入处理的“委托”的,以及它使用了哪些命令行参数……

    我这里描述了一个类似的问题,您知道如何解决它吗?哦,是的。那么你的问题的解决方案当然与上面描述的解决方案相似。。。
    convert -list font