Generar reportes PDF en Laravel 5.5

Reportes PDF

En este tutorial aprenderás como generar archivos PDF desde Laravel 5.5, la idea es crear una tabla de productos, listarlos y luego generar un PDF en base a esos datos.


Desde que tengo el canal me han pedido que enseñara como generar PDF desde Laravel 5.5 y aquí lo tienen. En esta oportunidad usaremos el paquete creado por el gran barryvdh.

Asegurate de hacer la práctica en un sistema Laravel desde cero, o puedes también descargar el código desde nuestro Github

Para la instalación del componente escribimos lo siguiente en el terminal composer require barryvdh/laravel-dompdf

Luego de la instalación configuramos de inmediato lo necesario en config/app.php

<?php

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

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

Base de datos (opcional, yo lo hago así para hacer un ejemplo con datos)

Empecemos creando los archivos necesarios controlador, entidad, factory y migración con el comando php artisan make:model Product -a

El parametro -a hace referencia a --all y nos crea controlador, entidad, factory y migración

Para este ejercicio no hacemos nada en la entidad app/Product.php

Configuramos el factory en database/factories/ProductFactory.php

<?php

use Faker\Generator as Faker;

$factory->define(App\Product::class, function (Faker $faker) {
    return [
        'name' => $faker->text(rand(32, 64)),
        'description' => $faker->text(rand(256, 512)),
        'stock' => rand(5, 25)
    ];
});

La migración la configuramos de la siguiente manera

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateProductsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->text('description');
            $table->integer('stock');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('products');
    }
}

Ahora creamos el seeder con el comando php artisan make:seeder ProductsTableSeeder y colocamos el siguiente código.

<?php

use Illuminate\Database\Seeder;

class ProductsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(App\Product::class, 12)->create();
    }
}

Ahora si, con esto listo ejecutamos el comando que me creará las tablas y las llenará de datos php artisan migrate:refresh --seed

Importante: Debes crear tu base de datos y configurar el nombre, usuario y contraseña en el archivo .env

Creación del sistema

Al tener listo todo lo relacionado con base de datos, instalación y configuración pasamos al archivo de rutas routes/web.php y para el ejercicio usamos dos (2) rutas.

<?php

Route::get('/', 'ProductController@index')->name('products');
Route::get('descargar-productos', 'ProductController@pdf')->name('products.pdf');

En el controlador app/Http/Controllers/ProductController.php hacemos uso de dos métodos para ilustrar este ejemplo.

<?php

namespace App\Http\Controllers;

use App\Product;
use Illuminate\Http\Request;
use Barryvdh\DomPDF\Facade as PDF;

class ProductController extends Controller
{
    public function index()
    {
        $products = Product::all();

        return view('products', compact('products'));
    }

    public function pdf()
    {        
        /**
         * toma en cuenta que para ver los mismos 
         * datos debemos hacer la misma consulta
        **/
        $products = Product::all(); 

        $pdf = PDF::loadView('pdf.products', compact('products'));

        return $pdf->download('listado.pdf');
    }
}

En el método pdf() hacemos uso del componente y lo que necesitamos hacer es trabajar con el comando PDF::loadView para cargar una vista ya preparada y de donde se tomará el diseño para el PDF.

Vamos al diseño

Vistas

Archivo resources/views/layout.blade.php

<!doctype html>
<html lang="es">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

        <title>Laravel y data en PDF | Rimorsoft Online</title>

    </head>
    <body>
        <div class="container">
            <div class="row">
                <div class="col-xs-12">
                	@yield('content')
                </div>
            </div>
        </div>
    </body>
</html>

Archivo resources/views/products.blade.php

@extends('layout')

@section('content')
    <h1 class="page-header">Listado de productos</h1>
    <table class="table table-hover table-striped">
        <thead>
            <tr>
                <th>ID</th>
                <th>Producto</th>
                <th>Descripción</th>
                <th>Stock</th>
            </tr>                            
        </thead>
        <tbody>
            @foreach($products as $product)
            <tr>
                <td>{{ $product->id }}</td>
                <td>{{ $product->name }}</td>
                <td>{{ $product->description }}</td>
                <td class="text-right">{{ $product->stock }}</td>
            </tr>
            @endforeach
        </tbody>
    </table>
    <hr>
    <p>
        <a href="{{ route('products.pdf') }}" class="btn btn-sm btn-primary">
            Descargar productos en PDF
        </a>
    </p>
@endsection

Archivo resources/views/pdf/produtcs.blade.php

@extends('layout')

@section('content')
    <table class="table table-hover table-striped">
        <thead>
            <tr>
                <th>ID</th>
                <th>Producto</th>
                <th>Descripción</th>
                <th>Stock</th>
            </tr>                            
        </thead>
        <tbody>
            @foreach($products as $product)
            <tr>
                <td>{{ $product->id }}</td>
                <td>{{ $product->name }}</td>
                <td>{{ $product->description }}</td>
                <td class="text-right">{{ $product->stock }}</td>
            </tr>
            @endforeach
        </tbody>
    </table>
@endsection

En las vistas has visto como seguimos hablando el idioma Laravel, sin tanto trauma ni cosas complicadas, todo lo logramos básicamente con el gran componente barryvdh/laravel-dompdf

Los archivos están en https://github.com/rimorsoft/Generar-PDF-en-Laravel-5.5

Si llegasta hasta aquí dime ¿qué te pareció? y ¿qué quisieras ver en esta página? Nos vemos en el siguiente Post.

Adquiere en preventa y aprovecha un gran descuento TDD en Laravel

Comparte en

Creado por: Venezuela Italo Morales

Profesor de #Laravel y #PHP en Rimorsoft Online

Más información


Ordenar tabla relacionada por id descendente

Hola, necesito usar el orderBy('id', 'DESC') en mi controlador pero no se como incorporarlo sin que me de error necesito que la tabla post se ordene por id descendente pero al ser una tabla relacionada no lo consigo

  public function show($id)
    {

        $product = Product::with('Dsa')->with('Post')->find($id);
        
  

        return view('products...

Carga de registros, con datatables

Sera que datatables no aguanta una cantidad de registro mayor a 1 millon. tengo problemas con esa parte las consultas de busquedas se toman mucho tiempo. alguien que mepueda apoyar en esa parte. ...

Controlador laravel modificar ruta path

Actualmente al subir una imagen con mi Controlador la guarda en una capeta llamada image situada en el directorio public y me gustaria que cuando suba una imagen dentro de la carpeta image cree una nueva carpeta dentro de image con el nombre del usuario y esta sea donde guarde las imagenes pero no consigo agregar esa variable al controlador me da error...

  public functi...

Muriendo a causa de SOAP

Soy nuevo en el uso de web service y en rimorsoft, sin embargo no tengo idea de como crear y que necesito para hacer un servidor soap en php alguien podria ayudarme/orientarme con una guia aunque esta sea pequeña sera bien agradecida...

Tengo un archivo XSD para trabajarlo pero repito, no tengo idea ni de como comenzar y trabajarlo, se que tengo que crear un server soap y d...