Как преобразовать документ PDF в изображение для предварительного просмотра в PHP?

| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
Однако в этом посте мы ограничимся гораздо меньшим примером, который заключается в создании предварительного просмотра изображения из данного PDF-документа. «Почему превью?» — спросите вы. Ну, это может понадобиться для его системы управления библиотекой, ее интернет-магазина электронных книг или просто какой-нибудь сумасшедшей задачи по программированию на выходных. Как вы думаете, где вы можете использовать эту концепцию в своем проекте? я знаю в комментариях. Больше невозможно реализовать полный алгоритм преобразования с нуля, поэтому мы будем использовать сторонние библиотеки, чтобы упростить нашу задачу. Методы, которые я нашел привлекательными в этом сценарии, основаны на следующих инструментах: ul>
  • Ghostscript: это утилита командной строки, доступная для всех трех основных платформ, а именно Windows, Linux и Mac, которая интерпретирует файлы PostSript и PDF. Подробнее об этом можно прочитать на его официальный сайт .
  • ImageMagick: это бесплатный программный пакет с открытым исходным кодом для отображения, преобразования и редактирования растровых изображений и файлов векторных изображений. Он доступен для большинство основных языков программирования, включая PHP. Вот стандартная документация для краткого обзора .
  • U sing Ghostscript Чтобы использовать Ghostscript в своем проекте, начните с его установки. Если вы используете Windows, загрузите исполняемый файл со страницы загрузки. Пользователи Linux могут установить Ghostscript напрямую через менеджеры пакетов по умолчанию;
    # дистрибутивы на основе RPM, Fedora 26/27/28 $sudo dnf install ghostscript 
    Verify установка с помощью этой команды,
    $gs --version 
    После установки перейдите в каталог, содержащий файл PDF, и выполните следующую команду.
    $gs -dSAFER -dBATCH -sDEVICE = jpeg -dTextAlphaBits = 4 -dGraphicsAlphaBits = 4 -dFirstPage = 1 -dLastPage = 1 -r300 -sOutputFile = preview.jpg input.pdf Это создаст изображение первой страницы документа. Давайте разберемся, что он на самом деле делает;
    • -sDEVICE:задает формат файла выходного изображения.
    • -sTEXTVAL, -sGRAPHICVAL: устанавливает сглаживание для полученного изображения. Допустимые значения: 1, 2 и 4.
    • -r {ЧИСЛО}:устанавливает разрешение (в dpi) изображения.
    • -sFirstPage, -sLastPage:задает первую и последнюю отображаемую страницу документа.
    • -sOutputFile:задает имя вывода файл.
    • input.pdf:это фактический PDF-документ, который используется для преобразования.
    Теперь, чтобы использовать эту команду в PHP, мы вызовите функцию exec(). Например: <код><код> exec ( "ls -l" , $output_str , $return_val ); foreach ( $output_str as $line ) { echo $line . "" ; }
    ?>; Этот пример в Linux выполнит ls и выведет все каталоги и файлы на консоль. Мы можем использовать эту концепцию и выполнить команду из нашего PHP-кода. Вот как я это сделал: < tbody> функция is_pdf ( $file ) { $file_content = file_get_contents ( $file ) ; if (preg_match ( " / ^% PDF- [0-1 ].[0-9] + / " , $file_content )) { возврат true; } else { return false; } } функция create_preview ( $file ) { $output_format = "jpeg" ; $antialiasing = "4" ; $preview_page = <код>"1" <код >; $разрешение = "300" ; $output_file = "preview.jpg" ; $exec_command = " gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE = " . $output_format . "" ; $exec_command <код>. = "- dTextAlphaBits =" . $antialiasing . "-dGraphicsAlphaBits =" . $antialiasing . "" ; $exec_command . = "- dFirstPage =" . $preview_page . "-dLastPage =" . $preview_page . "" ; $exec_command . = "- r" . $resolution . "" ; $exec_command . = "- sOutputFile =" . $output_file . "` " . $file . "` " ; echo " Выполнение команды..." ; exec ( $exec_command , $command_output , $ return_val ); foreach ( $command_output как $line ) { echo $line . "" ; } if (! $return_val ) { echo "Предварительный просмотр успешно создан!!" ; } <код>еще <код >{ echo "Ошибка при создании предварительного просмотра." ; функция __ main __() { global $argv ; $input_file = $argv [1]; if (is_pdf ( $input_file )) { // Создать предварительный просмотр PDF create_preview ( $input_file ); } else { echo "Входной файл" . $input_file . "не является допустимым PDF-документом." ; } }
    __ main __();
    ?>
    Звезда казни ts с __main __(), который принимает файл PDF в командной строке. Он проверяет, является ли входной файл допустимым PDF или нет. Если он действителен, он выполняет команду во входном файле.
    Выход:
    $php pdf_preview.php input.pdf Выполнение команды ... GPL Ghostscript 9.22 (2017-10-04) Copyright (C) 2017 Artifex Software, Inc. Все права защищены. Это программное обеспечение поставляется БЕЗ ГАРАНТИЙ: подробности см. в файле PUBLIC. Обрабатываются страницы с 1 по 1. Предварительный просмотр страницы 1 успешно создан !! 
    Использование ImageMagick Как обычно, мы начнем с установки двоичных файлов ImageMagick в системе. Начнем с зависимостей;
    $sudo dnf install gcc php-devel php-pear 
    Затем установите ImageMagick;
    $sudo dnf install ImageMagick ImageMagick-devel 
    Затем установите классы-оболочки PHP;
    $sudo pecl install imagick $sudo bash -c "echo" extension = imagick.so "> / etc /php.d/imagick.ini "
    Если вы планируете использовать его в архитектуре LAMP, рассмотрите возможность перезапуска веб-сервера Apache;
    $sudo service httpd restart 

    Теперь, когда наша система готова, мы можем использовать ImageMagick в нашем примере проекта. Базовый функционал скрипта остался прежним. Все, что вам нужно сделать, это заменить содержимое функции create_preview() следующим кодом.function create_preview ( $file ) { $output_format = "jpeg" ; $preview_page = "1" ; $разрешение = "300" ; $output_file = "imagick_preview.jpg" ; echo " Получение предварительного просмотра ... " ; $img_data = new Imagick(); $img_data -> setResolution ( $разрешение , $разрешение ); $img_data -> readImage ( $file . "[" . ( $preview_page - 1). " ] " ); $img_data -> setImageFormat ( $output_format ); file_put_contents ( $output_file , $img_data , FILE_USE_INCLUDE_PATH ); Код говорит сам за себя. Мы определяем экземпляр типа Imagick и устанавливаем различные параметры, такие как разрешение, формат файла и т. д. Страница PDF, которую вы хотите отобразить, называется индексом массива после имени файла. Например:

    Первая страница: input.pdf [0] Вторая страница: input.pdf [1]. ... ... N-я страница: input.pdf [N - 1] 
    Вывод:
    $php pdf_preview.php input.pdf Получение предварительного просмотра ... Некоторые из вас могут интересно, почему использовать этот метод вместо предыдущего. Что ж, я обнаружил, что ImageMagick довольно хорошо соответствует PHP-коду. Командная строка в программировании выглядит не очень хорошо и иногда становится общеизвестной. Однако с тем же набором конфигураций Ghostscript создавал файлы изображений меньшего размера, чем файлы, создаваемые ImageMagick. Я не уверен, что это связано с некоторыми проблемами оптимизации, но это не разница. Выбор одного над другим просто основан на вашем собственном вкусе. Вот как вы создаете предварительный просмотр для данного PDF-документа. Надеюсь, вы узнали что-то новое из этого поста. Какой метод вы бы предпочли? Есть предложения по дальнейшим улучшениям? Не стесняйтесь упоминать их в комментариях.