具有PHP文本的ImageMagick溢出PDF到JPG的转换

时间:2019-01-04 18:04:59

标签: php image pdf imagemagick ghostscript

我现在正在尝试使用ImageMagick和PHP和CakePHP将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等)提供了替代方案,那么也欢迎您!

谢谢大家!

1 个答案:

答案 0 :(得分:1)

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

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

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

如果是这种情况,那么Ghostscript反向通道转录本将告诉您它找不到字体,并用一种​​命名的字体替换丢失的字体。我无法告诉您Imagemagick是否将其存储在任何地方,我想可能不是。但是,您可以从ImagMagick profile.xml文件复制命令行,然后使用该命令行自己运行Ghostscript,然后便可以查看是否正在发生这种情况。

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

  1. 使用嵌入的字体创建PDF文件(无论如何,这都是一种好习惯)
  2. 提供Ghostscript,并使用丢失字体的副本作为替代
  3. 直接使用文字