Преобразование PDF в JPG с помощью PHP

Я пытаюсь преобразовать PDF в IMG (JPG) с помощью PHP.

Я использую расширение 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 (на бумаге)

5 ответов


ImageMagick использует GhostScript для обработки jpeg, поэтому вам лучше сделать exec GhostScript напрямую, что было бы намного эффективнее и дало бы вам больше контроля. Она также будет только 1 exec оператор, вместо того, чтобы играть с функциями IMagick.


вы можете использовать imagemagick через exec () или аналогичный, аргументы оболочки намного менее подробны, чем расширение 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

Это параметр" - density " (который устанавливает DPI для чтения исходного файла Как), который специально устраняет вашу проблему.

также imagemagick по умолчанию использует параметр-quality 92 для записи JPEG в большинстве случаев , поэтому вам, вероятно, не нужно явно объявлять его.


похоже, вы пропустили два сеттеры:

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

)

честно говоря, я не совсем уверен, что это сработает. Это просто попытка помочь вам. Я искренне надеюсь на это.


Как упоминалось ранее, установка разрешения перед чтением файла делает трюк:

$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(); 

вы должны вызвать setResolution перед чтением изображения. В противном случае imagemagick будет использовать системный dpi по умолчанию.