使用PHP将PDF转换为JPG

2022-08-30 15:43:37

我正在尝试在PHP的帮助下将PDF转换为IMG(JPG)。

我正在使用imagick扩展。

这是我的代码

    $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 px,DPI为72。

和img文件在纸上比pdf小得多,当我打印它时。

从pdf制作图像文件并使其像pdf一样大(在纸上)的正确方法是什么?


答案 1

您可以通过exec()或类似方式使用imagemagick,shell参数比PHP扩展要详细得多。

$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

它是“密度”(将 DPI 设置为读取源文件)选项专门修复了您的问题。

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


答案 2

看起来你错过了两个二传手:

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], 

)

说实话,我不完全确定这是否有效。只是为了帮助你而尝试。我真诚地希望它能做到。


推荐