使用ImageMagick在PHP中将PDF转换为JPG会导致字母间距奇怪

4

我正在尝试使用PHP的exec()调用将PDF转换为JPG,代码如下:

convert page.pdf -resize 716x716 page.jpg

由于某些原因,JPG 文件中的文本显示不正常,尽管在 Acrobat 和 Mac 预览中的 PDF 文件看起来很好。这是原始 PDF 文件:http://whit.info/dev/conversion/page.pdf,而这是糟糕的输出结果:http://whit.info/dev/conversion/page.jpg。服务器使用 PHP 5 和 ImageMagick 6.2.8 构建的 LAMP 栈。你能帮助这个困惑的技术爱好者吗?谢谢!Whit

1
ImageMagick正在使用哪个版本的GS? - Mark Storer
你如何找到GS版本?我可以在phpinfo文件中找到ImageMagick,但找不到GS。 - Whit
1
ImageMagick使用GS来呈现PDF。PHP在IM配置后从不直接操作它。如果您正在运行Windows,则会在程序文件夹中找到它。您应该有一个“gs”文件夹。其中将是一个“ gs#.## ”文件夹。这些#号是版本号。如果已经在您的路径中,您只需在命令行中键入“ gswin32c ”(或对于Unix用户为“ gs”)。 - Mark Storer
我正在Rackspace上的LAMP堆栈上运行它。 - Whit
然后,您可能可以通过在命令行上运行 gs -v 来获取版本。(我使用 gs 8.71 也遇到了同样的问题)。 - John Flatness
2个回答

4

ImageMagick只是调用Ghostscript将此PDF转换为图像。如果在pdf上运行gs,您会得到相同的间距不良的输出。

我怀疑Ghostscript没有很好地处理PDF中嵌入的TrueType字体。如果您可以将输出更改为嵌入Type 1字体或使用“核心”PostScript字体,则会获得更好的结果。


不幸的是,这些字体来自设计师。它们是Adobe字体,在除了这些转换后的图像之外的任何地方都能很好地显示。 - Whit

4
我怀疑这是一个编码/宽度问题。两者都有点偏差,但我无法确定原因。
以下是一些嫌疑人:
第一
文本流以UTF-16 LE方式定义。charNULLcharNULL,使用正常的字符串绘制命令语法:
(some text) Tj
有一种方法可以将任何旧字符值转义为()字符串。您也可以这样定义十六进制字符串: <203245> Tj
没有使用任何方法,只有可疑的内联空值。如果GS试图在没有与之关联的长度的情况下使用指向char的指针,则可能会导致问题。
第二
宽度数组很愚蠢。您可以这样分组定义宽度:
[ 32 [450 525 500] 37 [600 250] 40 [0] ]
这定义了 32: 450 33: 525 34: 500 37: 600 38: 250 40: 0
这些字体将它们的连续宽度定义为单独的数组。不违法,但肯定是浪费/愚蠢的,如果GS编码为期望数组之间存在间隙,则可能会引发错误。
数组中还有一些非常可疑的值。32到126是连续定义的,但然后它开始跳来跳去:...126 [600] 8364 [500] 8216 [222] 402 [500] 8222 [389]. 8230 [1000] 8224 [444]..,然后从160到255再次连续。
很奇怪。
第三
我一点也不确定,但CIDToGIDMap流包含大量null值。
底线
这些字体很可疑。我从未听说过“Bellflower Books”或“UFPDF 0.1”
那个版本号让我感到不安。你也应该感到不安。
在谷歌搜索“UFPDF”时,我找到了作者的这个注释:
注意:我编写UFPDF只是作为一个实验,并不是一个完整的产品。如果您在使用它时遇到问题,请不要向我寻求支持。补丁是受欢迎的,但我没有太多时间来维护它。
UFPDF是一个坐在FPDF上面的PHP库。0.1。快跑。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接