Crear PDF usando HTML

Para crear PDF usando HTML 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 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 libería solo 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 la función 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 la función 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 la función example2() del 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 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, 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 pacial (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 crear PDF usando HTML, 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


One thought on “Crear PDF usando HTML”

Deja un comentario

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

© Kumbia Team