Imagemagick PDF到JPG质量差的PHP

时间:2014-11-18 17:56:02

标签: php pdf imagemagick jpeg imagick

我有一个关于> 100mb的大pdf文件。

我想逐页保存该pdf页面转换为jpg。

我的PHP脚本运行良好,但图像质量甚至将quailty设置为100. jpg输出最大宽度设置为1024.

每个文件大小约为2.5mb。我已经搜索过这个问题,但我每次都会得到关于命令行解决方案的信息。我必须使用php。

$file = 'e-magazine/1/ebook.pdf';

if($file === null && !file_exists($file)) {
    throw new \Exception('FILE NOT EXISTS');
}

$nop = new \Imagick($file);

for($i = 0; $i <= $nop->getnumberimages(); $i++) {
    $image_file = 'e-magazine/1/'.($i+1).'.jpg';

    $im = new \Imagick();

    $im->readimage($file.'['.$i.']');
    $im->setImageCompressionQuality(100);
    $im->setimageformat('jpeg');
    $im->resizeImage(1024, 0, \Imagick::FILTER_CATROM, 1);
    $im->writeimage($image_file);

    $tm = new \Imagick();
    $tm->readimage($image_file);
    $tm->setImageCompressionQuality(60);
    $tm->setimageformat('jpeg');
    $tm->resizeImage(200, 0, \Imagick::FILTER_CATROM, 1);
    $tm->writeimage('e-magazine/1/thumbnails/'.($i+1).'_thumb.jpg');
}

如何更正文件质量?

2 个答案:

答案 0 :(得分:2)

PDF是基于矢量而不是位图,因此您需要在读取文件之前设置密度,以便告诉ImageMagick您将需要什么样的大小,然后它可以根据输入进行相应的栅格化。首先尝试以下内容来阅读图像:

$im->setResolution(288,288);

然后尝试减少该值,比如144,然后比较质量直到你有足够的质量。这是质量与处理时间和内存需求之间的权衡。数字越高,质量越高,但记忆越长,记忆越多。

答案 1 :(得分:0)

通过补偿PNG透明度Alpha通道,我的完整解决方案

$im = new imagick();
$im->setResolution(300, 300);
$im->readimage($pdf_path.'_0.pdf[0]');
$im->setImageResolution(300, 300);
$im->setImageBackgroundColor('#ffffff');
$im = $im->flattenImages();
$im->setImageFormat('jpeg');
$im->setImageCompression(imagick::COMPRESSION_JPEG); 
$im->setImageCompressionQuality(100);
$im->resizeImage(1200, 0,  imagick::FILTER_LANCZOS, 1);