我目前有一个单页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文件的大小,学会使用更好的压缩和/或编码技术