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

fca*_*rio 7 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");
    }
Run Code Online (Sandbox Code Playgroud)

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

    $imagick = $imagick->flattenImages();
Run Code Online (Sandbox Code Playgroud)

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

如果有人能帮助我,我感激不尽.

Dan*_*ack 7

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

这段代码有效,但速度非常慢:

$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");
}
Run Code Online (Sandbox Code Playgroud)

此代码有效并且速度很快:

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");
}
Run Code Online (Sandbox Code Playgroud)

我认为正在发生的是,当写入ImageMagick正在做的图像时:

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

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

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

使用PNG作为中间格式也可以产生稍高质量的输出,因为它可以跳过"保存到JPG和解码"步骤.我建议尽可能在工作流程中使用PNG,然后仅在向最终用户提供文件时转换为JPG,如果您确实需要额外的压缩.