У меня проблема с 2 недель. Я работаю над новостной системой онлайн. Файлы новостей PDF имеют большой размер (например, 150 МБ). В результате из-за проблемы с объемом подключения пользователи не смогут легко загрузить эти файлы для чтения.
В качестве решения я решил разделить файл PDF на несколько сжатых изображений небольших размеров (в среднем 150 КБ) и создать новый файл PDF небольшого размера. Вот скрипт с библиотекой PdfToImage и Imagick:
<?php
ini_set('max_execution_time', 1000);
require __DIR__.'/vendor/autoload.php';
function compress($path) {
$im = new Imagick($path);
$im->optimizeImageLayers();
$im->setImageCompression(Imagick::COMPRESSION_JPEG);
$im->setImageCompressionQuality(25);
$im->writeImages($path, true);
}
$pdf = new Spatie\PdfToImage\Pdf('filePDF.pdf');
foreach (range(1, $pdf->getNumberOfPages()) as $pageNumber) {
$path = './images/page'.$pageNumber.'jpg';
$pdf->setPage($pageNumber)
->saveImage($path);
compress($path);
}
// Images to pdf
$i = 1;
$path = './images/page';
$images = array();
while(true) {
$filename = $path . $i . 'jpg';
if(!file_exists($filename)) {
break;
}
$images[] = $filename;
$i++;
}
$pdf = new Imagick($images);
$pdf->setImageFormat('pdf');
$pdf->writeImages('output.pdf', true);
echo "Completed...";
?>
С этим решением я столкнулся с несколькими проблемами:
- Для больших файлов этот скрипт занимает много времени
- Качество изображений внутри файла PDF (созданного файла PDF) теряется, а содержание неясно.
- Максимальное время выполнения сценария php зависит от размера изображения.
Пожалуйста, я хотел бы получить вашу помощь для решения этой проблемы. Пожалуйста, я бы хотел, чтобы вы посоветовали мне возможное решение. Спасибо.