Crea documentos PDF fácilmente desde Laravel, por medio de la librería DomPDF, que permite generar el PDF a partir de código HTML.
La librería DomPDF es una sencilla alternativa para la construcción de PDF en PHP. Nos ofrece la posibilidad de crear los documentos PDF a partir de código HTML, que puede residir en un archivo, una cadena de texto, etc. A partir de ese código HTML crea un documento PDF que se puede descargar, almacenar en el servidor o cualquier otra operación que se desee.
Alternativas para crear PDF en PHP hay varias, pero esta es interesante por no depender de otros programas de compleja instalación. Genera el PDF con bastante fidelidad a partir del código HTML y soporta casi todo el CSS de nivel 2 y algo de CSS 3. De todos modos, si no es la que te interesa, puedes consultar otros artículos de DesarrolloWeb.com donde ya hemos tratado la creación de PDF por ejemplo con FPDF.
Yo la seleccioné porque necesitaba una herramienta que me permitiese crear documentos con cabecera y pie de página, que se repitieran a lo largo de todas las páginas del PDF. Eso se consigue a partir de un código HTML sencillo que luego veremos.
La mayor precaución que se debe tomar para usar la librería DomPFD con mejores resultados es tener un HTML de origen bien formado. Se lleva mal con el HTML incorrecto, por lo que no es mala idea contar con alguna otra librería como Tidy o HTML Purify que pueden ayudar al filtrar cosas y saber si el HTML está correcto.
Instalación de DomPDF para PHP
La instalación se realiza en Laravel por medio de un “wraper” o envoltura, que nos ofrece directamente el “service provider” que necesitamos para integrarlo en el framework. Lo podemos instalar usando Composer, que ya sabemos es el gestor de paquetes para PHP.
Para agregar la dependencia que necesitamos, lanzamos el siguiente comando:
composer require barryvdh/laravel-dompdf
Eso nos descargará el propio wraper, pero también todas sus dependencias que no tengamos todavía como la librería DomPDF.
Alternativa más manual de instalación de laravel-dompdf
Otra alternativa para instalación sería editar directamente el archivo composer.json agregamos esta dependencia en el objeto “require”
"barryvdh/laravel-dompdf": “0.8.*"
Luego ejecutamos en la terminal, desde la raíz del proyecto, el comando:
composer update
Asociar el ServiceProvider para versiones 5.x
Ahora nos queda asociar este service provider en nuestro archivo config/app.php
Nos dirigimos a la lista de todos los proveedores de servicio y en el array 'providers' agregamos:
Barryvdh\DomPDF\ServiceProvider::class,
Este paso no es necesario en versones más recientes de Laravel, desde Laravel 6 en concreto.
Añadir la fachada "PDF"
Además, opcionalmente podremos incluir la fachada que nos proporciona esta librería. Se trata de una envoltura, o “facade”, ya sabes, una fachada para ahorrar un poco de código a la hora de usar esta clase por medio de funciones. Esta la tienes que configurar en el array ‘aliases’, también sobre el mismo config/app.php
.
'PDF' => Barryvdh\DomPDF\Facade::class,
En principio esta fachada también está disponible sin necesidad de declararla en los aliases, si estás en Laravel 6 o superior.
Usar DomPDF desde Laravel
A partir de ahora ya estamos en posición de usar DomPDF desde Laravel. Dependiendo de cómo esté tu aplicación trabajarás con la librería desde un controlador o desde otro lugar. Vamos a ir a lo simple, usando la librería directamente desde el sistema de rutas, pero asumimos que no será lo más habitual, como has aprendido en el Manual de Laravel.
El HTML de origen para la generación del PDF también puede llegar desde varios sitios, un archivo, una vista, o una simple cadena de texto que tengas en una variable. En este caso vamos a traernos el HTML que nos genera una vista dentro de Laravel. Además, como estarás comprobando en el código siguiente, estamos usando DomPDF a través de su fachada.
Route::get('/test/', function () {
$pdf = PDF::loadView('pruebaparapdf');
return $pdf->download('pruebapdf.pdf');
});
En la primera línea generamos el PDF, gracias al método PDF::loadView()
, indicando el nombre de la vista que hemos usado.
En la segunda línea tenemos una de las varias opciones que podemos implementar para la distribución de este PDF, por medio del método download()
, indicando el nombre del archivo que se generará para descarga. El resultado es que nuestro navegador descargará el archivo y tendrá el nombre pruebapdf.pdf
.
Recuerda que si estás dentro de un controller tendrás que hacer el correspondiente "use" de la fachada, declarando el acceso al espacio de nombres de esta manera:
use PDF;
HTML para generar un PDF
En esta librería solamente necesitamos generar el HTML del contenido que queremos convertir a PHP, lo que facilita mucho las cosas. Como has visto, puedes usar cualquier vista de Blade para generar tu HTML de una manera sencilla y a partir de este HTML que se genere el PDF.
Rutas de los archivos externos
Cuando creas un PDF puedes usar archivos "externos" como por ejemplo imágenes, o una declaración de estilo. No hay problema alguno con ello, pero es muy importante que todas las rutas las asignes de manera absoluta, comenzando por http://
.
Para que las rutas te funcionen igualmente en local y en remoto es útil apoyarte en la variable de entorno de la URL de la aplicación Laravel, APP_URL
en el .env
, que tendrá su valor diferente en desarrollo y producción.
La definición de la variable de entorno se hace en el APP_URL
del .env
.
Por ejemplo, así podemos enlazar con una hoja de estilos externa:
<link href="{{ env('APP_URL') }}/css/pdf/memorias.css" rel="stylesheet">
Generar cabecera y pie de página común para todas las páginas del PDF
Como decía, lo que me pareció interesante de esta librería es la posibilidad de generar cabecera y pie de página para todas las páginas del documento. Eso se consigue simplemente con un HTML y un poco de CSS para posicionamiento de los elementos que van a servir como contenedores del pie y cabecera de la página.
Como verás en el ejemplo, se puede generar hasta la numeración de las páginas, algo muy útil cuando tienes informes largos que generar en PDF.
<html>
<head>
<style>
body{
font-family: sans-serif;
}
@page {
margin: 160px 50px;
}
header { position: fixed;
left: 0px;
top: -160px;
right: 0px;
height: 100px;
background-color: #ddd;
text-align: center;
}
header h1{
margin: 10px 0;
}
header h2{
margin: 0 0 10px 0;
}
footer {
position: fixed;
left: 0px;
bottom: -50px;
right: 0px;
height: 40px;
border-bottom: 2px solid #ddd;
}
footer .page:after {
content: counter(page);
}
footer table {
width: 100%;
}
footer p {
text-align: right;
}
footer .izq {
text-align: left;
}
</style>
<body>
<header>
<h1>Cabecera de mi documento</h1>
<h2>DesarrolloWeb.com</h2>
</header>
<footer>
<table>
<tr>
<td>
<p class="izq">
Desarrolloweb.com
</p>
</td>
<td>
<p class="page">
Página
</p>
</td>
</tr>
</table>
</footer>
<div id="content">
<p>
Lorem ipsum dolor sit...
</p><p>
Vestibulum pharetra fermentum fringilla...
</p>
<p style="page-break-before: always;">
Podemos romper la página en cualquier momento...</p>
</p><p>
Praesent pharetra enim sit amet...
</p>
</div>
</body>
</html>
Eso es todo. Es así de simple. Puedes incluir imágenes y otros tipos de contenido, aplicando estilos CSS que podrías incluso tener en archivos aparte. Ahora es simplemente documentarse, aunque la verdad es que no se encuentra mucha información (y eso es un punto flaco) a no ser la página del repositorio de github de DomPDF.
Miguel Angel Alvarez
Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...