Generando PDFs con Laravel 5

Últimamente me está tocando mucho informe en PDF por lo que especifico aquí los casos más habituales. Lo primero lógicamente es instalar las dependencias con composer:

composer require barryvdh/laravel-dompdf

Y en el fichero config/app.php añadir el provider y su alias:

'providers' => [
    ....
    Barryvdh\DomPDF\ServiceProvider::class,


....

'aliases' => [
    ....
    'PDF' => Barryvdh\DomPDF\Facade::class,

Con esto ya podríamos usarlo en cualquier controlador siempre haciendo referencia a su namespace con:

Use PDF;

La gran ventaja que le veo es que podemos usar las plantillas blade para generar los PDFs con toda la potencia que esto nos da. Por ejemplo si queremos generar un PDF al vuelo directamente en el navegador, podremos hacerlo de la siguiente forma:

$pdf = PDF::loadView('pdfs.plantilla', ['datos'=>$datos]);
return $pdf->stream('fichero.pdf');

Otra opción es que lo descargue en vez de mostrarlo:

$view = view('pdfs.plantilla')->with('datos', $datos)->render();
$pdf = PDF::loadHTML($view);
return $pdf->download('fichero.pdf');

Y por último, podemos generarlo físicamente en el servidor:

$view = view('pdfs.plantilla')->with('datos', $datos)->render();
$pdf = PDF::loadHTML($view);
$pdf->save(storage_path('app/fichero.pdf'));

Eso sí, en la plantilla debe tener ciertas características si queremos meter cabecera y pie de página. Para ello tendremos que usar las etiquetas header y footer:

<html>
<head>
  <style>
    @page { margin-top: 400px; margin-bottom: 100px; margin-left: 50px; margin-right: 50px; }
	  body{color: #767676;background: #fff;font-family: 'Open Sans',sans-serif;font-size: 12px;}
    #header { position: fixed; left: 0px; top: -375px; right: 0px; height: 375px; }
    #footer { position: fixed; left: 0px; bottom: -100px; right: 0px; height: 80px; text-align:center; font-size: 11px;}
    #footer .page:after { content: counter(page, upper-roman); }
	  #content{ }	
  </style>
</head>
<body>
  <header id="header">
    <img src="{{public_path('images/logo.png')}}" width="200"/>
  </header>
  <footer id="footer">
    Este es el pie
  </footer>
  <section id="content">
    Este es el contenido
  </section>
</body>
</html>

Por último, si el PDF tiene varias páginas puede que tengamos que meter la numeración de estas. Para ello tendremos que poner el siguiente código en la plantilla:

<script type="text/php">
    $text = 'Página {PAGE_NUM} de {PAGE_COUNT}';
    $font = Font_Metrics::get_font("sans-serif");
    $pdf->page_text(493, 800, $text, $font, 7);
</script>

Y para que no de error este último código, deberemos habilitar en la configuración de la librería que las plantillas puedan ejecutar php. En teoría lo podemos hacer con:

$pdf->set_options('isPhpEnabled', true);

O

$pdf->setOptions(['isPhpEnabled' => true]);

Pero no he conseguido hacerlo funcionar así que mientras encuentro otra solución he modificado el fichero vendor\barryvdh\laravel-dompdf\config\dompdf.php:

// habilitar PHP en las plantillas
  "DOMPDF_ENABLE_PHP" => true,  
// Que coja los acentos al llamar a la función page_text
  "DOMPDF_ENABLE_HTML5PARSER" => true,
Dejar un comentario?

0 Comentarios.

Deje un comentario


NOTA - Puede usar estosHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.