2013-12-15 2 views
9

У меня есть следующая функция php ниже, которая преобразует локальный файл PDF в изображения. Короче говоря, я хочу, чтобы каждая страница PDF была преобразована в отдельный образ.Сохранение каждой страницы PDF в изображение с помощью Imagick

Функция преобразует 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(); 
} 
+0

Я не знаю, если что-то изменилось, но в последний раз я генерировал Pdf миниатюру это на '$ IMG = новый Imagick («file.pdf [0]») ; 'получить только первую страницу. –

+0

Да ... Я знаю об этом. Но мне не нужна первая, средняя или последняя страница - я хочу, чтобы ВСЕ страницы были преобразованы в отдельные изображения. –

+0

Я знаю, что я пытаюсь сказать, что PDF не работает хорошо, как другие многоформатные форматы, поэтому, вероятно, вам нужно получить количество страниц и в цикле создать новые экземпляры imagick, добавив '[$ i]' для имени файла. –

ответ

9

Похоже наиболее моего кода было правильным. Проблема была в том, что я неправильно использовал $img->flattenImages();. Это merges последовательность изображений в одно изображение. Подобно тому, как Photoshop выравнивает все видимые слои в изображении при экспорте jpg.

Я удалил вышеуказанную строку, и отдельные файлы были написаны так, как ожидалось.

0

Существует намного более простой способ без цикла, просто используйте $img->writeImages($filename,false);, и он сделает файл на PDF-страницу. Как вы сказали, если вы сначала нажмете изображение, оно сохранит только 1 страницу.

0

первой установки

ImageMagick

в вашей системе или сервере , а затем создать

pdfimage

папку и поместить PDF-файл в этой папке, то запустить t он код и загрузить его файл

<?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(); 
    } 
    //} 
?> 
4
/* 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(); 
       } 
Смежные вопросы