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.

Deja una respuesta

Your email address will not be published. Required fields are marked *