Las cookies nos permiten ofrecer nuestros servicios. Al utilizar nuestros servicios, aceptas el uso que hacemos de las cookies. Más Información. Aceptar

Crear PDF a partir de un HTML, en PHP

Vicente Herrera
  • Escrito por Vicente Herrera el 22 de Abril de 2016
  • 1 min de lectura | Programación
Crear PDF a partir de un HTML, en PHP
El reproductor de video será cargado en breves instantes.

Generar documentos PDF desde una web es una necesidad muy común para cualquier proyecto. Pero tras lidiar con las dificultades que ya de por si plantea la maquetación HTML y CSS de lo que se quiere exponer en una web, volver a tener que componer los mismos resultados para construir un documento PDF de manera programática se antoja una tarea poco atractiva. ¿No hay alguna manera de plantea esto de forma más sencilla? Afortunadamente si que lo hay.

En primer lugar, no podemos dejar de mencionar la posibilidad de establecer en CSS3 mediante media queries con @media print una alternativa visual de la página actual para impresión. En ella podemos retirar imágenes y colores sólidos de fondo, elementos de navegación y otros elementos con poca utilidad en el papel, para obtener un resultado bastante decente. Esto es lo que hacen en muchos casos diferentes webs, lanzando esta versión de impresión con el mismo HTML de la página, y forzando por Javascript el diálogo de impresión al usuario. Navegadores como Google Chrome traen incorporada de forma nativa la opción de impresión de generar en su lugar un fichero PDF con el resultado.


Si realmente es imprescindible generar nosotros dicho fichero, podemos continuar desde un planteamiento como el anterior. Ya tenemos una pantalla resultado que mostramos por web al usuario, y le hemos añadido CSS adicional para adaptarla a impresión. Ahora nos gustaría convertir este resultado en un fichero PDF que enviar al usuario.

Para ello, podemos utilizar una librería como DomPDF, disponible como software libre en: https://github.com/dompdf/dompdf .

Es importante descargar una de las versiones release que sea estable: https://github.com/dompdf/dompdf/releases .

Si copiamos la librería en una carpeta dompdf, podemos escribir un sencillo ejemplo con un fichero como este de ejemplo:

<?php

require_once 'dompdf/autoload.inc.php';
use Dompdf\Dompdf;

if ( ! isset($_GET['pdf']) ) {
	$content = '<html>';
	$content .= '<head>';
	$content .= '<style>';
	$content .= 'body { font-family: DejaVu Sans; }';
	$content .= '</style>';
	$content .= '</head><body>';
	$content .= '<h1>Ejemplo generaci&oacute;n PDF</h1>';
	$content .= '<a href="index.php?pdf=1">Generar documento PDF</a>';
	$content .= '</body></html>';
	echo $content;
	exit;
}

$content = '<html>';
$content .= '<head>';
$content .= '<style>';
$content .= '</style>';
$content .= '</head><body>';
$content .= '<h1>Ejemplo generaci&oacute;n PDF</h1>';
$content .= 'Almacena en una variable todo el contenido que quieras incorporar ';
$content .= 'en el documento <b>formato HTML</b> para generar a partir de &eacute;ste ';
$content .= 'el documento PDF.<br><br>';
$content .= 'Ejemplo lista<br>';
$content .= '<ul><li>Uno</li><li>Dos</li><li>Tres</li></ul>';
$content .= 'Ejemplo imagen<br><br>';
$content .= '<img src="logo-openwebinars.png" alt="" />';
$content .= '</body></html>';

echo $content; exit;

$dompdf = new Dompdf();
$dompdf->loadHtml($content);
$dompdf->setPaper('A4', 'landscape'); // (Opcional) Configurar papel y orientación
$dompdf->render(); // Generar el PDF desde contenido HTML
$pdf = $dompdf->output(); // Obtener el PDF generado
$dompdf->stream(); // Enviar el PDF generado al navegador

Tenemos que tener en cuenta unas cuantas cosas para utilizar esta librería:

  • Es necesario que el servidor PHP tenga activados y operativos ciertos módulos, consultelos en la página: https://github.com/dompdf/dompdf/wiki/Requirements

  • La librería no soporta elementos con propiedad CSS float (esto también ocurre en otros ámbitos, como en el diseño de newsletters, por lo que es interesante siempre que se esté diseñando contenido HTML y CSS no basarse mucho en esta propiedad para compatibilidad con otros medios como éste). También hay que recordar que el estándar que reconoce es CSS 2.1, y un poco de CSS3.

  • El estándar PDF soporta unas pocas fuentes por defecto pero solo en formato ANSI, sin posibilidad de utilizar acentos ni eñes. La librería viene con un conjunto de fuentes DejaVu TrueType para contar con una representación Unicode completa. En cualquier caso, siempre es conveniente utilizar entidades HTML para los caracteres especiales, como en el ejemplo.

  • La librería tiene poca tolerancia a HTML mal formado, a diferencia de los navegadores modernos. Es útil validar que el HTML que se quiere utilizar de base es correcto a la hora de depurar errores.

  • El estándar CSS tiene ciertas propiedades que facilitan la composición para impresión muy útiles para generar los ficheros PDF, como page-break-inside y page-break-after para controlar qué elementos pueden quedar en mitad de una página y la siguiente. Consulta alguna documentación sobre CSS para aprender más sobre ellos.

Estas son algunas de las empresas que ya confían en OpenWebinars

Profesores y profesionales

Nuestros docentes son profesionales que trabajan día a día en la materia que imparten

Conviértete en profesor de OpenWebinars