Ошибка объекта библиотеки 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 2

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 быстрее?