如何使用Imagick/PHP将.pdf转换为.jpg来创建质量更好的图像


How do I create a better quality image converting a .pdf to a .jpg with Imagick/PHP?

我目前有一个单页PDF(http://reljac.com/so_1/all.pdf)这是对几个纸质收据的基本扫描。如果你看PDF,文本是清晰易读的。原件是一张8.5"x 11"纸张的扫描(应该无关紧要)

我创建了一个非常简单的文件,使用以下代码将PDF转换为.jpg:

<?php     
    $im = new imagick('all.pdf[0]');
    $im->setImageFormat('jpg');
    $im->setImageCompression(imagick::COMPRESSION_LOSSLESSJPEG); 
    $im->setImageCompressionQuality(80);
    header('Content-Type: image/jpeg');
    echo $im;
?>

当我跑的时候(http://reljac.com/so_1/pdf_jpg.php)所得到的图像难以辨认。

一位告诉我:目前我正在两台服务器上工作

版本:ImageMagick 6.2.8 10/06/10 Q16文件:/usr/share/ImageMagick-6.2.8/doc/index.html

另一种:

版本:ImageMagick 6.6.0-4 2012-05-02 Q16http://www.imagemagick.org

两台服务器都创建了类似质量的.jpg

我已经更改了几个设置,包括:

  • $im->setImageCompressionQuality(40);
  • $im->setImageCompressionQuality(100);
  • $im->setImageCompressionQuality(80);
  • $im->setImageCompression(imagick::COMPRESSION_JPEG);(来自http://www.php.net/manual/en/imagick.constants.php)

我已尝试添加$im->scaleImage(600,0);

似乎没有什么能让任何东西变得更清晰。我希望最终的结果是原始PDF的清晰.jpg——它不需要填充屏幕,只需要清晰即可。原始PDF可能有不同的大小,所以我需要记住,来源并不总是8.5"x 11"。

我还能做些什么来提高生成图像的质量吗?或者这是我所期望的最好的吗?我需要以其他方式处理这些文件以获得更好的图像吗?

更新根据@VadimR的回答,我现在使用以下内容:

$src = 'all.pdf';
$src_parts = pathinfo($src);
shell_exec('pdfimages ' . $src . ' ' . $src_parts['filename']);
shell_exec('convert ' . $src_parts['filename'] . '-000.pbm -resize 25% -sharpen -2 ' . $src_parts['filename'] . '.jpg');
$myImage = imagecreatefromjpeg($src_parts['filename'] . '.jpg');
header("Content-type: image/jpeg");
imagejpeg($myImage);
imagedestroy($myImage);
shell_exec('rm ' . $src_parts['filename'] . '-000.pbm');

这就产生了一个漂亮、清晰的图像。

ImageMagick将PDF渲染委托给Ghostscript,因此,在进行故障排除时,如果需要,不仅要指定IM版本,还要指定GS版本。其次,我认为最好从命令行开始,只有在达到适当的质量后,才能将其放入php代码中。

提供质量(或多或少)的命令:

convert -density 300 all.pdf out.jpg

在这里,我们将渲染分辨率设置为300 dpi。注意,它与不同

convert all.pdf -density 300 out.jpg

因为这里的渲染是以72 dpi进行的,所以会以300 dpi分配糟糕的质量结果(即,w/o重采样)。

但是,我认为更好的方法是按原样提取扫描,即不进行转换:

pdfimages all.pdf all

这给出了所有000.pbm的图像——每个样本1位,3424*4400像素。我绝对不同意"文本清晰易读"——有些数字只能猜测。

然后使用convert命令重新采样,并可能尝试改进,例如

convert all-000.pbm -resize 25% -sharpen 2 out.jpg

使用pdfimages提取扫描页面的图像(是的,它可以从单个PDF文档中提取1000张图像中的100张),并将其保存为pbm或ppm文件是一种更好的选择或技术。

"如果你不知道自己在用图像做什么,那么每一次其他操作和/或重复转换等都肯定会降低图像的独创性,有时甚至会降低图像质量。例如,有人建议使用JPEG格式,这确实是一种粗糙的压缩/编码方法。然而,原始图像格式,如pbm或mono,用于灰度、黑白和/或1位图像和ppm,用于24/16/8位彩色图像。"

只对原始图像进行操作,最后使用Jbig2enc将pbm图像转换为PDF文件,并使用leptica的converttopdf实用程序将其用于彩色页面

永远不要使用RESIZE来缩小输出页面/PDF文件的大小,学会使用更好的压缩和/或编码技术