Un tutoriel pour créer un fichier PDF à partir d'un code HTML ou d'une vue (template Blade) avec le package laravel-dompdf dans un projet Laravel.
Sommaire
Le package laravel-dompdf est un wrapper pour Laravel de la librairie Dompdf qui permet de convertir un code HTML en fichier PDF (Portable Document Format).
Laravel-dompdf génère des fichiers PDF en prenant en charge les fonctionnalités suivantes :
Nous voulons voir dans ce guide comment installer, configurer et utiliser le package laravel-dompdf dans un projet Laravel.
Voici la procédure pour télécharger, intégrer et configurer le package laravel-dompdf dans un projet Laravel :
Pour importer laravel-dompdf avec ses dépendances, ouvrez la console (invite de commandes) à la racine du projet, exécutez la commande composer suivante :
composer require barryvdh/laravel-dompdf
Une fois laravel-dompdf importé, nous pouvons le charger dans l’application en ajoutant le service provider au tableau $providers et la façade (« PDF » pour faire court) au tableau $aliases dans le fichier de configuration config/app.php :
// ...
'providers' => [
// ...,
// Service Provider DomPDF
Barryvdh\DomPDF\ServiceProvider::class
],
'aliases' => [
// ...,
// Façade DomPDF
"PDF" => Barryvdh\DomPDF\Facade::class
],
// ...
Pour créer (copier) le fichier de configuration config/dompdf.php où nous pouvons modifier les options par défaut de dompdf, on exécute la commande artisan suivante :
php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider"
Nous avons les options suivantes :
Nous pouvons aussi modifier ces options dans le code avant de générer un fichier PDF avec la méthode setOptions() :
PDF::setOptions([
"defaultFont" => "Courier",
"defaultPaperSize" => "a4",
"dpi" => 130
]);
Maintenant que laravel-dompdf est installé et configuré, nous pouvons l'utiliser en créant une nouvelle instance Barryvdh\DomPDF\PDF où nous indiquons le contenu du fichier PDF à travers :
1. Une vue (template Blade) avec la méthode loadView($view, $data)
:
use App\Post;
use PDF;
// ...
public function getPostPdf (Post $post)
{
// L'instance PDF avec une vue : resources/views/posts/show.blade.php
$pdf = PDF::loadView('posts.show', compact('post'));
}
// ...
2. Un chemin vers un fichier avec la méthode loadFile($path)
:
$pdf = PDF::loadFile(public_path("documents/fichier.html"));
3. Une chaîne de caractères HTML avec la méthode loadHTML($html)
:
$pdf = PDF::loadHTML("<p>Mon contenu HTML ici</p>");
A partir de l'instance Barryvdh\DomPDF\PDF, nous pouvons forcer le navigateur à lancer le téléchargement du fichier PDF avec la méthode download($fichier)
où $fichier
représente le nom + extension du fichier PDF :
use App\Post;
use PDF;
// ...
public function getPostPdf (Post $post)
{
// L'instance PDF avec la vue resources/views/posts/show.blade.php
$pdf = PDF::loadView('posts.show', compact('post'));
// Lancement du téléchargement du fichier PDF
return $pdf->download(\Str::slug($post->title).".pdf");
}
// ...
Ou afficher le fichier PDF dans le navigateur avec la méthode stream()
:
return $pdf->stream();
Ou encore enregistrer le fichier PDF vers un chemin $path
avec la méthode save($path)
:
$pdf->save(public_path("storage/documents/fichier.pdf"));
1. Nous pouvons combiner les méthodes de la manière suivante :
return PDF::loadView('posts.show', compact('post'))
->setPaper('a4', 'landscape')
->setWarnings(false)
->save(public_path("storage/documents/fichier.pdf"))
->stream();
2. Pour le support UTF-8, ajouter le meta tag au template :
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
3. Pour faire un saut de page, nous pouvons utiliser la propriété CSS page-break-before ou page-break-after :
<!DOCTYPE html>
<html lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Ma page</title>
</head>
<body>
<h1>Titre de la page 1</h1>
<div>Contenu de la page 1</div>
<!-- Saut de page -->
<div style="page-break-after: always;" ></div>
<h1>Titre de la page 2</h1>
<div>Contenu de la page 2</div>
</body>
</html>
Portez-vous bien ! 😉
Cette publication vous a plu ?
Encouragez-nous en la partageant sur les réseaux sociaux
Passionné de l'informatique, je suis spécialiste en techniques des systèmes et réseaux, développeur web et mobile, infographiste et designer, ... J'aime partager mon expérience en formant sur la plateforme Akili School
Voir profil Suivre
Commentaires