Exportar a PDF con cabecera y pie de pagina

De KumbiaPHP Framework Wiki

Esta es una contribución inspirada en el excelente tutorial de Henrystivens, que puedes encontrar Aquí.
Quiero complementar agregando un encabezado y un pie de página que se repetirá cada vez que se generen más de una página en el documento.
Sin más preámbulo comencemos.
Lo primero que haremos es cargar la librería MPDF a través de composer.

$ composer require mpdf/mpdf


Nuestro Controlador

Aquí crearemos una nueva vista, la cual será llamada cada vez que deseamos exportar nuestro documento, yo recibiré el mensaje a mostrar a través de la variable $mensaje.

class TestController extends AppController {

    public function export($mensaje) {
//No mostramos template, como tampoco vista.
        View::select(null, null);
//llamamos al metodo estatico export de nuestro modelo Pdfreports pasando un titulo y un mensaje
        Pdfreports::export('Kumbieros',$mensaje);
    }

}

La Vista

Ahora crearemos nuestra vista, que tendrá la estructura de nuestro PDF, creamos el archivo en default/app/views/_shared/partials/reports/test/pdf.phtml

<html lang="es">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title>PDF de Prueba</title>
        <!-- Hacemos referencia a boostrap para dar algunos estilos a nuestro diseño-->
        <link href="<?php echo PUBLIC_APP ?>css/bootstrap/bootstrap.min.css" rel="stylesheet">
    </head>
    <style>
        /**        Agregamos diseño a nuestra tabla        **/
        .pdf-table th {
            padding-top: 6px;
            padding-bottom: 6px;
            text-align: left;
            background-color: #4CAF50;
            color: white;
        }
    </style>
    <body>
        <div class="text-center">
            <h3>TUTORIAL PDF</h3>
        </div>
        <br><br><br>
        <div class="container-fluid">
            <!-- Mostramos nuestro titulo, pasado a través del partials-->
            <table class="pdf-table">
                <tr>
                    <td colspan="4"><?php echo $titulo ?></td>
                </tr>
            </table>       
            <br>
            <!-- Mostramos nuestro titulo, pasado a través del partials-->
            <table>
                <tr>
                    <td><?php echo $mensaje ?></td>
                </tr>
            </table>          
        </div> 
    </body>
</html>


Modelo

Ahora crearemos nuestro modelo pdfreports.php en default/app/models.
Hacemos referencia a nuestro autoload.php de la siguiente forma en nuestro modelo

require_once ROOT_PATH . 'vendor/autoload.php';

use Mpdf\Mpdf;

class Pdfreports {

//Declaramos nuestro header y footer como propiedades estaticas
    private static $header_html = '
        <table width="100%">
        <tr>
            <td width="50%" align="left"><img src="http://wiki.kumbiaphp.com/images/wikibanner.png"></td>
            <td width="50%" align="right">Tutorial Encabezados y pie de Pagína</td>
        </tr>
</table><hr>
    ';
    private static $footer_html = "KumbiaPHP es un framework para aplicaciones web libre escrito en PHP.";

    public static function export($titulo, $mensaje) {

        // Se crea la instancia de la Clase y directorio temporal
        $mpdf = new Mpdf(['tempDir' => APP_PATH . '/temp']);

        //Establezco setAutMargin en stretch para establecer una distancia minima que se expande conforme al alto del encabezado 
        $mpdf->setAutoTopMargin = 'stretch';
        //establezco el HTML al header
        $mpdf->SetHTMLHeader(self::$header_html);

        //contenido de la vista alojada en el partials
        ob_start();
        View::partial('reports/test/pdf', false, array('titulo' => $titulo, 'mensaje' => $mensaje));
        // Obtiene en $html el contenido del búfer actual y elimina el búfer de salida actual
        $html = ob_get_clean();

        //agrego el footer de pagina y esta
        $mpdf->setAutoBottomMargin = 'stretch';
        $mpdf->SetHTMLFooter(self::$footer_html);

        // Agrego el contenido del Partials al HTML
        $mpdf->WriteHTML($html);

        // Envia un archivo PDF al navegador
        $mpdf->Output('mipdf.pdf', \Mpdf\Output\Destination::DOWNLOAD);
    }

}