Ha salido en algunos artículos del foro, usuarios que deseaban transformar la primera hoja de un fichero PDF a una imagen, con el fin de poder ofrecer esa imagen como información del registro.
Buscando en Internet casi siempre aparece la solución haciendo referencia a la librería de Imagick.
También, he comprobado que esta extensión es muy habitual que las empresas que venden «hosting» para alojar nuestras aplicaciones, tienen instalada esta extensión, por lo que he considerado que es una solución que podamos utilizar muchos de nosotros, que disponemos de un «hosting» contratado.
Objetivo
Hacer un ejemplo que cuando se da de alta (ADD) un registro y se facilita un fichero PDF, el aplicativo genera un fichero PNG con la primera página, que servirá para mostrarse en LIST y VIEW y como botón de enlace para la descarga del fichero PDF.
DEMO: https://fhumanes.com/imagick/
Solución Técnica
Como he indicado, se ha utilizado la librería de «Imagick» para leer el PDF y generar la imagen en formato PNG. Esta librería tiene muchísimas funcionalidades que no se ven en el ejemplo pero que se puede consultar en el manual de PHP y en los infinitos ejemplos que podemos encontrar por internet.
El código del evento «After record added» es:
// get information about uploaded files $fileArray = my_json_decode($values["files"]); $fileArray[1] = $fileArray[0]; // Duplicate file reference $fileArray[1]['name'] = substr($fileArray[0]['name'], 0, -4).'.png'; $fileArray[1]['usrName'] = substr($fileArray[0]['usrName'], 0, -4).'.png'; $fileArray[1]['type'] = 'image/png'; // Cover of the PDF $imagick = new Imagick(); $imagick->readImage(__DIR__.'/../'.$fileArray[0]['name'].'[0]'); $imagick = $imagick->flattenImages(); $imagick->writeImage(__DIR__.'/../'.$fileArray[1]['name']); $fileArray[1]['size'] = filesize(__DIR__.'/../'.$fileArray[1]['name']); // update values of the field that stores file names $values["files"] = my_json_encode($fileArray); $data = array(); $keyvalues = array(); $data["files"] = $values['files']; $keyvalues["id"] = $values['id']; DB::Update("imagick", $data, $keyvalues );
Para cualquier duda o necesidad, contactar conmigo a través de mi email: [email protected].
Os facilito el proyecto para que lo descarguéis y configuréis en vuestro PC y podáis hacer cuantos cambios necesitéis