【问题标题】:Converting a PDF to JPG with ImageMagick in PHP Gives Odd Letter Spacing在 PHP 中使用 ImageMagick 将 PDF 转换为 JPG 会产生奇怪的字母间距
【发布时间】:2011-07-13 05:44:04
【问题描述】:

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

convert page.pdf -resize 716x716 page.jpg

由于某种原因,尽管 PDF 在 Acrobat 和 Mac Preview 中看起来还不错,但 JPG 会出现乱码。这是原始PDF:

http://whit.info/dev/conversion/page.pdf

这是 janktastic 输出:

http://whit.info/dev/conversion/page.jpg

服务器是一个带有 PHP 5 和 ImageMagick 6.2.8 的 LAMP 堆栈。

你能帮助这个难倒的 Geek 吗?

提前致谢,

惠特

【问题讨论】:

  • imagemagick 使用的是什么版本的 GS?
  • 如何定位GS版本?我可以在 phpinfo 文件中找到 ImageMagick,但找不到 GS。
  • imageMagick 使用 GS 渲染 PDF。一旦配置了 IM,PHP 就不会直接接触它。如果你正在运行 Windows,你会在你的程序文件夹中找到它。您应该有一个“gs”文件夹。这将是一个“gs#.##”文件夹。那些 # 是版本号。如果它已经在你的路径中,你可以在命令行中输入“gswin32c”(或者 gs 给你 unixy 的人)。
  • 我在 Rackspace 的 LAMP 堆栈上运行它。
  • 那么您可能可以通过在命令行上运行gs -v 来获取版本。 (我看到与 gs 8.71 相同的问题)。

标签: php pdf imagemagick exec jpeg


【解决方案1】:

我怀疑是编码/宽度问题。两者都有点偏差,但我不知道为什么。

这里有一些嫌疑人:

第一

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

(some text) Tj

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

<203245> Tj

两种方法都没有使用,只是有问题的内联空值。如果 GS 尝试使用指向 char 的指针而没有与之关联的长度,这可能会导致 GS 出现问题。

第二

widths 数组是愚蠢的。因此,您可以按组定义宽度:

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

底线

那些字体很可疑。而且我从未听说过“Bellflower Books”或“UFPDF 0.1”

那个版本号让我畏缩。它也应该让你畏缩。

谷歌搜索“UFPDF”我从作者那里找到了这个注释:

注意:我将 UFPDF 写成一个实验,而不是一个成品。如果您在使用它时遇到问题,请不要打扰我寻求支持。虽然欢迎使用补丁,但我没有太多时间来维护它。

UFPDF 是一个位于 FPDF 之上的 PHP 库。 0.1。快跑吧。

【讨论】:

    【解决方案2】:

    ImageMagick 将调用 Ghostscript 将此 PDF 转换为图像。如果你在 pdf 上运行 gs,你会得到同样的间隔很差的输出。

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

    【讨论】:

    • 不幸的是,这些是设计师的字体。它们是 Adob​​e 字体,除了这些转换后的图像外,在任何地方都能很好地显示。
    猜你喜欢
    • 2010-10-09
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2023-02-26
    • 2013-01-20
    • 2012-01-27
    相关资源
    最近更新 更多