使用 Imagick 转换透明 PDF 文件

Posted

技术标签:

【中文标题】使用 Imagick 转换透明 PDF 文件【英文标题】:Converting transparent PDF files with Imagick 【发布时间】:2012-09-25 05:13:55 【问题描述】:

我在使用 php 和 imagick 创建缩略图时遇到问题。代码工作正常,缩略图以正确的大小生成等,但是当我尝试在缩略图上放置 PDF 徽标时,它变成了半透明。我想这与在 InDesign 中生成的 PDF 文件有关,它可能没有定义任何背景。有没有人遇到过这个问题或知道该怎么做?我试图在背景中放置一块白色的画布,但这并没有帮助。我还为复合图像函数指定了一个通道,但这也没有帮助。

这是我遇到问题的 PDF 文件:https://dl.dropbox.com/u/13712643/Case_Study.pdf 生成的缩略图如下所示: https://dl.dropbox.com/u/13712643/Case_Study1.jpg

到目前为止我生成的代码:http://pastebin.com/74CYC972

有什么想法吗?感谢您的帮助。

【问题讨论】:

我的 PDF 缩略图功能也遇到了同样的问题!它很痛苦,将背景设置为透明并不能解决它。如果我在不调整大小的情况下渲染图像,但透明度问题消失了。 【参考方案1】:

我遇到了同样的问题,我使用Imagick::compositeImage 解决了这个问题:php imagick convert PNG to jpg

代码如下:

$im = new Imagick();
$im->readimage($pdfFile."[$currentPage]");
$res = $im->getimageresolution();

$bg = new Imagick();
$bg->setresolution($res["x"],$res["y"]); //setting the same image resolution

//create a white background image with the same width and height
$bg->newimage($im->getimagewidth(), $im->getimageheight(), 'white');
$bg->compositeimage($im, Imagick::COMPOSITE_OVER, 0, 0); //merging both images
$bg->setimageformat("png");

//then you can write to a file
$bg->writeImage('white-background-pdf-image.png');

//or output it
header('Content-type: image/png');
echo $bg;

【讨论】:

【参考方案2】:

也许这就是你要找的东西:

$im->setBackgroundColor(new ImagickPixel('transparent')); 

http://www.php.net/manual/en/imagick.setbackgroundcolor.php

【讨论】:

感谢您的回答。不幸的是,这并没有改变任何东西。【参考方案3】:

现有的答案都不适合我。在创建一个新的 imagick() 后将图像展平:

$im = $im->flattenImages();

编辑:flattenImages 方法已被弃用和删除。使用

$im = $im->mergeImageLayers( imagick::LAYERMETHOD_FLATTEN );

【讨论】:

以上是关于使用 Imagick 转换透明 PDF 文件的主要内容,如果未能解决你的问题,请参考以下文章

ImageMagick/Imagick 使用原生 PHP API 将 PDF 转换为 JPG

PHP Imagick 不适用于 Laravel 8 中的 PDF 文件,简单的 ImagickException

Imagick 无法将 PDF 转换为 JPEG,但 ImageMagick 可以

windows7下Wamp安装php扩展imagick(转)

使用 GhostScript 将 PDF 转换为透明 PNG

如何使用 GD 或 Imagick 在非透明纯色图像内创建透明区域?