У меня есть большой файл PDF, который составляет около> 100 МБ.
Я хочу сохранить эту страницу PDF за страницей, конвертируя в JPG.
Мой PHP-скрипт работает хорошо, но качество изображения не соответствует даже качеству, установленному на 100. Jpg output max width установлен на 1024.
Каждый размер файла около 2,5 МБ. Я искал эту проблему, но я получаю каждый раз о решениях командной строки. Я должен использовать php.
$file = 'e-magazine/1/ebook.pdf';
if($file === null && !file_exists($file)) {
throw new \Exception('FILE NOT EXISTS');
}
$nop = new \Imagick($file);
for($i = 0; $i <= $nop->getnumberimages(); $i++) {
$image_file = 'e-magazine/1/'.($i+1).'.jpg';
$im = new \Imagick();
$im->readimage($file.'['.$i.']');
$im->setImageCompressionQuality(100);
$im->setimageformat('jpeg');
$im->resizeImage(1024, 0, \Imagick::FILTER_CATROM, 1);
$im->writeimage($image_file);
$tm = new \Imagick();
$tm->readimage($image_file);
$tm->setImageCompressionQuality(60);
$tm->setimageformat('jpeg');
$tm->resizeImage(200, 0, \Imagick::FILTER_CATROM, 1);
$tm->writeimage('e-magazine/1/thumbnails/'.($i+1).'_thumb.jpg');
}
Что я могу сделать, чтобы исправить качество файла?
PDF-файлы являются векторными, а не растровыми, поэтому вам необходимо установить плотность перед чтением файла, чтобы сообщить ImageMagick, какой размер вам понадобится, после чего он может соответствующим образом растеризоваться при вводе. Попробуйте следующий ПРИОРИТЕТ, чтобы прочитать изображение:
$im->setResolution(288,288);
Затем попробуйте уменьшить это значение, скажем, до 144, и сравнивать качество, пока качество не станет достаточным. Это компромисс между качеством и временем обработки и потребностью в памяти. Чем выше число, тем выше качество, но тем дольше и больше памяти.
Мое полное решение этого с компенсацией за прозрачность альфа-каналов PNG
$im = new imagick();
$im->setResolution(300, 300);
$im->readimage($pdf_path.'_0.pdf[0]');
$im->setImageResolution(300, 300);
$im->setImageBackgroundColor('#ffffff');
$im = $im->flattenImages();
$im->setImageFormat('jpeg');
$im->setImageCompression(imagick::COMPRESSION_JPEG);
$im->setImageCompressionQuality(100);
$im->resizeImage(1200, 0, imagick::FILTER_LANCZOS, 1);