Crear PDF usando HTML

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.

Ejemplo de crear PDF con HTML
Ejemplo de crear PDF con HTML

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:

Ejemplo 3 De HTML a PDF
Ejemplo 3 De HTML a PDF

Estos fueron tres ejemplos básicos para generar PDF usando HTML con PHP.

Segunda Parte de HTML a PDF

Exportar tabla 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.


9 thoughts on “Crear PDF usando HTML”

  1. 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!!!

  2. 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.

  3. 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

  4. Hola amigo muy buen código pero una pregunta cómo le haces para programar el PDF en la página web pasa hack

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

© Kumbia Team