Ошибка объекта библиотеки PHP

У меня проблема с библиотекой php imagick .

Я делаю рекурсивный поиск в своей файловой системе и ищу любые pdf файлы.

  $it = new RecursiveDirectoryIterator("/test/project"); $display = Array ('pdf'); foreach(new RecursiveIteratorIterator($it) as $file){ if (in_array(strtolower(array_pop(explode('.', $file))), $display)) { if(file_exists($file)){ echo $file; //this would echo /test/project/test1.pdf $im = new Imagick($file); $im->setImageFormat("jpg"); file_put_contents('test.txt', $im); } } } 

Однако, я получаю сообщение об ошибке

 Fatal error: Uncaught exception 'ImagickException' with message 'Can not process empty Imagick object' in /test.php:57 Stack trace: #0 /test.php(57): Imagick->setimageformat('jpg') #1 {main} thrown in /test.php on line 57 line 57 is $im->setImageFormat("jpg"); 

Однако, если я заменил my $im = new Imagick($file) на $im = new Imagick('/test/project/test1.pdf'), ошибка исчезнет.

Я не знаю, почему это происходит. Может ли кто-нибудь дать мне подсказку по этому вопросу? спасибо

Как отметил @pozs

Примечание 1: Ваша переменная $ file является объектом SplFileInfo, но вы всегда используете ее как строку.

Вот фрагмент кода, который получает имя файла как строку и имеет оптимизированный метод для получения расширения файла:

 <?php $display = array ('pdf'); $directoryIterator = new RecursiveDirectoryIterator('./test/project'); // The key of the iterator is a string with the filename foreach (new RecursiveIteratorIterator($directoryIterator) as $fileName => $file) { // Optimized method to get the file extension $fileExtension = pathinfo($fileName, PATHINFO_EXTENSION); if (in_array(strtolower($fileExtension), $display)) { if(file_exists($fileName)){ echo "{$fileName}\n"; // Just do what you want with Imagick here } } 

В соответствии с этим формат файлов .jpg – это JPEG .

Примечание 1 :

Ваша переменная $file является объектом SplFileInfo , но вы всегда используете ее как строку. Используйте флаг RecursiveDirectoryIterator::CURRENT_AS_PATHNAME в конструкторе RecursiveDirectoryIterator , чтобы быть реальной строкой.

Примечание 2 :

Вы можете фильтровать записи итератора с помощью RegexIterator , f.ex .: new RegexIterator($recursiveIteratorIterator, '/\.pdf$/') (после примечания 1 ). Или вы можете использовать GlobIterator для поиска только файлов PDF.

Возможно, попробуйте этот подход: преобразование PDF в JPG с использованием PHP

 $fp_pdf = fopen($pdf, 'rb'); $img = new imagick(); $img->readImageFile($fp_pdf); 

Похоже, что при чтении других сообщений GhostScript быстрее?