Convertir un documento PDF en un conjunto de imágenes puede no parecer tan divertido, pero puede tener algunas aplicaciones. Como el contenido de las imágenes no se puede copiar tan fácilmente, la conversión hace que el documento sea estrictamente de «solo lectura» y brinda una capa adicional de protección contra el plagio. Las imágenes también pueden ser útiles cuando necesite algunas diapositivas preparadas para sus presentaciones rápidas en la oficina o para incrustarlas en sus informes y blogs.
En esta publicación, sin embargo, nos limitaremos a un ejemplo mucho más pequeño, que es generar una vista previa de la imagen de un documento PDF determinado. “¿Por qué vistas previas?”, te preguntarás. Bueno, uno puede necesitarlo para su sistema de administración de bibliotecas, su tienda minorista de libros electrónicos en línea o simplemente para algún desafío de programación de fin de semana loco. ¿Dónde crees que puedes usar este concepto en tu proyecto? Házmelo saber en los comentarios.
Ahora, implementar el algoritmo de conversión completo desde cero no es factible, por lo que nos ceñiremos a las bibliotecas de terceros para facilitar nuestra tarea. Los métodos que encontré atractivos en este escenario se basan en las siguientes herramientas:
- Ghostscript: es una utilidad de línea de comandos disponible para las tres plataformas principales, a saber. Windows, Linux y Mac, que interpreta archivos PostSript y PDF. Puedes leer más al respecto en su sitio oficial .
- ImageMagick: es un paquete de software gratuito y de código abierto para mostrar, convertir y editar archivos de imágenes rasterizadas e imágenes vectoriales. Está disponible para la mayoría de los principales lenguajes de programación, incluido PHP. Aquí está la documentación estándar para una descripción general rápida .
Usando Ghostscript
Para usar Ghostscript en su proyecto, comience con su instalación. Si está en Windows, descargue el ejecutable desde su página de descarga.
Los usuarios de Linux pueden instalar Ghostscript directamente a través de sus administradores de paquetes predeterminados;
# RPM based distros, Fedora 26/27/28 $ sudo dnf install ghostscript
Verifique la instalación a través de este comando,
$ gs --version
Después de la instalación, vaya al directorio que contiene el archivo PDF y ejecute el siguiente comando.
$ gs -dSAFER -dBATCH -sDEVICE=jpeg \ -dTextAlphaBits=4 -dGraphicsAlphaBits=4 \ -dFirstPage=1 -dLastPage=1 -r300 \ -sOutputFile=preview.jpg input.pdf
Esto generará una imagen de la primera página del documento. Entendamos lo que realmente hace;
- -sDEVICE: establece el formato de archivo de salida de la imagen.
- -sTEXTVAL, -sGRAPHICVAL: establece el suavizado de la imagen resultante. Los valores permitidos son 1, 2 y 4.
- -r{NUM}: establece la resolución (en dpi) de la imagen.
- -sFirstPage, -sLastPage: establece la primera y la última página del documento que se debe representar.
- -sOutputFile: establece el nombre del archivo de salida.
- input.pdf: es el documento pdf real que se utiliza para la conversión.
Ahora, para usar este comando en PHP, llamamos a la función exec(). Por ejemplo:
php
<?php exec( "ls -l", $output_str, $return_val ); foreach ( $output_str as $line ) { echo $line . "\n"; } ?>;
Este ejemplo, en Linux, ejecutará el comando ls y enumerará todos los directorios y archivos en la consola.
Podemos usar este concepto y ejecutar el comando ghostscript desde nuestro código PHP. Así es como lo he hecho;
php
<?php function is_pdf ( $file ) { $file_content = file_get_contents( $file ); if ( preg_match( "/^%PDF-[0-1]\.[0-9]+/", $file_content ) ) { return true; } else { return false; } } function create_preview ( $file ) { $output_format = "jpeg"; $antialiasing = "4"; $preview_page = "1"; $resolution = "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 "Executing command...\n"; exec( $exec_command, $command_output, $return_val ); foreach( $command_output as $line ) { echo $line . "\n"; } if ( !$return_val ) { echo "Preview created successfully!!\n"; } else { echo "Error while creating the preview.\n"; } } function __main__() { global $argv; $input_file = $argv[1]; if ( is_pdf( $input_file ) ) { // Create preview for the pdf create_preview( $input_file ); } else { echo "The input file " . $input_file . " is not a valid PDF document.\n"; } } __main__(); ?>
La ejecución comienza desde __main__() que toma el archivo PDF en la línea de comandos. Comprueba si el archivo de entrada es un PDF válido o no. Si es válido, ejecuta el comando ghostscript sobre el archivo de entrada.
Producción:
$ php pdf_preview.php input.pdf Executing command... GPL Ghostscript 9.22 (2017-10-04) Copyright (C) 2017 Artifex Software, Inc. All rights reserved. This software comes with NO WARRANTY: see the file PUBLIC for details. Processing pages 1 through 1. Page 1 Preview created successfully!!
Usando ImageMagick
Como de costumbre, comenzaremos con la instalación de los binarios de ImageMagick en el sistema. Comience con las dependencias;
$ sudo dnf install gcc php-devel php-pear
Después de eso, instala ImageMagick;
$ sudo dnf install ImageMagick ImageMagick-devel
Luego instale las clases contenedoras de PHP;
$ sudo pecl install imagick $ sudo bash -c "echo "extension=imagick.so" > /etc/php.d/imagick.ini"
Si planea usarlo en la arquitectura LAMP, considere reiniciar el servidor web Apache;
$ sudo service httpd restart
Ahora que nuestro sistema está listo, podemos usar ImageMagick en nuestro proyecto de ejemplo. La funcionalidad básica del script sigue siendo la misma. Todo lo que tienes que hacer es reemplazar el contenido de la función create_preview() con el siguiente código.
php
function create_preview ( $file ) { $output_format = "jpeg"; $preview_page = "1"; $resolution = "300"; $output_file = "imagick_preview.jpg"; echo "Fetching preview...\n"; $img_data = new Imagick(); $img_data->setResolution( $resolution, $resolution ); $img_data->readImage( $file . "[" . ($preview_page - 1) . "]" ); $img_data->setImageFormat( $output_format ); file_put_contents( $output_file, $img_data, FILE_USE_INCLUDE_PATH ); }
El código se explica por sí mismo. Estamos definiendo una instancia de tipo Imagick y configurando varios parámetros como resolución, formato de archivo, etc. La página PDF que desea representar se menciona como un índice de array después del nombre del archivo. Por ejemplo:
First page: input.pdf[0] Second page: input.pdf[1] . . . Nth page: input.pdf[N - 1]
Producción:
$ php pdf_preview.php input.pdf Fetching preview...
Algunos de ustedes se estarán preguntando por qué usar este método sobre el anterior. Bueno, encontré ImageMagick bastante consistente con el código PHP. Una línea de comando en programación no se ve tan bien y, a veces, se vuelve notoria de entender. Sin embargo, con el mismo conjunto de configuraciones, Ghostscript produjo archivos de imagen más pequeños que los generados por ImageMagick. No estoy seguro de si eso se debe a algunos problemas de optimización, pero la diferencia no es una gran preocupación. La elección de uno sobre el otro se basa simplemente en su propio gusto.
Así es como se crea una vista previa de un documento PDF determinado. Espero que hayas aprendido algo nuevo de este post. ¿Qué método preferirías? ¿Tiene alguna sugerencia para futuras mejoras? No dudes en mencionarlos en los comentarios.