¿Cómo convertir un documento PDF a una imagen de vista previa en PHP?

| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
En esta publicación, sin embargo, nos limitaremos a un ejemplo mucho más pequeño, que es crear una vista previa de una imagen de un documento PDF determinado. "¿Por qué una vista previa?", Usted pregunta. Bueno, podría ser necesario para su sistema de gestión de bibliotecas, su tienda de libros electrónicos en línea o simplemente alguna tarea loca de programación de fin de semana. ¿Dónde cree que puede usar este concepto en su proyecto? sé en los comentarios. Ya no es posible implementar un algoritmo de conversión completo desde cero, por lo que utilizaremos bibliotecas de terceros para facilitar nuestra tarea. Las técnicas que encontré atractivas 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. Puede leer más sobre esto en su sitio oficial .
  • ImageMagick:Este es un paquete de software gratuito y de código abierto para mostrar, convertir y editar imágenes rasterizadas y archivos de imágenes vectoriales. Está disponible para la mayoría de los principales lenguajes de programación ‚Äã‚Äãincluido PHP. Esta es la documentación estándar para una descripción general rápida .
U cante Ghostscript Para usar Ghostscript en su proyecto, comience por instalarlo. Si está en Windows, descargue el ejecutable desde la página de descarga. Los usuarios de Linux pueden instalar Ghostscript directamente a través de los administradores de paquetes predeterminados;
 # distribuciones basadas en RPM, Fedora 26/27/28 $sudo dnf install ghostscript 
la instalación con este comando,
$gs --version 
Después de la instalación, navegue hasta el 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 creará una imagen de la primera página del documento. Entendamos lo que realmente hace;
  • -sDEVICE:establece el formato del archivo de imagen de salida.
  • -sTEXTVAL, - sGRAPHICVAL: establece suavizado para la imagen resultante. Los valores válidos ‚Äã‚Äãson 1, 2 y 4.
  • -r {NUM}:establece la resolución (en dpi) de la imagen.
  • -sFirstPage, -sLastPage:establece la primera y última página del documento que se mostrará.
  • -sOutputFile:establece el nombre de la salida archivo.
  • input.pdf:este es el documento PDF real que se usa para convertir.
Ahora, para usar este comando en PHP, debemos llama a la función exec(). Por ejemplo: exec ( "ls -l" , $output_str , $return_val ); foreach ( $output_str as $line ) { echo $linea . "" ; }
?>; Este ejemplo en Linux ejecutará ls e imprimirá todos los directorios y archivos en la consola. Podemos usar este concepto y ejecutar un comando desde nuestro código PHP. Así es como lo hice; < tbody> función is_pdf ( $archivo ) { $file_content = file_get_contents ( $file ) ; if (preg_match ( " / ^% PDF- [0-1 ]. [0-9] + / " , $file_content )) { return true; } else {< /código> retorno falso; } } función create_preview ( $file ) { < código>$formato_salida = "jpeg" ; $antialiasing = "4" ; $preview_page = "1" ; $resolución = "300" ; $output_file = "preview.jpg" ; < código>
$exec_command = " gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE = " . $output_format . "" ; $exec_command . = "- dTextAlphaBits =" . $antialiasing . "-dGraphicsAlphaBits =" . $antialiasing . "" ; < /código> $exec_command . = "- dFirstPage =" . $preview_page . "-dLastPage =" . $preview_page . "" ; < /código> $exec_command . = "- r" . $resolución . "" ; $exec_command . = "- sOutputFile =" . $output_file . "` " . $archivo . "` " ; echo " Ejecutando comando ... " ; exec ( $exec_command , $command_output , $ return_val ); foreach ( $command_output< /código> como $línea ) { echo $línea< /código> . "" ; } si (! $return_val ) { < código>echo "Vista previa creada con éxito!!" ; } otro { echo "Error al crear la vista previa." ; } } función __ principal __() { global $argv ; $archivo_entrada = $argv [1]; si (es_pdf ( $input_file )) { // Create PDF preview create_preview (< /código> $archivo_de_entrada ); } otro { echo "El archivo de entrada" . $input_file . "no es un documento PDF válido". ; } }
__ principal __();
?>
estrella de ejecución ts con __main __() que acepta un archivo PDF en la línea de comando. Comprueba si el archivo de entrada es un PDF válido o no. Si es válido, ejecuta el comando en el archivo de entrada.
Salir:
$php pdf_preview.php input.pdf Ejecutando comando... GPL Ghostscript 9.22 (2017-10-04) Copyright (C) 2017 Artifex Software, Inc. Todos los derechos reservados. Este software viene SIN GARANTÍA: vea el archivo PÚBLICO para más detalles. Procesando páginas 1 a 1. Página 1 Vista previa creada con éxito !! 
Uso de ImageMagick Como de costumbre, comenzaremos instalando los archivos binarios de ImageMagick en el sistema. Comencemos con las dependencias;
$sudo dnf install gcc php-devel php-pear 
Luego instale ImageMagick;
$sudo dnf install ImageMagick ImageMagick-devel 
Luego instale las clases contenedoras de PHP;
$sudo pecl instale 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 muestra. 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.function create_preview ( $archivo ) { $output_format = "jpeg" < código>; $preview_page = "1" ; < código> $resolución = "300" ; $output_file = "imagick_preview.jpg" ; echo " Obteniendo vista previa ... " ; $img_data = nuevo Imagick(); $img_data -> setResolution ( < código>$resolución , $resolución ); $img_datos -> readImage ( $archivo . "[" . ( $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. Definimos una instancia de tipo Imagick y establecemos varios parámetros como resolución, formato de archivo, etc. La página PDF que desea mostrar se denomina índice de matriz después del nombre del archivo. Por ejemplo:

Primera página: input.pdf [0] Segunda página: input.pdf [1]. ... ... Enésima página: input.pdf [N - 1] 
Salida:
$php pdf_preview.php input.pdf Obteniendo vista previa... Algunos de ustedes pueden se preguntará por qué usar este método sobre el anterior. Bueno, encontré que ImageMagick coincide bastante bien con el código PHP. La línea de comandos en la programación no se ve muy bien y, a veces, se vuelve de conocimiento común. Sin embargo, con el mismo conjunto de configuraciones, Ghostscript produjo archivos de imagen más pequeños que los archivos producidos por ImageMagick. No estoy seguro de si esto se debe a algunos problemas de optimización, pero esa no es la diferencia. Elegir uno sobre el otro se basa simplemente en su propio gusto. Así es como crea una vista previa para un documento PDF determinado. Espero que hayas aprendido algo nuevo de este post. ¿Qué método preferirías? ¿Alguna sugerencia para futuras mejoras? No dudes en mencionarlos en los comentarios.