Laravel 5 : Générer des pdfs
Elliott Chiaradia |26-04-2016
Générer dynamiquement des PDF est courant sur le web, cependant cette tâche peut vite devenir un véritable calvaire si l'on n'utilise pas les bons outils. Heureusement, il existe un package destiné à Laravel 5 (et la version 4) qui fait très bien le travail, à savoir "DOMPDF Wrapper". En plus d'être très efficace, celui-ci est, comme vous pourrez le constater, très simple à configurer.
Dans ce tutoriel, je vais tout d'abord vous montrer comment configurer correctement le package. Puis, un cas pratique vous sera présenté. Lors de celui-ci, je me permets de partager quelques astuces et remarques qui pourraient être pertinentes.
Configuration du package
Comme toujours, la première chose a faire est de modifier le fichier "composer.json" en y rajoutant le package dans le require.
"require": {
...
"barryvdh/laravel-dompdf": "0.6.*",
...
},
Puis, lancez la commande suivante, afin d'installer dompdf.
composer update
Dans le fichier "config/app.php", vous devez rajouter un nouveau provider, vous pouvez aussi ajouter un alias afin de vous faciliter la vie.
'providers' => [
...
Barryvdh\DomPDF\ServiceProvider::class,
...
],
'aliases' => [
...
'PDF' => Barryvdh\DomPDF\Facade::class,
...
],
Et voilà, le package est maintenant fonctionnel, voyons comment l'utiliser concrètement via un petit cas pratique.
Petit cas pratique
La première chose à faire consiste à créer une nouvelle route dans le fichier "routes.php". Dans notre exemple, nous voulons générer un PDF contenant les informations d'une commande (une order), c'est pourquoi nous utilisons le controller "OrderController".
Route::get('/pdf/{order}', ['as' => 'order.pdf', 'uses' => 'OrderController@orderPdf']);
Passons au controller "OrderController.php", après le namespace, rajoutez-y la ligne suivante :
use PDF;
Toujours dans notre controller des orders, créons la fonction "orderPdf" appelée via la route que nous avons créée précédemment.
public function orderPdf($id)
{
$order= ORDER::findOrFail($id);
$pdf = PDF::loadView('order_pdf', compact('order'));
$name = "commandeNo-".$order->id.".pdf";
return $pdf->download($name);
}
Décortiquons ce code. Tout d'abord, nous allons récupérer la commande (order) grâce à l'id qu'on passera à la fonction. Puis, nous allons créer le PDF en chargeant la view "order_pdf" qui contiendra le contenu de notre PDF. Dans cet exemple, nous lui passons en paramètre l'order à l'aide d'un "compact" afin de pouvoir générer un PDF dynamiquement à l'aide des données propres à une commande. La variable "$name" doit contenir le nom de notre futur PDF, ici il s'appellera "commandeNo-X.pdf", avec pour "X" l'id de notre order. Finalement, il ne vous reste plus qu'à faire un return en utilisant "download" de "$pdf" et en lui indiquant le nom du fichier à télécharger.
Par défaut, votre page sera en A4 et en orientation portrait. Mais vous pouvez lui spécifier un format de papier différent ainsi qu'une autre orientation grâce à "setPaper".
$pdf = PDF::loadView('order_pdf', compact('order'))->setPaper('a3', 'landscape');
Maintenant que votre fonction de création de PDF est opérationnelle, vous devez créer la view qui correspond au squelette du futur PDF. Dans "ressources/views", créez un nouveau fichier appelé "order_pdf.blade.php". À l'intérieur de celui-ci, vous pouvez y mettre le code que vous voulez. Dans l'exemple que je vous propose, j'intègre une feuille de style spécifique aux PDFs, puis j'affiche l'id de la commande dans une balise <h1>. Puisque la view est un fichier blade, vous pouvez utiliser ce moteur de templating comme à votre habitude.
<link href="{{asset('css/print.css')}}" rel="stylesheet">
<h1>{{$order->id}}</h1>
Dans une de vos views (ici index.blade.php), vous pouvez rajouter un lien pointant vers la route que nous avons créée précédemment. En cliquant dessus votre PDF sera créé !
<a href="{{route('order.pdf',$order)}}">Enregistrer en PDF</a>
Et voilà, vous savez dorénavant comment créer des PDFs avec Laravel. Dans l'exemple que je vous est présenté, nous créons un PDF dynamiquement avec les données d'une order, mais vous pouvez bien évidemment créer des PDFs statiques.
Une dernière chose, le package offre une petite astuce bien utile au niveau du CSS, à savoir l'ajout d'un saut de page. Pour utiliser cette option, il vous suffit, dans votre feuille de styles, de créer une classe "page-break" contenant "page-break-after: always;". Dans votre view, il ne vous reste plus qu'à rajouter des div ayant comme classe "page-break" à chaque fois que vous voulez faire un saut de page.
<style>
.page-break {
page-break-after: always;
}
</style>
<p>page 1</p>
<div class="page-break"></div>
<p>page 2</p>
Je me permets encore d'ajouter une petite remarque, la génération du PDF est très sensible, une balise non fermée peut engendrer une erreur, faites donc attention et ayez un code impeccable.
Source :