Archivos de Categoría: PHP - Paginas 2

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,

Poner enlaces en cadena de texto

Cosas de un cliente, le da por decir que un campo de texto que estamos usando él está poniendo enlaces y que deben ser enlazables. Por ahorrarnos tener que meter un editor tipo WYSIWYG y volver a revisar todos los contenidos metidos, he preparado la siguiente función que ya mete los enlaces con _blank en lo de web y con mailto cuenda detecta una cuenta de correo:


function enlaces_string($string){
$string = nl2br($string);
$string = preg_replace(
"~[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]~",
"\\0",
$string);
$string = preg_replace(
"~([^\s<]+?@[^\s<]+?\.[^\s<]+)(?\\0",
$string);
return $string;
}

API Restful con Slim

Sigo haciendo pruebas con Slim y cada vez me gusta más, creo que voy a terminar usándolo en algún proyecto. Dejo un ejemplo en https://github.com/ErTomy/API-RESTful-Slim , aún estoy viendo si es necesario montar controladores o con tener la lógica en los ficheros de ruta puede servir (para servicios básicos no creo que sea necesario complicarlo mucho más)