Конвертирование PDF в JPG с использованием PHP

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

Я использую расширение.

это мой код

$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-файл имеет правый размер (210×297 мм, как и A4). И все выглядит хорошо. Но мой jpg имеет размер страницы как 842×595 px, а DPI – 72.

и файл img намного меньше на бумаге, а затем в pdf, когда я его распечатал.

что является правильным способом сделать файл изображения из pdf и сделать его таким большим, как PDF (на бумаге)

ImageMagick использует GhostScript для обработки JPEG, поэтому вам лучше выполнить 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.