Creando documentos PDFs dinámicos con PHP

Cuando tenemos una aplicación web, es muy común que tengamos que generar un archivo PDF con datos extraídos de una base de datos para crear por ejemplo: informes, catálogos, facturas, documentos, etc.

El uso de algunas de estas librerías para PHP puede llegar a ser demasiado complicado, así que vamos a hacer uso de la librería mPDF que nos permite generar PDFs en base a un código HTML y CSS.

Los resultados que vamos a obtener van a ser muy buenos en función del código HTML usado, aunque también podemos usar otras librerías más complejas pero con resultados más profesionales como es el caso de ezPDF, aunque para un sencillo ejemplo mPDF nos será suficiente.

Generando PDFs dinámicos con mPDF en base a un código HTML y CSS


Con mPDF podemos seleccionar múltiples opciones, como la resolución del documento generado, añadir fuentes propias o incluso hacer uso de CSS3. A continuación vamos a mostrar un pequeño ejemplo que especificamos la cabecera, cuerpo y pie del documento.

<?php

$cabecera = "<span><b>Mi primer documento PDF dinámico con mPDF</b></span>";

$cuerpo = "<html>
<body>
<br/>
<h1>¡Hola mundo!</h1>
<br/>
<div>
<p>A continuación mostramos algunos <u>datos</u></p>
<table style='width:200px;text-align:center;'>
<thead>
<tr>
<th>A</th>
<th>B</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>2</td>						
</tr>
<tr>
<td>3</td>
<td>4</td>						
</tr>
</tbody>
</table>
</div>
<div>
<p>Aquí podemos introducir datos dinámicos desde PHP</p>
</div>
</body>
</html>";

$pie = "<span>
<a href=\"http://www.imaginanet.com\">Diseño y Programación Web: Imaginanet</a>
 - <i>Creado ".date("d/m/Y")."</i>
</span>";

include("mpdf/mpdf.php");
$mpdf=new mPDF();
$mpdf->SetHTMLHeader($cabecera);
$mpdf->SetHTMLFooter($pie);
$mpdf->WriteHTML($cuerpo);
$mpdf->Output();

?>

 

Como podemos ver, es más complicado la maquetación que el uso de PHP. En la maquetación podemos hacer uso de todos los tags HTML, aunque no tienen un comportamiento 100% al de un navegador, así que deberemos adaptarnos a la salida que mPDF produce.

Podéis ver el resultado final del documento PDF generado dinámicamente mediante PHP en este enlace.

Automatizando nuestro script

Es muy común que cuando generamos un catálogo este sea muy pesado. Mediante mPDF, si se trata de un catálogo de unas cincuenta páginas puede tardar fácilmente unos 30 o 40 segundos en generarlo si este tiene un buen número de imágenes. Si nuestra web tiene una gran cantidad de tráfico y sumado a indexación que realizan los buscadores, puede afectar al rendimiento de nuestro servidor.

Para solucionarlo, una buena opción es generar estos documentos automáticamente cada cierto tiempo, como por ejemplo una vez a la semana o una vez al día, y que la descarga se produzca sobre un archivo estático.

Linux


Vamos a hacer uso de la herramienta crontab, un sencillo ejemplo podría ser añadir la siguiente línea a nuestro archivo /etc/crontab:

50 8 * * 1 root php /var/www/vhosts/test-domain.yy/httpdocs/cron/generacion_pdf.php


Esto ejecutaría todos los lunes a las 8:50 de la mañana el archivo /var/www/vhosts/test-domain.yy/httpdocs/cron/generacion_pdf.php como el usuario root.
 

Plesk

Dentro del dominio donde corra nuestro script, tenemos un apartado de tareas programadas que guarda el mismo formato que el crontab de Linux.

Enlaces relacionados

Comentarios

Comentario de erika - 06 de Noviembre de 2012 - 19:18
buenissima la ayuda gracias...me ayudo bastante
Comentario de Daniel - 03 de Diciembre de 2012 - 14:48
Mil pero mil gracias!!!!! ya habia usado esta libreria pero siempre tuve problemas con el header y el footer ya que solo los ponia en la ultima pagina. Gracias a tu post me di cuenta que tanto el header como el footer deben setearse antes de llamar a la funcion WriteHTML para que los coloque en todas las paginas. De nuevo, muchas gracias....
Comentario de Hugo German - 01 de Agosto de 2014 - 04:42
Muchas gracias, me ha sido de mucha utilidad
Comentario de darwin perez - 19 de Septiembre de 2014 - 13:12
buenos dias tengo una duda como puedo hacer para modificar los margenes a un archivo mpdf
Comentario de Tommi - 22 de Abril de 2016 - 21:49
Y si quiero insertar una imagen? cual seria el codigo?
Ha habido un error en el envío
Comentario enviado. Será revisado por la moderación antes de ser publicado.

Deja tu comentario

Tu nombre:
Tu email:
Tu comentario: