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

ImageMagick with PHP text overflowing PDF to JPG conversion

我现在正在尝试将 PDF 文件转换为 JPG,使用带 PHP 和 CakePHP 的 ImageMagick。 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 等)有一些替代方案,也欢迎!

谢谢大家!

很难说为什么你看到你所做的结果,而不是看到原始 PDF 文件,而不是它的图片。

最可能的解释是您的原始 PDF 文件使用了一种字体,但并未在 PDF 中嵌入该字体。当 Ghostscript 将其渲染为图像时,它必须用 'something' 代替丢失的字体。如果替换字体的规格(例如间距)与缺失字体的规格不完全匹配,则渲染文本的大小将为 misplaced/incorrectly。当然,因为它没有使用相同的字体,所以它也不会匹配字符的形状。

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

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

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

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