Ошибка объекта библиотеки 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");
Однако, если я заменю мой $im = new Imagick($file)
на $im = new Imagick('/test/project/test1.pdf'),
, ошибка исчезнет.
Я не знаю, почему это происходит. Может ли кто-нибудь дать мне подсказку по этому вопросу? Большое спасибо3 ответа:
Как указал @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 быстрее?