使用Imagick php扩展将多页PDF转换为JPG时的黑色背景

时间:2014-11-07 02:29:43

标签: php pdf imagick

使用Imagick php扩展程序将多页PDF转换为JPG时,纠正黑色背景的最佳方法是什么?

以下是我的申请中使用的代码:

    $imagick = new Imagick($file);
    $imagick->setResolution(150,150);
    $imagick->setImageFormat("jpg");
    $imagick->setImageCompression(imagick::COMPRESSION_JPEG);
    $imagick->setImageCompressionQuality(70);
    foreach ($imagick as $c => $_page) {
        $_page->setImageBackgroundColor('white');
        $_page->adaptiveResizeImage($maxsize,$maxsize,true);
        $_page->writeImage("$file-$c.jpg");
    }

我知道flattenImage方法可用于删除黑色背景,例如:

    $imagick = $imagick->flattenImages();

但是当文件包含更多页面时,flattenImages方法会将所有页面放在同一图像上,因此结果是生成的所有JPG中最后一页的副本。

如果有人可以帮助我,我感激不尽。

1 个答案:

答案 0 :(得分:6)

首先是工作代码 - 要遵循的解释:

此代码有效,但速度极慢:

$file = "./YORK.pdf";

$maxsize = 500;

$imagick = new Imagick($file);
$imagick->setResolution(150,150);
$imagick->setImageFormat("jpg");
$imagick->setImageCompression(imagick::COMPRESSION_JPEG);
$imagick->setImageCompressionQuality(70);

foreach ($imagick as $c => $_page) {
    $_page->setImageBackgroundColor('white');
    $_page->adaptiveResizeImage($maxsize,$maxsize,true);
    $_page->setImageCompose(\Imagick::COMPOSITE_ATOP);
    $_page->flattenImages();
    $_page->writeImage("$file-$c-compose.jpg");
}

此代码有效且速度很快:

foreach ($imagick as $c => $_page) {
    $_page->setImageBackgroundColor('white');
    $_page->adaptiveResizeImage($maxsize,$maxsize,true);
    $blankPage = new \Imagick();
    $blankPage->newPseudoImage($_page->getImageWidth(), $_page->getImageHeight(), "canvas:white");
    $blankPage->compositeImage($_page, \Imagick::COMPOSITE_ATOP, 0, 0);
    $blankPage->writeImage("$file-$c.jpg");
}

我认为发生的事情是,在编写ImageMagick正在执行的图像时:

  • 将各个图层转换为JPG
  • 将它们合并在一起。

对于具有透明度的每个图层,因为JPG不支持透明度,它将透明度渲染为黑色然后合并它。上面的代码使得合成以正确的顺序完成。

解决问题的另一种方法是将输出设置为PNG。由于它支持透明度,因此可以正确合并具有透明度的各个图层,然后如果您真的想要将最终图像转换为JPG。

使用PNG作为中间格式也可能会产生略高质量的输出,因为它可能会跳过“保存到JPG”并解码'步。我建议尽可能在您的工作流程中使用PNG,然后仅在您向最终用户提供文件时转换为JPG,如果您真的需要额外的压缩。