laravel-dompdf

DOMPDF es un paquete desarrollado por  que permite generar documentos en formato PDF, estos pueden ser descargados o impresos en pantalla, y gracias a Laravel podemos usar el motor de plantillas Blade para agregar algo más de funcionalidad como la impresión de variables y datos de forma dinámica.

Instalación de DOMPDF

Agregamos la siguiente linea en la sección required del archivo composer.json

"barryvdh/laravel-dompdf": "0.6.*"

posteriormente ejecutamos

$ composer update

Luego agregamos el service provider  en config/app.php, en Laravel 5.1

Barryvdh\DomPDF\ServiceProvider::class,

en Laravel 5.0

'Barryvdh\DomPDF\ServiceProvider'

Por supuesto no hay que olvidar agregar el alias en la sección de aliasses

'PDF' => 'Barryvdh\DomPDF\Facade',

PdfController

Creamos un nuevo controlador que se encargue de generar el documento PDF, en nuestro caso vamos a crear una simple factura de servicio.

Desde la consola ejecutamos

$ php artisan make:controller PdfController

Dentro de este nuevo controlador podemos crear una función llamada invoice.

    public function invoice() 
    {
        $data = $this->getData();
        $date = date('Y-m-d');
        $invoice = "2222";
        $view =  \View::make('pdf.invoice', compact('data', 'date', 'invoice'))->render();
        $pdf = \App::make('dompdf.wrapper');
        $pdf->loadHTML($view);
        return $pdf->stream('invoice');
    }

    public function getData() 
    {
        $data =  [
            'quantity'      => '1' ,
            'description'   => 'some ramdom text',
            'price'   => '500',
            'total'     => '500'
        ];
        return $data;
    }

Al definir la variable $view renderizamos cualquier vista que queramos, usando estilos con css, operando variables en blade tal cual como lo haríamos con cualquier vista de la aplicación.

Esta función llama a la vista invoice.blade.php que crearemos en el directorio resources/pdf

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Example 2</title>
    {!! Html::style('assets/css/pdf.css') !!}
  </head>
  <body>

    <main>
      <div id="details" class="clearfix">
        <div id="invoice">
          <h1>INVOICE {{ $invoice }}</h1>
          <div class="date">Date of Invoice: {{ $date }}</div>
        </div>
      </div>
      <table border="0" cellspacing="0" cellpadding="0">
        <thead>
          <tr>
            <th class="no">#</th>
            <th class="desc">DESCRIPTION</th>
            <th class="unit">UNIT PRICE</th>
            <th class="total">TOTAL</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td class="no">{{ $data['quantity'] }}</td>
            <td class="desc">{{ $data['description'] }}</td>
            <td class="unit">{{ $data['price'] }}</td>
            <td class="total">{{ $data['total'] }} </td>
          </tr>

        </tbody>
        <tfoot>
          <tr>
            <td colspan="2"></td>
            <td >TOTAL</td>
            <td>$6,500.00</td>
          </tr>
        </tfoot>
      </table>
  </body>
</html>

como pueden ver, llamamos los estilos CSS con

{!! Html::style('assets/css/pdf.css') !!}

En este post no voy a incluir el código de la hoja de estilo, pero puedes descargar esta plantilla, y agregar el archivo .css como pdf.css a la carpeta /public/assets/css. 

Definiendo la ruta

Bien, ahora que tenemos nuestro controlador y la vista correspondiente, vamos a crear la ruta para generar el pdf.

Route::get('pdf', 'PdfController@invoice');

al final ingresando a ruta_de_tu_proyecto/public/pdf vas a poder ver algo como esto

Si en lugar de imprimir en pantalla deseas descargar el archivo directamente solo debes cambiar la respuesta de la función invoice

return $pdf->download('invoice');

download() recibe como parámetro el nombre que deseas que tenga el archivo al descargar.

¡Eso es todo! ha sido un pequeño ejemplo sobre el uso de este paquete. Recuerda que puedes dejar tus dudas en la sección de comentarios.

Lecturas recomendadas

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Integrar Google Maps en Laravel 5 con el componente Phpgmaps Lección siguiente Paginación en Laravel 5.1 con blade-pagination