Sunteți pe pagina 1din 1

Cursos Blog Foro TDD en Laravel ¿Qué aprenderás ahora?

 Comunidad Login

 Generar reportes PDF en Laravel 5.5


 28 comentarios

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

 Laravel PHP Laravel 5.5 Tutorial Packagist

Comparte en

Creado por: Italo Morales


Profesor de #Laravel y #PHP en Rimorsoft Online



@Sr Misterioso-90794e3b050f815354e3e29e977a88ab hace 3 semanas


Me encanto sabes estoy realizando unas pruebas para generar unos reportes 20000 registros con Barryvdh\DomPDF pero me colapsa apache
como pudiera solucionar esto..!
0

@Sr Misterioso-1f4477bad7af3616c1f933a02bfabe4e hace 3 semanas


Interesante tutorial, aunque incompleto (bajo mi punto de vista). Hubiese sido aún más interesante, imprimir un pdf con el perfil individual de cada
producto... una página por cada producto.
0

rene-llapur hace 4 semanas


Hola italo, como siempre muy buen post. Descargué el proyecto de Github pero me estaba dando problemas cuando intentaba descargar el PDF
dándome este error: No block-level parent found. Not good. Luego de googlearlo encontré la solución y se las dejo aquí por si a alguien más le
1 ocurre. Ver: https://stackoverflow.com/questions/48146417/laravel-pdf-no-block-level-parent-found-not-good. Saludos a la comunidad y espero
haber servido de ayuda

@279054920ece43ba7690d51056971c71 hace 2 meses


Hola, me gustaria saber cómo yo le podria dar estilos a un archivo pdf generado con esa librería... tengo unas tablas que necesito darles estilos
como se puede hacer?
0

@greygarcia14gg-at-gmailcom hace 4 meses


mi error era el mismo de @miguel-urreta-at-hotmailcom , pero solo agregue la carpeta fonts a storege y ya funcionó. Tal y como la dijo 80-jorge-luis-
cortes-martinez h
0

@greygarcia14gg-at-gmailcom hace 4 meses


fopen(C:\xampp\htdocs\walmartCRM\storage\fonts/\c643130b9f4a7778f8739a3c72c0a643.ufm): failed to open stream: No such file or directory
según el error es enesta linea: return $pdf->download('listado.pdf'); Uso laravel 5.6 A qué se debera este error, bueno lo entiendo que no encuentra
0 la ruta, pero como puedo solucionarlo. De antemano gracias y disculpen mi ignorancia.

angeldelacruzsdo hace 5 meses


Vamos a ver si puedo generar un contrato con el PDF

0

italomoralesf hace 5 meses


Este año le dedicaré tiempo mi amigo a las pasarelas de pago

0

@ale-g667-at-hotmailcom hace 5 meses


Excelente curso, seria bueno que saque unos como manejar pasarelas de pago (Mercado Pago, Paypal y Tarjeta de Credito, etc)

0

@sa-guz-007-at-hotmailcom hace 5 meses


Gracias me sirvio bastante, solo si hay un detalle con el nombre de resources/views/pdf/produtcs.blade.php esta mal escrito debe de ser
pdf\products.blade.php , ademas con el estilo css en layout.blade.php donde obtienen el estilo ponerlo directamente de la siguiente manera y que lo
0 agarre del public/ de laravel

italomoralesf hace 7 meses


Debe haber algo mas que no estamos notando, porque con esto solo generamos un PDF y para imprimir ya se usa el navegador y componentes de
impresión.
0

@raulsuarez12-at-gmailcom hace 7 meses


hola italo e seguido el post paso a paso pero se me presenta un error a la hora de imprimir y es que cuando le doy al boton el servidor tarda en dar
respuesta se queda colgado luego lo reinicio aque se debera este error? de hecho tengo que hacer un kill al puerto porque luego el serve no inicia
0 de nuevo Failed to listen on 127.0.0.1:8080 (reason: Address already in use)

italomoralesf hace 7 meses


Si, solo enfócate en la consulta.. Los datos que consigas son los que se generarán como PDF

1

italomoralesf hace 7 meses


Genial amigo jejeje

0

italomoralesf hace 7 meses


El truco está en la consulta... Solo decide que consultar en la base de datos y eso mandas a generar como PDF

0

hgambaldo-at-hotmailcom hace 7 meses


Hola italo, muy buen ejemplo y bien explicado. Tengo una consulta por si puedes ayudarme. Generar el reporte pdf pero no de una sola tabla sino
de varias. articulo familia. Tendrías tiempo para ayudarme. Desde ya muchas gracias. Saludos
0

@victor-spirit93-at-hotmailcom hace 7 meses


Hola despues de estallarme la cabeza lo logre, en realidad es igual que el metodo show al momento de crear el controlador usamos el metodo find
y le pasamos el idquedaria algo asi: $computer = Computer::find($id); y es todo devolvemos la vista que queremos y el nombre del archivo PDF
0

@victor-spirit93-at-hotmailcom hace 7 meses


Una pequeña Pregunta ITALO, por ejemplo tengo un MODELO llamado Computers que tiene una serie de campos donde uno es Funcionario que
tiene asignado x caracteristicas de dicho computador, si deseo solo imprimir PDF la informacion de el como serial
0

@cesarsaa1991-at-gmailcom hace 8 meses


Uso de Bootstrap en pdf

1

80-jorge-luis-cortes-martinez hace 9 meses


Sr misterioso agrega la carpeta fonts en tu carpeta storage de laravel.

1

italomoralesf hace 9 meses


La ruta está mal, no debe ser C:... debería ser http://... algo debe estar mal al momento de generarla

0

@miguel-urreta-at-hotmailcom hace 9 meses


cuando le doy descargar pdf me sale este error "fopen(C:\xampp\htdocs\laravel practica\practica-
pdf\storage\fonts/\c47afe5539ba1b2094563d54dce2def7.ufm): failed to open stream: No such file or directory"agradezco la ayuda que puedan
1 brindarme

italomoralesf hace 9 meses


Buena sugerencia, probablemente haga algo con los jobs en Laravel

0

johfermq hace 9 meses


Excelente aporte, he leído que cuando hay muchos registros puede ser una tarea pesada para el sistema y es recomendable usar Jobs, tal vez
puedas hacer un post de como usar jobs para trabajos pesados. Gracias
0

italomoralesf hace 9 meses


Gracias Jose

0

31-jose-bermudez hace 9 meses


Excelente tutorial amigo, Sigue así Adelante...!

0

6-gustavo-herrera hace 9 meses


Buenisimo....

0

32-victor-barrera hace 9 meses


Excelente tutorial

0

Más información

Orgullosamente alojados en Digital Ocean

Únete a Rimorsoft | Una valiosa Comunidad

Lineamientos | Términos de servicio | Política de privacidad

Youtube | Slack | Facebook | Twitter | Instagram | Github

S-ar putea să vă placă și