У меня проблема с библиотекой 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 быстрее?