En este tutorial, le enseñare cómo generar archivos PDF a partir de la vista HTML en laravel 5.4 mediante el uso de laravel-dompdfpaquete.
En Internet hay un montón de paquetes que se pueden usar para generar PDF utilizando HTML y CSS, se puede hacer bonitos diseño para crear un PDF, eso depende de usted.
El uso de la biblioteca laravel-dompdfla, puede generar fácilmente archivos PDF en su aplicación web laravel. Puedes ir a su documentación oficial presionando aqui.
La generación de archivos PDF es útil cuando se necesita enviar informes, a los correos electrónicos de tus usuarios a gran cantidad, para hacer esto puedes convertir su vista HTML en archivo PDF y luego conectar con su correo y enviársela.
Dompdf es una librería PHP que se utiliza para generar el archivo PDF a partir de la vista HTML.
Instalación de paquete laravel-dompdfla:
En este paso vamos a instalar el paquete laravel-dompdf para generar archivos pdf desde el archivo de vista de hoja de HTML. Puede usar composer para descargar estos complementos, así que copie el siguiente comando y ejecútelo en su terminal.composer require barryvdh/laravel-dompdf
Ahora, después de descargar las bibliotecas, tendrá que configurar su proveedor de servicios y su alias, en la ruta config/app.php
'providers' => [ ... ... Barryvdh\DomPDF\ServiceProvider::class, ],
'aliases' => [ ... ... 'PDF' => Barryvdh\DomPDF\Facade::class, ],
En este paso me imagino que ya logro instalar el paquete laravel-dompdf así que vamos a empezar con el archivo de rutas.
Agrega la siguiente línea de código en tu archivo web.php que estará en la siguiente ruta routes/web.php.
Nota: En versiones anteriores a laravel 5.3 este archivo se encontraba en la siguiente ruta app/Http/routes.php.
Route::get('vista-html-pdf',array( 'as'=>'vistaHTMLPDF', 'uses'=>'ProductoController@vistaHTMLPDF' ));
Ahora voy a crear ProductoController y asumiré que usted ya tiene un modelo de producto y una tabla con algunos datos ficticios para mandar a nuestra vista.
En el método vistaHTMLPDF , estoy compartiendo una variable global productos que puede utilizar en cualquier lugar de la aplicación y utilizo la clase pdf para cargar la vista para generar en archivo pdf.
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Producto; use PDF; class ProductoController extends Controller { public function vistaHTMLPDF(Request $request) { $productos = Producto::all();//OBTENGO TODOS MIS PRODUCTO view()->share('productos',$productos);//VARIABLE GLOBAL PRODUCTOS if($request->has('descargar')){ $pdf = PDF::loadView('vista-html-pdf');//CARGO LA VISTA return $pdf->download('toda-la-lista-de-productos');//SUGERIR NOMBRE A DESCARGAR } return view('vista-html-pdf');//RETORNO A MI VISTA } }
Por último, vamos a crear una vista en la que se va a mostrar en una tabla todos los productos y que también generará la vista del archivo PDF. La vista del archivo PDF puede estar en otra vista, pero nosotros usaremos esta misma vista vista-html-pdf.blade.php para el ejemplo.
resources/view/vista-html-pdf.blade.blade.php
<style> table, th, td { border: 1px solid black; } </style> <br><br> <div class="row"> <a href="{{ route('vistaHTMLPDF',['descargar'=>'pdf']) }}">Descargar PDF</a> <br><br> <table> <tr> <th>Nombre</th> <th>Detalles</th> </tr> @foreach ($productos as $producto) <tr> <td>{{ $producto->nombre }}</td> <td>{{ $producto->descripcion }}</td> </tr> @endforeach </table> </div>
Corremos nuestro servidor php artisan serve y tendremos una vista así:
Y quedaría esta bonita vista, Le damos a descargar y listo :) Nota: No se desanimen con el PDF generado, ustedes hagan otras con mejores estilos :) Gracias
2 comentarios
Write comentarioshola que tal quisiera mostrar solo un registro pero cuando uso where('id',$id)->first(); o uso find($id); me dice argumento invalido para foreach y si imprimo un dd($variable); me dice que esta vacio o sea me dice null , pero si coloco ejemplo: Contacto::all(); si me los muestra todos
ReplyHola amigo, seguí los pasos y todo, pero al momento de dar descargar se me queda cargando nada mas. como podia solucionar eso?
Reply