Una necesidad bastante común en el desarrollo de aplicaciones basadas en web (Especialmente las que se usan dentro de ambientes corporativos) es la de emitir reportes.
Una forma simple de resolver este problema es la generación de páginas html cuyo único objeto es ser impresas y dejar al usuario la decisión de guardarlas en lugar de imprimirlas.
Si bien esta solución puede ser suficiente cuando se trata de emitir un reporte a un usuario, ciertamente no es lo ideal cuando se trata de intercambiarlo con algún otro sistema.
Particularmente en este artículo voy a mostrarte algunas formas de generar archivos pdf usando PHP.
Librería PDF de PHP
Existe una extensión de PHP llamada PDF, la cual está basada en la librería PDFlib (Desafortunadamente, una librería propietaria).
Esta librería debe ser instalada como una extensión PECL y su uso no es particularmente cómodo.
Veamos un ejemplo:
<?php $pdf = pdf_new(); pdf_open_file($pdf); pdf_begin_page($pdf, 300, 300); pdf_save($pdf); pdf_translate($pdf, 100, 100); pdf_rotate($pdf, 45); pdf_rect($pdf, 0, 0, 20, 20); pdf_stroke($pdf); pdf_end_page($pdf); pdf_close($pdf);
La librería provee un conjunto de funciones (no agrupadas en clases) y define un nuevo tipo de recurso (Similar a un archivo, sólo que específico para PDFs).
A pesar de su aspecto rústico, PDF es probablemente la librería más versátil en cuanto a manejo de archivos de este tipo (y, a su vez, la de más bajo nivel).
FPDF
FPDF es un paquete sencillo. Se trata de una clase y una serie de archivos de fuentes (fonts) que pueden usarse para generar archivos pdf.
Un ejemplo de su utilización es este:
<?php require('fpdf.php'); $pdf = new FPDF(); $pdf->AddPage(); $pdf->SetFont('Arial','B',16); $pdf->Cell(40,10,'¡Hola, Mundo!'); $pdf->Output();
El constructor de la clase recibe los parámetros para crear el marco de trabajo:
- Orientación de la hoja (Portrait o Landscape)
- Unidad de medida (mm para milímetros)
- Tamaño de la página (A3, A4, A5)
El método Output es el que efectivamente produce el pdf. Si no se aclara nada, la salida se envía al navegador, aunque puede ser redirigida a un archivo local para ser enviado a otro servidor (entre otras posibilidades):
$pdf->Output('F', 'salida.pdf');
El método Cell tiene que ver con el modo en que FPDF genera la salida: las páginas están divididas en celdas rectangulares contiguas.
En todo momento existe un puntero a la posición actual dentro de la hoja y es esa posición la que se tomará como inicio de la celda sobre la que se quiera trabajar.
En este ejemplo se está creando una nueva celda de 40 mm de ancho por 10 de alto y en ella se está escribiendo el texto «¡Hola, Mundo!» (Usando la tipografía Arial de 16 puntos y en negrita).
Puedes consultar más información en FPDF
mPDF
mPDF es una librería algo más moderna. Su objetivo es presentarse como una opción de más alto nivel que FPDF.
La principal diferencia es que mPDF toma textos HTML y los convierte en PDF, haciendo la tarea mucho más sencilla para el desarrollador (Aunque puede resultar bastante menos eficiente).
Su instalación se realiza usando composer:
composer require mpdf/mpdf
Su uso puede ser tan sencillo como:
<?php require_once __DIR__ . '/vendor/autoload.php'; $mpdf = new \Mpdf\Mpdf(); $mpdf->WriteHTML('<h1>¡Hola, Mundo!</h1>'); $mpdf->Output();
También es posible realizar ciertas configuraciones (como en FPDF) para, por ejemplo, definir que la hoja estará apaizada:
$mpdf = new \Mpdf\Mpdf(['orientation' => 'L']);
Puedes consultar la información completa en el manual de uso de mPDF.
¿Cuál es la mejor opción para generar PDFs con PHP?
Las opciones son varias y, como de costumbre, dependerá del caso particular al que te enfrentes (y los recursos que tengas disponibles) cuál sea la más conveniente (¡Hasta podrías hacer tu propia implementación!).
Lo importante es que conozcas estas posibilidades para no tener que re-inventar la rueda :).
Excelente ayuda.
Una consulta, que se debe hacer para poder generar un archivo pdf que no pese mas de 100kb. Ahora utilizo la libreria FPDF el archivo se genera pero el peso es de 900kb, he verificado las imágenes y son png de 10kb. mas el texto y lineas no deberia de ser tan pesado el archivo. Gracias por su atención.
Hola Juan!
Graicas por tus palabras 🙂
Algo que puede estar influyendo en el tamaño del archivo pdf son las tipografías. Verifica si no están quedando embebidas.
Saludos!
Excelente Nota Mauro. Casualmente hace poco, tuve la necesidad de generar pdfs desde php y termine inclinándome por mPDF. Bastante aceptable el resultado. No conocía la librería de PHP. Y como dice tu principal máxima «seguramente PHP tiene algo para hacerlo».
Abrazo y Feliz Año
Gracias Juan!!
Me alegro que te haya ayudado 🙂
Feliz año!!!