У меня есть следующая функция php ниже, которая преобразует локальный файл PDF в изображения. Короче говоря, я хочу, чтобы каждая страница PDF была преобразована в отдельный образ.
Функция преобразует PDF в изображение, но только на последнюю страницу. Я хочу, чтобы каждая страница PDF была преобразована в изображение и пронумерована. Не только последняя страница PDF.
В настоящее время эта функция преобразует последнюю страницу example.pdf
в example-0.jpg
. Проблема, я уверен, лежит внутри метода for
. Что мне не хватает?
$file_name = 'example.pdf'; // using just for this example, I pull $file_name from another function function _create_preview_images($file_name) { // Strip document extension $file_name = basename($file_name, '.pdf'); // Convert this document // Each page to single image $img = new imagick('uploads/'.$file_name.'.pdf'); // Set background color and flatten // Prevents black background on objects with transparency $img->setImageBackgroundColor('white'); $img = $img->flattenImages(); // Set image resolution // Determine num of pages $img->setResolution(300,300); $num_pages = $img->getNumberImages(); // Compress Image Quality $img->setImageCompressionQuality(100); // Convert PDF pages to images for($i = 0;$i < $num_pages; $i++) { // Set iterator postion $img->setIteratorIndex($i); // Set image format $img->setImageFormat('jpeg'); // Write Images to temp 'upload' folder $img->writeImage('uploads/'.$file_name.'-'.$i.'.jpg'); } $img->destroy(); }
Кажется, что большая часть моего кода была правильной. Проблема была в том, что я использовал $img->flattenImages();
неправильно. Это merges
последовательность изображений в одно изображение. Подобно тому, как Photoshop выравнивает все видимые слои в изображении при экспорте jpg
.
Я удалил вышеуказанную строку, и отдельные файлы были написаны так, как ожидалось.
/* convert pdf file to list image files */ if($_FILES['file_any']['type']=='application/pdf'){ $file_name = str_replace(substr($url,0,strpos($url,$_FILES['file_any']['name'])),'',$url); $basename = substr($file_name,0,strpos($file_name,'.')); $abcd = wp_upload_dir(); $delpath = $abcd['path']; $savepath = $abcd['url']; $dirpath = substr($savepath,(strpos($savepath,'/upl')+1)); $file_name = basename($file_name, '.pdf'); $img = new imagick($delpath.'/'.$file_name.'.pdf'); $img->setImageBackgroundColor('white'); $img->setResolution(300,300); $num_pages = $img->getNumberImages(); $img->setImageCompressionQuality(100); $imageurl = NULL; $imagedelurl = NULL; for($i = 0;$i < $num_pages; $i++) { $imageurl[]=$savepath.'/'.$basename.'-'.$i.'.jpg'; $imagedelurl[] = $delpath.'/'.$basename.'-'.$i.'.jpg'; // Set iterator postion $img->setIteratorIndex($i); // Set image format $img->setImageFormat('jpeg'); // Write Images to temp 'upload' folder $img->writeImage($delpath.'/'.$file_name.'-'.$i.'.jpg'); } $img->destroy(); }
Существует гораздо более простой способ без цикла, просто используйте $img->writeImages($filename,false);
и он сделает файл на PDF-страницу. Как вы сказали, если вы сначала flatten
изображение, он сохранит только 1 страницу.
сначала установить
ImageMagick
в вашей системе или сервере, а затем создайте
pdfimage
папку и поместите файл PDF в эту папку, затем запустите код и загрузите его файл
<?php $file_name = $_FILES['pdfupload']['name']; // using just for this example, I pull $file_name from another function //echo strpos($file_name,'.pdf'); $basename = substr($file_name,0,strpos($file_name,'.')); //echo $_FILES['pdfupload']['type']; //if (isset($_POST['submit'])){ if($_FILES['pdfupload']['type']=='application/pdf'){ // Strip document extension $file_name = basename($file_name, '.pdf'); // Convert this document // Each page to single image $img = new imagick('pdfimage/'.$file_name.'.pdf'); // Set background color and flatten // Prevents black background on objects with transparency $img->setImageBackgroundColor('white'); //$img = $img->flattenImages(); // Set image resolution // Determine num of pages $img->setResolution(300,300); $num_pages = $img->getNumberImages(); // Compress Image Quality $img->setImageCompressionQuality(100); $images = NULL; // Convert PDF pages to images for($i = 0;$i < $num_pages; $i++) { $images[]=$basename.'-'.$i.'.jpg'; // Set iterator postion $img->setIteratorIndex($i); // Set image format $img->setImageFormat('jpeg'); // Write Images to temp 'upload' folder $img->writeImage('pdfimage/'.$file_name.'-'.$i.'.jpg'); } echo "<pre>"; print_r($images); $img->destroy(); } //} ?>