Como sabéis, he creado varios artículos contando cómo crear documentos e informes en PDF y otros formatos.
En general, son buenas opciones, pero para aquellos que programan poco en PHP, tienen muchas dificultades en utilizarlos, más si lo que se pretende en conseguir que esos documentos tengan el formato PDF.
Espero que esta propuesta sea más sencilla, pues son muchos usuarios los que con la solución estándar de PHPRunner para construir documentos a partir de HTML se “vuelve locos ajustando” los datos para que los documentos tengan un aspecto correcto y sobre todo, controlado.
Objetivo
Construir documentos PDF de forma sencilla (una plantilla y relleno de los huecos con datos variables), para quedar totalmente integrado en los desarrollos de PHPRunner.
DEMO: https://fhumanes.com/pdf_fpdm
El botón PDF está en la opción de visualización (VIEW)
Solución técnica
Algunas empresas y organismos públicos trabajan con formularios PDF. Crean la plantilla del documento (desde Word, Excel o cualquier otro producto) y a través de productos de pago, como Adobe Reader Profesional o Designer, les añaden a estos documentos las zonas en donde van a indicar los contenidos variables. Esto les permite que el usuario/ciudadano, rellene el formulario y lo puedan enviar a la empresa o administración.
Lo que he estado buscando es utilizar estos formularios, para rellenarlos con los datos de la aplicación y facilitar el documento PDF resultante al usuario/ciudadano, pero todo ello con software gratis y fácil de utilizar.
En el ejemplo, he hecho el documento de test con Excel. Está disponible en los fuentes.
Con el resultado, he generado el PDF a través de una impresora virtual que crea documentos PDF’s.
He editado el documento PDF con el programa PDFill ( Editor basic) . Si disponéis uno de pago u online, también lo podéis utilizar.
Para este y cualquiera de los demás ejemplos, siempre utilizo los documentos PDF trabajando las coordenadas en “puntos”, no en pulgadas o centímetros.
(1) En Tools podemos acceder a las opciones del producto y obtenemos la ventana (2).
(2) Podemos configurar muchos aspectos, pero el que muestro es dónde se cambia la medida.
(3) Nos sindica el tamaño de la página
(4) Nos va indicando las coordenadas en la posición del ratón.
(5) Es la opción para definir los campos del formulario. Como nosotros los queremos para imprimir, siempre utilizaremos el indicado en el dibujo.
(1) seleccionado o creamos el campo en la plantilla PDF. Con ello, podemos obtener la ventana de opciones de ese campo.
(2) indicamos el nombre que utilizamos para asignarle valor.
(3) Tenemos que ponerle “Read Only”, para que en el documento resultante el valor no se pueda cambiar.
(4) Podemos indicar la fuente que utilizaremos para rellenar el contenido.
(5) Podemos indicar el color del texto o contenido que va a disponer ese campo.
(6) Indicamos la alineación que va a tener el contenido del campo.
(7) Para los campos que va a disponer de más de 1 línea, tenemos que aplicar este check.
De esta forma definimos todos los campos del formulario y sus características.
Para utilizar el formulario he utilizado la librería de PHP fpdm en la documentación nos explica cómo utilizarla y además:
- Con sus opciones simples, no requiere nada más que PHP, por lo que no hay que instalar nada más en el servidor.
- No soporta los campos Check ni Radio.
- Que el formato del PDF que requiere es uno “especial” y que para situarlo en la versión que requiere, tenemos que hacer:
- Instalar en el equipo donde se preparan los formularios el programa Windows PDFtk. puedes descargarlo de: https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/
- Ejecutar este comando: pdftk “pdf origen” output “pdf destino” . El documento “destino” será la plantilla para el programa.
En concreto, en este ejemplo, el código para hacer el documento es:
<?php @ini_set("display_errors","1"); @ini_set("display_startup_errors","1"); require_once("../include/dbcommon.php"); // Recoger entorno de PHPRuner $id = $_SESSION['PDF_id']; $sql = "SELECT * FROM pdf_fpdm WHERE id = $id"; // Recueperar datos de la Base de Datos $rs = DB::Query($sql); $data = $rs->fetchAssoc(); require "fpdm_2.9.2/autoload.php"; $decimal = new \NumberFormatter("es-ES", \NumberFormatter::DECIMAL); $decimal->setAttribute(\NumberFormatter::MIN_FRACTION_DIGITS, 2); $decimal->setAttribute(\NumberFormatter::MAX_FRACTION_DIGITS, 2); // by default some locales got max 2 fraction digits $entero = new \NumberFormatter("es-ES", \NumberFormatter::DECIMAL); $entero->setAttribute(\NumberFormatter::MIN_FRACTION_DIGITS, 0); $entero->setAttribute(\NumberFormatter::MAX_FRACTION_DIGITS, 0); $formatterLong = new IntlDateFormatter('es_ES', IntlDateFormatter::LONG, IntlDateFormatter::LONG); $formatterLong->setPattern("d 'de' MMMM 'de' yyyy"); $formatterShort = new IntlDateFormatter('es_ES', IntlDateFormatter::LONG, IntlDateFormatter::LONG); $formatterShort->setPattern("dd/MM/yyyy"); $fields = $data; $fields['Decimal'] = $decimal->format($fields['Decimal']); $fields['Entero'] = $entero->format($fields['Entero']); $fields['Fecha1'] = $formatterShort->format(DateTime::createFromFormat('Y-m-d', $fields['Fecha1'])); $fields['Fecha2'] = $formatterLong->format(DateTime::createFromFormat('Y-m-d H:i:s', $fields['Fecha2'])); $fields['Check'] = $fields['Check'] == 1 ? 'X' : ''; $fields['Radio'] = $fields['Radio'] == 1 ? 'X' : ''; unset($fields['id']); // Los "fields", que no estén en formulario hay que borrarlos. $pdf = new FPDM('plantilla.pdf'); $pdf->Load($fields, true); // second parameter: false if field values are in ISO-8859-1, true if UTF-8 $pdf->Merge(); $pdf->Output('I','documento.pdf'); ?>
Como podéis apreciar, he definido formatos para números y fechas, dependiendo del idioma, en este caso he utilizado el español.
Los contenidos de los campos, aquellos que no sean “string” los debemos formatear.
Y así de sencillo queda.
Para cualquier duda o necesidad, escribirme a mi email [email protected]
Como siempre, os dejo los fuentes para que los descarguéis y cambies o ajustéis en vuestros PC’s.