0

Generar PDFs HTML en CodeIgniter 4 con Dompdf

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.

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

Ahora, creamos 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 post 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.