Конвертирование 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 (на бумаге)
Ответы
Ответ 1
ImageMagick использует GhostScript для обработки JPEG файлов, поэтому вам лучше будет exec
GhostScript, что будет намного более эффективным и даст вам больше контроля. Это также будет только 1 exec
, вместо того, чтобы играть с функциями IMagick.
Ответ 2
Вы можете использовать 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 в большинстве случаев - поэтому вам, вероятно, не нужно явно объявлять его.
Ответ 3
Похоже, вы пропустили два сеттера:
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],
)
Если честно, я не совсем уверен, что это сработает. Это просто попытка, чтобы помочь вам. Я искренне надеюсь, что это произойдет.
Ответ 4
Как упоминалось ранее, установка разрешения перед чтением файла делает трюк:
$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();
Ответ 5
Вы должны вызвать setResolution перед чтением изображения. В противном случае imagemagick будет использовать стандартные dpi.