使用PHP进行PDF转JPG转换

29

我正在尝试使用 PHP 和 imagick 扩展将 PDF 转换为 IMG (JPG)。

以下是我的代码:

    $fp_pdf = fopen($pdf, 'rb');

    $img = new imagick(); // [0] can be used to set page number
    $img->readImageFile($fp_pdf);
    $img->setImageFormat( "jpg" );
    $img->setImageCompression(imagick::COMPRESSION_JPEG); 
    $img->setImageCompressionQuality(90); 

    $img->setResolution(300,300);

    $img->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH);

    $data = $img->getImageBlob(); 

我的源PDF文件具有正确的尺寸(210x297毫米,就像A4一样)。一切看起来都很好。但是我的JPG页面尺寸为842x595像素,DPI为72。

当我打印它时,图像文件在纸上比PDF小得多。

制作图像文件以使其与PDF一样大(在纸上)的适当方法是什么?


最终我通过Ghostscript控制台命令(gs)实现了所有功能,结果非常出色!速度很快!非常快! - user1016265
5个回答

11

您可以通过exec()或类似的方式使用ImageMagick,与PHP扩展相比,shell参数要少得多。

$pdf_file = escapeshellarg( "mysafepdf.pdf" );
$jpg_file = escapeshellarg( "output.jpg" );

$result = 0;
exec( "convert -density 300 {$pdf_file} {$jpg_file}", null, $result );

// at this point $result should == 0 if the conversion was successful

"-density"(用于设置读取源文件的DPI)选项是专门解决你问题的。

另外,默认情况下,ImageMagick在大多数情况下使用JPEG写入的"-quality"设置为92 - 因此,您可能不需要显式声明它。


1
致命错误:只有变量可以通过引用传递,在mypath\index.php的第6行。 - Fernando Torres
只需传递一个空数组而不是“null” - ZioBit

9

看起来您错过了两个setter:

Imagick::setImagePage() http://www.php.net/manual/en/function.imagick-setimagepage.php

以及:

Imagick::setImageExtent() http://www.php.net/manual/en/function.imagick-setimageextent.php

为了获得这些函数的正确参数,您可以尝试以下操作:

$fp_pdf = fopen($pdf, 'rb');
$params=array();

    $img = new imagick(); 
    $img->readImageFile($fp_pdf);
    /*my modification: */$img->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH);
    /*my modification: */$params=$img->identifyImage();
    $img->setImageFormat( "jpg" );
    $img->setImageCompression(imagick::COMPRESSION_JPEG); 
    $img->setImageCompressionQuality(90); 
    /*my modification: */$img->setPage($params['geometry']['width'], $params['geometry']['height'], 0, 0)
    /*my modification: */$img->setResolution($params['resolution']['x'], $params['resolution']['y']);
    $img->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH);
    $data = $img->getImageBlob();

如果您发现需要设置其他属性,那么让我向您展示一下$params所包含的信息。这可能对您有所帮助:
$params=array(
    [imageName],
    [format], 
    [geometry] => Array
        (
            [width]
            [height] 
        )
    [type], 
    [colorSpace], 
    [resolution],
        (
            [x] 
            [y]
        )

    [units],
    [fileSize],
    [compression],
    [signature], 

说实话,我不完全确定这会不会有用。只是为了帮助你而尝试。我真诚地希望它能起作用。


谢谢您的回答,但我该如何想象我应该在这些函数中传递什么值?PDF文件具有A4纸张大小,我怎么知道它应该使用多少像素才能使纸张的尺寸相同?或者仅用于打印目的的DPI值将被使用? - user1016265
哦!我明白了...让我重写我的答案以添加一些细节。 - Alfredo Castaneda Garcia
这是关于PDF的信息:http://o7.no/uAMcLa。最奇怪的是,我使用shell_exec("convert -density 300 -units pixelsperinch +matte in out")进行了转换,结果图像变成了预期的尺寸。 - user1016265

6

ImageMagick使用GhostScript处理JPEG图片,因此最好直接执行GhostScript,这将更加高效并为您提供更多的控制。这也只需要一个exec语句,而不是玩弄IMagick函数。


在实际项目中,我确切地按照你建议的方式做了。它运行得更快,结果也更符合预期 ;) - user1016265

6

如前所述,在读取文件之前设置分辨率即可解决问题:

$fp_pdf = fopen($pdf, 'rb');

$img = new imagick(); // [0] can be used to set page number
$img->setResolution(300,300);
$img->readImageFile($fp_pdf);
$img->setImageFormat( "jpg" );
$img->setImageCompression(imagick::COMPRESSION_JPEG); 
$img->setImageCompressionQuality(90); 

$img->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH);

$data = $img->getImageBlob(); 

1

在读取图像之前,您必须调用setResolution。否则,imagemagick将使用默认的系统dpi。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接