Es muy común que cuando estamos desarrollando algún sistema web una vista o vistas en particular necesitan ser exportadas en formato PDF. En este tutorial vas a aprender cómo exportar una vista en Laravel 8 a un archivo PDF, para lograrlo usarás el paquete DomPDF. Sin más manos a la obra.
1. Crear proyecto nuevo en Laravel 8
Crea un proyecto nuevo, abre desde la raíz tu terminal y escribe:
composer create-project laravel/laravel laravel-pdf
2. Instalar DomPDF
Desde tu terminal accede a la recién creada carpeta de tu proyecto, para instalar el paquete DomPDF vía composer escribe:
composer require barryvdh/laravel-dompdf
3. Configurar DomPDF en el archivo app.php
Abre el archivo app.php que se encuentra en la ruta config/app.php, tienes que agregar dos líneas de código, busca el array llamado ‘providers’ y agrega lo siguiente:
Barryvdh\DomPDF\ServiceProvider::class,
Ahora, un poco más abajo busca un array llamado ‘aliases’ y agrega al final del array:
'PDF' => Barryvdh\DomPDF\Facade::class,
4. Crear un modelo y migración
Para seguir este tutorial crea un modelo y migración, en mi caso crearé el modelo y migración de Productos, puedes nombrarlo como gustes, ve a la terminal y escribe:
php artisan make:model Producto -m
5. Configurar modelo y migración
Abre el archivo app/Models/Producto.php crea la propiedad fillable para permitir el almacenamiento masivo en la base de datos:
public $fillable = [ 'sku', 'nombre', 'cantidad', 'precio', 'descripcion' ];
Ahora abre el archivo database/migrations/x_create_productos_table.php e ingresa las columnas en donde se guardaran los datos del producto:
Schema::create('productos', function (Blueprint $table) { $table->id(); $table->string('sku'); $table->string('nombre'); $table->string('cantidad'); $table->float('precio'); $table->text('descripcion'); $table->timestamps(); });
6. Crear base de datos y configurar
Abre la consola de MySQL desde tu terminal teclea el siguiente comando:
mysql -u root -p
Ingresa los datos de acceso y crea una base de datos nueva:
CREATE DATABASE laravelpdf CHARACTER SET utf8 COLLATE utf8_spanish_ci;
Para salir de la consola de MySQL escribe exit.
En tu editor de texto abre el archivo .env y agrega el nombre de la base de datos que creaste:
Desde tu terminal corre las migraciones:
php artisan migrate
7. Generar datos falsos de prueba
Abre el archivo database/seeds/DatabaseSeeder.php y agrega el siguiente código para generar 10 datos falsos de prueba:
$faker = Faker::create(); foreach (range(1,10) as $index) { DB::table('productos')->insert([ 'sku' => $faker->randomNumber(), 'nombre' => $faker->word(), 'cantidad' => $faker->numberBetween(1, 20), 'precio' => $faker->numberBetween(10, 500), 'descripcion' => $faker->text(), 'created_at' => Carbon::now(), 'updated_at' => Carbon::now() ]); }
Para correr los seeds desde tu terminal escribe:
php artisan db:seed
Nota: Recuerda importar las clases Faker, DB y Carbon como se muestra al principio del archivo.
8. Crear controlador
Ahora crea el controlador del modelo Producto, teclea en la terminal:
php artisan make:controller ProductoController
Desde tu editor de textos abre el archivo app/Http/Controllers/ProductoController.php y crea el método index agregando el siguiente código:
public function index(){ $productos = Producto::all(); return view('index', compact('productos')); }
También crea el método ‘createPDF’ para generar el PDF de la vista:
public function createPDF(){ //Recuperar todos los productos de la db $productos = Producto::all(); view()->share('productos', $productos); $pdf = PDF::loadView('index', $productos); return $pdf->download('archivo-pdf.pdf'); }
No olvides agregar el atributo ‘use PDF’ al inicio del archivo.
9. Crear ruta
Abre el archivo routes/web.php para crear las rutas de tu aplicación copia y pega el siguiente código:
Route::get('/productos', [Producto::class, 'index'])->name('productos.index');
Y ya que estas en este archivo, de una vez crea la ruta para generar el archivo PDF:
Route::get('/producto/pdf', [ProductoController::class, 'createPDF'])->name('producto.pdf');
10. Crear plantilla para la vista index
Crea el archivo index en la ruta resources/views/index.blade.php aquí mostrarás todos los productos que hay en la base de datos. Pega y copia el código de abajo en tu archivo index.blade.php:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Laravel 8 PDF</title> <!-- Bootstrap CSS --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> </head> <body> <div class="container mt-4"> <div class="row"> <div class="col-md-8"> <h2>Lista de productos</h2> </div> <div class="col-md-4"> <div class="mb-4 d-flex justify-content-end"> <a class="btn btn-primary" href="{{ URL::to('#') }}">Convertir a PDF</a> </div> </div> </div> <div class="row"> <div class="col-md-12"> <table class="table"> <caption>Lista de productos</caption> <thead> <tr> <th scope="col">SKU</th> <th scope="col">Nombre</th> <th scope="col">Cantidad</th> <th scope="col">Precio</th> <th scope="col">Descripción</th> </tr> </thead> <tbody> @foreach ($productos as $producto) <tr> <th scope="row">{{ $producto->sku }}</th> <td>{{ $producto->nombre }}</td> <td>{{ $producto->cantidad }}</td> <td>{{ $producto->precio }}</td> <td>{{ $producto->descripcion }}</td> </tr> @endforeach </tbody> </table> </div> </div> </div> <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script> </body> </html>
Enciende el servidor escribiendo desde la terminal:
php artisan serve
Abre el navegador y ve a la dirección: http://127.0.0.1:8000/productos
Vas a ver la lista de los productos que tienes en tu base de datos, si das clic en el botón ‘Convertir a PDF’ verás que se descarga la vista en formato PDF.
Conclusión
El paquete DomPDF es uno de los mejores que tiene Laravel para trabajar con conversiones a PDF, puedes ver el repositorio de GibHub aquí. Y así siguiendo estos sencillos pasos puedes exportar una vista de Laravel 8 a PDF. Si te sirvió este tutorial te invito a que lo compartas en tus redes sociales para que más personas lo vean y si tienes dudas o comentarios déjalos en la caja de comentarios de abajo, estaré al pendiente de ellos. También te invito a ver cómo hacer deploy de un proyecto Laravel en un VPS aquí.
Repositorio del tutorial: https://github.com/diarioprogramador/laravel-pdf