使用 imagemagick 将 pdf 转换为图像并且缺少字体时指定默认替换字体

Specify default substitution font when converting pdf to image using imagemagick and font is missing

我在我的服务器上使用基于 ghost 脚本和 imagemagick 的 Spatie/pdfToImage

  1. 使用 mailgun 路由从电子邮件中获取多页 pdf。
  2. 将 pdf 保存在文件夹 /docs_pdf 中,如 file.pdf
  3. 使用 foreach 遍历每个页面并将每个页面保存为 png 到 /docs,如 file_#.png

我在本地使用 laravel -> 代客一切正常。

在我的服务器上通过 laravel 使用数字海洋在瑞典语 t运行s 形式的多页 pdf 中伪造语言,从普通瑞典语到一堆 运行dom 字母和迹象。

左边是正确的(没错,是瑞典语)右边是错误的:

有人向我建议,这可能是服务器上缺少字体的问题。 pdf中使用的字体:

<</StemV 68/FontName/PSQHMO+FoundrySans-Normal/FontFile2 216 0 R/FontStretch/Normal/FontWeight 400/Flags 32/Descent -240/FontBBox[-40 -240 960 916]/Ascent 916/FontFamily(FoundrySans-Normal)/CapHeight 667/XHeight 465/Type/FontDescriptor/ItalicAngle 0>>
<</StemV 100/FontName/MLHPWU+FoundrySans-Medium/FontFile2 217 0 R/FontStretch/Normal/FontWeight 400/Flags 32/Descent -241/FontBBox[-42 -241 1008 916]/Ascent 916/FontFamily(FoundrySans-Medium)/CapHeight 667/XHeight 470/Type/FontDescriptor/ItalicAngle 0>>
<</StemV 68/FontName/SUEECI+FoundrySans-Normal/FontFile2 218 0 R/FontStretch/Normal/FontWeight 400/Flags 4/Descent -240/FontBBox[-40 -240 960 916]/Ascent 916/FontFamily(FoundrySans-Normal)/CapHeight 667/XHeight 465/Type/FontDescriptor/ItalicAngle 0>>
<</StemV 48/FontName/KIDDUY+FoundrySans-Light/FontFile2 9 0 R/FontStretch/Normal/FontWeight 400/Flags 32/Descent -248/FontBBox[-28 -248 978 924]/Ascent 924/FontFamily(FoundrySans-Light)/CapHeight 667/XHeight 458/Type/FontDescriptor/ItalicAngle 0>>

imagemagick 和 ghostscript 字体配置如下: https://www.imagemagick.org/script/resources.php

如何解决?

更新:

我现在已经在新服务器上进行了全新安装。

已安装 Imagick 和 spatie/pdfToImage

根据 KenS 我的建议 运行

gs -sDEVICE=png16m -o out%d.png

终端输出

forge@Server:~/app/storage/app/public/files$ gs -sDEVICE=png16m -o test_out%d.png file.pdf
GPL Ghostscript 9.22 (2017-10-04)
Copyright (C) 2017 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 2.
Page 1
Page 2

文档呈现相同 = 错误。

我完全不知所措..不知道下一步会是什么..

更新2:

我也运行 convert imagemagick commando 和 img 也以同样的方式渲染。

所以即使我用 ghostscript solo、imagemagick 或 spatie/pdfToImage 来做,它也会给我相同的输出

好吧,当前版本的 Ghostscript (9.25) 对我来说是可以接受的;那就是文本似乎是正确的。所有的字体都是嵌入的,所以应该不会有任何问题。

这意味着即使您确实替换了默认字体替换,也无济于事,因为 Ghostscript 不应该使用默认字体,它会使用 PDF 文件中嵌入的字体。

不知道你使用的是什么版本的 Ghostscript(我从后来的评论中看到它是 9.25),或者用于启动它的命令行,我真的不能做一个类似的比较.不过,我很难看出你怎么会得到如此不同的结果。看起来 Ghostscript 找不到嵌入的字体。

您使用的任何软件包都可能做了一些事情 'unfortunate'。 Linux 上的各种包维护者添加了他们自己的补丁,有时会修改 Ghostscript 的构建方式。可能那东西坏了。

如果您能够自己构建 Ghostscript,您可以尝试克隆我们的 Git 存储库并执行此操作。您也可以尝试从我们的网站下载 Linux 二进制文件。它们不适用于每个 Linux 发行版(不同的 ABI),但你可以尝试,你可能很幸运。

您也可以直接在 PDF 文件上尝试 运行 Ghostscript。类似于:

gs -sDEVICE=png16m -o out%d.png

应该生成 2 个 PNG 文件,out1.png 和 out2.png。它还会在终端上产生一堆东西。那个后台通道输出对我来说是有价值的信息,所以如果你能重现这个问题,我也想看看。

最后一个想法;可能同时安装了多个版本的 Ghostscript,可能您当前的设置使用的是旧版本的 Ghostscript。

我无法在 ImageMagick 或 Spatie 方面为您提供帮助,但如果您可以将它们调试到可以使用普通 Ghostscript 命令行重现问题的程度,那么我可以进一步研究它。

终于成功了。我想首先赞扬 KenS,他真的帮助了我,没有他,这一切都不会成功。

这是我做的:

1 - 我删除了 Ghostscript:

sudo apt-get purge --auto-remove ghostscript

然后

wget https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs925/ghostscript-9.25.tar.gz

tar xvf ghostscript-9.25.tar.gz

进入解压后的文件夹,执行

./configure

make

make install

然后

sudo ln -s /usr/local/bin/gs /usr/bin/gs

在上面我做了:

sudo add-apt-repository ppa:glasen/freetype2

然后:

sudo apt update && sudo apt install freetype2-demos