使用PHP中的ImageMagick将PDF转换为JPG会产生奇数字母间距

使用PHP中的ImageMagick将PDF转换为JPG会产生奇数字母间距,php,pdf,imagemagick,exec,jpeg,Php,Pdf,Imagemagick,Exec,Jpeg,我正在尝试使用PHPexec()调用将PDF转换为JPG,如下所示: convert page.pdf -resize 716x716 page.jpg 出于某种原因,尽管PDF在Acrobat和Mac预览版中看起来还不错,但JPG还是发布了janky文本。以下是原始PDF: 这是janktastic的输出: 服务器是一个包含PHP5和ImageMagick 6.2.8的LAMP堆栈 你能帮助这个被难倒的极客吗 提前感谢, WhitImageMagick将调用Ghostscript将此PD

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

convert page.pdf -resize 716x716 page.jpg
出于某种原因,尽管PDF在Acrobat和Mac预览版中看起来还不错,但JPG还是发布了janky文本。以下是原始PDF:

这是janktastic的输出:

服务器是一个包含PHP5和ImageMagick 6.2.8的LAMP堆栈

你能帮助这个被难倒的极客吗

提前感谢,


Whit

ImageMagick将调用Ghostscript将此PDF转换为图像。如果在pdf上运行
gs
,则会得到相同的间隔不正确的输出


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

我怀疑这是编码/宽度问题。两者都有点不对劲,尽管我不知道为什么

以下是一些嫌疑犯:

首先

文本流在UTF-16 LE中定义。CHARNULCHARNULL,使用普通字符串绘图命令语法:

(一些文本)Tj

有一种方法可以将任何旧字符值转义为()字符串。也可以用十六进制定义字符串:

Tj

这两种方法都不使用,只使用有问题的内联空值。如果GS试图使用指向char的指针而不使用与它们相关联的长度,那么这可能会在GS中引起问题

宽度数组是哑的。您可以在组中定义宽度,因此:

[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流包含大量空值

底线

那些字体很可疑。我从来没有听说过“钟花图书”或“UFPDF 0.1”

那个版本号让我很害怕。这也会让你畏缩

在谷歌搜索“UFPDF”时,我从作者那里找到了这张便条:

注意:我写UFPDF是作为一个实验,而不是作为一个成品。如果您在使用它时遇到问题,请不要打扰我寻求支持。虽然补丁是受欢迎的,但我没有太多时间来维护它。
UFPDF是一个PHP库,位于FPDF之上。0.1. 快跑。

imagemagick使用的是什么版本的GS?如何定位GS版本?我可以在phpinfo文件中找到ImageMagick,但不能在GS中找到。ImageMagick使用GS渲染PDF。一旦配置了IM,PHP就不会直接接触它。如果您正在运行windows,则可以在“程序文件”文件夹中找到它。你应该有一个“gs”文件夹。在那将是一个“gs#.###”文件夹。那些是版本号。如果它已经在您的路径中,您可以在命令行中键入“gswin32c”(或者unixy的人可以键入gs)。我正在Rackspace的灯堆上运行它。然后您可能可以通过在命令行上运行
gs-v
来获取版本。(我看到了与gs 8.71相同的问题)。不幸的是,这些是设计师提供的字体。它们是Adobe字体,除了这些转换后的图像外,在任何地方都能很好地显示出来。