Generar PDFs HTML en CodeIgniter 4 con Dompdf

- Andrés Cruz

In english
Generar PDFs HTML en CodeIgniter 4 con Dompdf

Los PDFs por sus siglas Portable Document Format, es un formato de archivo ampliamente utilizado para presentar y compartir documentos digitales de forma segura y confiable, tienen la característica que no pueden ser editados de manera directa, como ocurre con un documento de texto,  pueden contener texto e imágenes y se pueden visualizar en la mayoría de los dispositivos y sistemas operativos a través de programas como Adobe o tan fácilmente como los navegadores web.

En Codeigniter aunque no tenemos muchos paquetes específicos para el framework, disponemos de emplear paquetes regulares para PHP; en este caso de los PDF no es la excepción y en principio podríamos emplear cualquier paquete que sea para PHP para CodeIgniter empleando por supuesto composer para esta labor.

¿Qué es Dompdf?

Dompdf es un conversor de HTML a PDF. En esencia, dompdf es (principalmente) un motor de renderizado y diseño HTML compatible con CSS 2.1 escrito en PHP. Es un renderizador basado en estilos: descargará y leerá hojas de estilo externas, etiquetas de estilo en línea y los atributos de estilo de elementos HTML individuales.

El siguiente ejemplo muestra cómo usar Dompdf para convertir HTML y generar PDF con una configuración mínima.

  • Especifique el contenido HTML en el método loadHtml() de la clase Dompdf.
  • Renderiza HTML como PDF usando el método render().
  • Envíe el PDF generado al navegador utilizando el método stream().

Idealmente, el formato PDF se utiliza para leer la información en forma de documento. El archivo PDF se indica con la extensión de archivo .pdf y significa Formato de documento portátil. Un documento PDF manifiesta información para libros electrónicos, formularios de solicitud, manuales de usuario y otros documentos.

En este tutorial, damos por hecho que es un desarrollador en Codeigniter y desea saber cómo crear un archivo PDF a partir de una plantilla de vista HTML usando la biblioteca domPDF.

Muchos desarrolladores novatos se quedan atascados cuando se trata de la conversión de HTML a PDF. Tranquilo, te lo vamos a poner fácil. Al final de este tutorial, puede generar un archivo PDF a partir del diseño HTML con la biblioteca DomPDF.

 

En esta entrada, vamos a emplear Dompdf por su facilidad y tiempo en el mercado, es una solución ideal para cuando queremos trabajar con los PDFs en PHP; su uso es simple:

Especificamos el HTML que queremos convertir a pdf:

$dompdf->loadHTML('<h1>Hola Mundo</h1><br><p>Otro contenido</p>');

Indicamos el tamaño de la hoja:

$dompdf->setPaper('A4', 'portrait');

Generamos el PDF:

$dompdf->render();

Iniciamos la descarga:

$dompdf->stream();

Instalar Dompdf en CodeIgniter:

Como veníamos hablando, instalaremos Dompdf mediante composer:

composer require dompdf/dompdf

https://github.com/dompdf/dompdf

Crear un controlador PDF

Ya con esto, estamos completamente listos para usar Doompdf en nuestra aplicación, empezando, para crear una instancia:

$dompdf = new Dompdf();

Y generamos el pdf y renderizamos:

$dompdf->loadHTML('<h1>Hola Mundo</h1><br><p>Otro contenido</p>');
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
$dompdf->stream();

En el caso de CodeIgniter 4, tenemos las funciones de view que nos devuelve el HTML en el controlador; así que las podemos emplear perfectamente en vez de un HTML establecido desde el controlador:

$dompdf = new Dompdf();
$dompdf->loadHTML(view("dashboard/product/trace_pdf", $data));
$productModel = new ProductModel();
$product = $productModel->asObject()->find($productId);

Para mi curso de CodeIgniter 4, que estamos creando una app de almacén para el inventario, hacemos las consultas respectivas a la base de datos, y por eso es la consulta a la base de datos mediante querys, ya aqui tienes que obtener toda la data la cual vas a emplear para componer tu vista/pdf:

$dompdf = new Dompdf();
//$dompdf->loadHTML('<h1>Hola Mundo</h1><br><p>Otro contenido</p>');
$productModel = new ProductModel();
$product = $productModel->asObject()->find($productId);
$query = $productModel->asObject()->select("pc.*, u.email, puc.description, puc.direction")
            ->join('products_control as pc', 'pc.product_id = products.id')
            ->join('users as u', 'pc.user_id = u.id')
            ->join('products_users_control as puc', 'pc.id = puc.product_control_id');
$data = [
            'product' => $product,
            'trace' => $query->where('products.id', $productId)
                ->findAll()
];
$dompdf->loadHTML(
            view("dashboard/product/trace_pdf", $data)
);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
$dompdf->stream();

La vista, luce de la siguiente manera:

<style>
    * {
        color:blue
    }
</style>
<p>
    Ventas y compras de <?= $product->name ?>
</p>
<ul>
    <li>
        Precio <?= $product->price ?>
    </li>
    <li>
        Última Entrada <?= $product->entry ?>
    </li>
    <li>
        Última Salida <?= $product->exit ?>
    </li>
</ul>
<table>
    <thead>
        <tr>
            <th>
                ID
            </th>
            <th>
                Fecha
            </th>
            <th>
                Tipo
            </th>
            <th>
                Cantidad
            </th>
            <th>
                Usuario
            </th>
            <th>
                Descripción
            </th>
            <th>Dirección</th>
            <th>
                Precio
            </th>
            <th>
                Total
            </th>
        </tr>
    </thead>
    <tbody>
        <?php $total = 0 ?>
        <?php foreach ($trace as $key => $t) : ?>
            <tr>
                <td>
                    <?= $t->id ?>
                </td>
                <td>
                    <?= $t->created_at ?>
                </td>
                <td>
                    <?= $t->type ?>
                </td>
                <td>
                    <?= $t->count ?>
                </td>
                <td>
                    <?= $t->email ?>
                </td>
                <td>
                    <?= $t->description ?>
                </td>
                <td>
                    <?= $t->direction ?>
                </td>
                <td>
                    <?= $product->price ?>
                </td>
                <td>
                    <?php $total += $product->price * $t->count ?>
                    <?= $product->price * $t->count ?>
                </td>
            </tr>
        <?php endforeach ?>
        <tr>
            <td colspan="8">Total</td>
            <td><?= $total ?></td>
        </tr>
    </tbody>
</table>

Y esto es todo, aquí lo importante es que podemos extender el framework con cualquier paquete de PHP fácilmente empleando composer, que es la forma recomendada cuando instalamos CodeIgniter 4.

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz en Udemy

Acepto recibir anuncios de interes sobre este Blog.