【问题标题】:ImageMagick with PHP text overflowing PDF to JPG conversionImageMagick 与 PHP 文本溢出 PDF 到 JPG 转换
【发布时间】:2019-05-31 07:46:07
【问题描述】:

我现在正在尝试使用带有 PHP 和 CakePHP 的 ImageMagick 将 PDF 文件转换为 JPG。 PDF 是完美的形状,它应该是正确的,但是从 PDF 生成的图像总是溢出文件的边界。

到目前为止,我一直在尝试调整生成代码,但没有成功,阅读了很多 PHP 文档 (http://php.net/manual/pt_BR/book.imagick.php)。

转换代码如下:

            $image = new Imagick();
            $image->setResolution(300,300);
            $image->setBackgroundColor('white');
            $image->readImage($workfile);
            $image->setGravity(Imagick::GRAVITY_CENTER);
            $image->setOption('pdf:fit-to-page',true);
            $image->setImageFormat('jpeg');
            $image->setImageCompression(imagick::COMPRESSION_JPEG);
            $image->setImageCompressionQuality(60);
            $image->scaleImage(1200,1200, true);
            $image->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
            $image->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);
            $image->writeImage(WWW_ROOT . 'files' . DS . 'Snapshots' . DS . $filename);

结果如下: https://imgur.com/a/ISBmDMv

第一张图片是转换前的PDF,第二张是PDF生成的右侧文字溢出的图片。

那么,为什么会这样呢?如果有人为使用的任何技术(GhostScript、ImageMagick 等)提供了替代方案,我们也欢迎!

谢谢大家!

【问题讨论】:

    标签: php image pdf imagemagick ghostscript


    【解决方案1】:

    如果没有看到原始 PDF 文件而不是它的图片,很难说您为什么看到结果。

    最可能的解释是您的原始 PDF 文件使用了一种字体,但没有在 PDF 中嵌入该字体。当 Ghostscript 将其渲染为图像时,它必须用“某物”代替缺失的字体。如果替换字体的度量(例如间距)与丢失字体的度量不完全匹配,则呈现的文本将放错位置/大小不正确。当然,由于它没有使用相同的字体,它也不会匹配字符的形状。

    这可能会导致几种不同类型的问题,但您所展示的内容是此类问题的典型代表。虽然你没有提到它,但我也可以在文档中看到几个文本覆盖的地方,这是完全相同问题的另一个症状。

    如果是这种情况,Ghostscript 后台通道脚本会告诉您它无法找到字体,并正在用命名字体替换丢失的字体。我不能告诉你 Imagemagick 是否将它存储在任何地方,我猜它不会。但是,您可以从 ImagMagick profile.xml 文件中复制命令行,然后使用它自己运行 Ghostscript,然后您将能够查看是否发生了这种情况。

    如果这是正在发生的事情,那么你必须要么;

    1. 创建嵌入字体的 PDF 文件(无论如何,这是一个很好的做法)
    2. 为 Ghostscript 提供缺失字体的副本作为替代
    3. 按原样接受文本

    【讨论】:

    • 您好,感谢您的回复!文件在这里:docdro.id/HL9RdPg 抱歉之前没有包含它。至于PDF,它是由DomPDF在系统的其他部分动态生成的,代码在这里:$CakePdf = new \CakePdf\Pdf\CakePdf(); $CakePdf->template('../EmergencySheets/pdf/' . (($sheet->tarja == 'R') ? 'redpdf' : 'greenpdf'), 'default'); $CakePdf->viewVars(compact('sheet', 'expeditor')); $CakePdf->write($workfile);我还没有测试过你的解决方案,但我会尽快回复。
    • 该文件使用 CIDFonts,购买它们已正确嵌入。当我使用 Ghostscript 渲染 PDF 时,它会生成正确的图像。您还没有说您使用的是哪个版本的 Ghostscript,如果您使用的是旧版本,您应该尝试当前版本(撰写本文时为 9.26)。如果这仍然对您不起作用,那么您需要找出 ImageMagick 正在使用的命令行并告诉我。显然我没有用你的 Ghostscript 命令行测试这个,所以可能会有一个重要的区别,但我怀疑你使用的是旧版本。
    • 你是对的,服务器上的版本是 8.70,从 2009 年开始。将 Ghostscript 更新到最新版本解决了这个问题。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 2010-10-09
    • 2014-03-23
    • 2013-02-20
    • 1970-01-01
    • 2015-01-16
    相关资源
    最近更新 更多