Para crear PDF usando HTML con PHP existen diferentes librerías que nos pueden ayudar a cumplir el objetivo de manera sencilla, esta vez vamos a probar mPDF. mPDF es una librería en PHP la cual permite generar archivos PDF usando HTML(Codificado con UTF-8). Está basada en FPDF y HTML2FPDF, con varias mejoras, fue escrito por Ian Back y lanzado bajo licencia GNU GPL v2.
Instalación de mPDF
El método de instalación oficial de mPDF en PHP es via composer y este es el paquete packagist: mpdf/mpdf.
composer require mpdf/mpdf
Cargando la librería
Como es un ejemplo básico realizaremos la carga de la librería sólo en el controlador que vamos a usar. De la siguiente manera:
Archivo: default/app/controllers/index_controller.php
<?php // Require composer autoload require_once APP_PATH . '../../vendor/autoload.php'; use Mpdf\Mpdf; /** * * Controller por defecto si no se usa el routes * */ class IndexController extends AppController { public function index() { } }
Primer ejemplo de crear PDF usando HTML
Creamos el método example1() donde sin usar vista o template creamos el «Hola mundo» del uso de la librería con el siguiente código:
Archivo: default/app/controllers/index_controller.php
public function example1() { //Importante: Sin vista y sin tamplate View::select(null, null); //Crea una instancia de la clase y le pasa el directorio default/app/temp/ $mpdf = new Mpdf(['tempDir' => APP_PATH . '/temp']); //Escribe algo de contenido HTML: $mpdf->WriteHTML('¡Hola KumbiaPHP!'); //Envía un archivo PDF directamente al navegador $mpdf->Output(); }
Dependiendo de la configuración del navegador nos mostrará en su visualizador de PDFs el documento creado. En caso contrario nos mostrará el diálogo para iniciar la descarga.
Segundo ejemplo ¡Usaremos vistas!
El primer ejemplo está bien, pero a nosotros nos gusta darle más orden y para mantener la lógica en su lugar. Vamos a crear un modelo llamado HtmlToPdf (Pueden llamarlo como deseen) y es donde a partir de ahora vamos a crear los archivos PDF, pero esta vez llamaremos el contenido de un partial, el cual nos servirá para mantener separado el HTML del PHP. Primero observemos el contenido del partial:
Archivo: default/app/views/_shared/partials/pdf/example2.phtml
<h1>¡Hola KumbiaPHP!</h1>
Ahora si el método example2() en el modelo:
Archivo: default/app/models/html_to_pdf.php
<?php use Mpdf\Mpdf; class HtmlToPdf { public static function example2() { // Activa el almacenamiento en búfer de la salida ob_start(); // Carga el contenido del partial View::partial('pdf/example2'); // Obtiene en $html el contenido del búfer actual y elimina el búfer de salida actual $html = ob_get_clean(); // Crea una instancia de la clase y le pasa el directorio temporal $mpdf = new Mpdf(['tempDir' => APP_PATH . '/temp']); // Escribe algo de contenido HTML: $mpdf->WriteHTML($html); // Envia un archivo PDF directamente al navegador $mpdf->Output(); } }
Ahora simplemente en el controlador sin usar vista ni template llamaremos el método example2() de la clase modelo HtmlToPdf
Archivo: default/app/controllers/index_controller.php
public function example2() { //Importante: Sin vista y sin tamplate View::select(null, null); //Llama al ejemplo 2 HtmlToPdf::example2(); }
El código anterior hace exactamente lo mismo que el primer ejemplo, la diferencia es que esta vez usamos MVC. En el modelo añadimos la lógica para crear el documento pdf a partir de una vista parcial (partial), usamos el controlador para llamar el método implementado en el modelo.
Podemos añadir todo el HTML que deseemos siempre y cuando sea compatible con mPDF, eso nos da juego para añadir tablas, imágenes, enlaces, añadir estilos con css, etc.
Ejemplo 3
Vamos a hacer esta vez que el método del modelo reciba un parámetro $name y se lo pase a la vista parcial (partial) pdf/example3.
public static function example3($name) { // Activa el almacenamiento en búfer de la salida ob_start(); // Carga el contenido del partial pasandole datos View::partial('pdf/example3', '', ['name' => $name, 'date' => date(DATE_ISO8601)]); // Obtiene en $html el contenido del búfer actual y elimina el búfer de salida actual $ html = ob_get_clean(); // Crea una instancia de la clase y le pasa el directorio temporal $mpdf = new Mpdf(['tempDir' => APP_PATH . '/temp']); // Escribe algo de contenido HTML: $mpdf->WriteHTML($html); // Obliga la descarga del PDF y se personaliza el nombre $mpdf->Output('example3.pdf', \Mpdf\Output\Destination::DOWNLOAD); }
Ahora haremos que el partial reciba el valor de las variables y las imprima para que se muestre en el PDF.
Archivo: default/app/views/_shared/partials/pdf/example3.phtml
<h1>¡Hola <?= $name ?>!</h1> <p> Este documento fue generado el <?= $date ?> </p>
Si entramos a la URL: http://localhost:8184/index/example3/Henry nos descargará el PDF con el nombre example3.pdf y veremos algo como la siguiente captura de pantalla:
Estos fueron tres ejemplos básicos para generar PDF usando HTML con PHP.
Segunda Parte de HTML a PDF
Si desean que hagamos un nuevo tutorial con ejemplos avanzados y de la vida real dejen su comentario en la caja de abajo.
Descargar código completo
Como siempre, el código completo del ejemplo para crea documentos PDF con PHP está disponible para todos en el siguiente repositorio en Github listo para usar con Docker: https://github.com/henrystivens/kumbiaphp-mpdf
Nuevos ejemplos de mPDF
Puedes ver un ejemplo del PDF generado más completo funcionando en ejemplo mPDF y el código PHP de ejemplo controlador y template para usar con cualquier vista de HTML.
Excelente
Mas que excelente!!! realmente la comunidad es de grandiosa ayuda!. Me han asistido teniendo en cuenta que mi versión de php no era la compatible con composer y finalmente, lo he logrado gracias a @henrystevens y a @joanhey —
De paso sugiero, en caso de ser posible, algún tutorial como este pero para exportar un datatable a EXCEL.
Gracias!!!
Buen trabajo @henrystivens, tenia problemas al crear un PDF de forma interna para enviar como adjunto por correo, he podido finalizar desde el controlador donde cambio el estado a un acta con el uso de este tutorial, muy claro y completo.
Hola Eduardo,
Me alegra que te haya servido :)
NO FUNCIONO
Hola Anónimo.
Para poder ayudarte a solucionar debes dar más detalles sobre el problema que presentas, el ejemplo ha sido replicado e implementado por varias personas de la comunidad, además de que ahora el ejemplo se encuentra corriendo en vivo en: https://sandbox.kumbiaphp.com/templates-examples/info/pdf
Acá está el repositorio con ese y más ejemplos: https://github.com/KumbiaPHP/Sandbox
Hola muy buena explicación, tengo algunas dudas actualmente ya que estoy pasando una cantidad enorme de registros como 20000 que se deben de visualizar en el pdf y llega el momento en donde se detiene el proceso por falta de memoria cabe mencionar que ya hice algunos ajustes para aumentar memoria y tiempo de ejecucion, la pregunta seria si es posible de mandar por grupos de registros he ir construyendo dicho archivo para poder liberar memoria y poder generar dicho pdf
Hola amigo muy buen código pero una pregunta cómo le haces para programar el PDF en la página web pasa hack
Gerard
En el siguiente enlace se encuentra todo el código fuente necesario: https://github.com/henrystivens/kumbiaphp-mpdf
Y acá está otro repositorio con ese y más ejemplos: https://github.com/KumbiaPHP/Sandbox