Laravel : Générer un fichier PDF avec laravel-dompdf

Mis à jour il y a 1 an

Un tutoriel sur l'utilisation du package laravel-dompdf dans un projet Laravel pour créer un fichier PDF à partir de code HTML ou d'une vue (template Blade).

Wilo Ahadi

Auteur

Wilo A.

Technologies

Laravel, PHP
Voir aussi Trois méthodes sont expliquées pour récupérer des données entre les dates de début et de fin d'un modèle dans un projet Laravel 10. En savoir plus

Introduction à laravel-dompdf

Le package laravel-dompdf est un wrapper Laravel pour la bibliothèque Dompdf qui permet de convertir du code HTML en fichiers PDF (Portable Document Format).

Laravel-dompdf génère des fichiers PDF en prenant en charge les fonctionnalités suivantes :

  • La plupart des propriétés CSS 2.1 et CSS 3, les feuilles de style internes et externes
  • La plupart des attributs HTML 5
  • Fournit la prise en charge des images (GIF, PNG, JPG, etc.) et SVG
  • Les Tableaux (lignes, colonnes, bordures de tableau, styles de cellule, etc.)
  • Les police de caractères

Dans ce guide, nous voulons voir comment installer, configurer et utiliser le package laravel-dompdf dans un projet Laravel. Au moment de la rédaction de ce guide, j'utilise la version 9.42.2 de Laravel.

La version anglaise de ce tutoriel : Laravel : Generate a PDF file with laravel-dompdf

Installer et configurer laravel-dompdf

Pour télécharger (1), intégrer (2) et configurer (3) le package laravel-dompdf dans votre projet Laravel, nous allons procéder comme suit :

1. Télécharger laravel-dompdf

Pour importer laravel-dompdf et ses dépendances, ouvrez la console (invite de commande) à la racine de votre projet et exécutez la commande composer suivante :

composer require barryvdh/laravel-dompdf

2. Intégrer laravel-dompdf

Une fois laravel-dompdf importé, vous pouvez le charger dans votre application en ajoutant le fournisseur de services (service provider) au tableau $providers et la façade ("PDF" en abrégé) au tableau $aliases dans votre fichier de configuration config/app.php :

'providers' => [

	// Service Provider DomPDF
	Barryvdh\DomPDF\ServiceProvider::class

],

'aliases' => Facade::defaultAliases()->merge([

	// Façade Laravel-dompdf
	"PDF" => Barryvdh\DomPDF\Facade::class
	
])->toArray(),

3. Configurer laravel-dompdf

Pour créer (copier) le fichier de configuration config/dompdf.php dans lequel vous pouvez modifier les options par défaut de dompdf , exécutez la commande artisan suivante :

php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider"

Nous disponsons des options suivantes :

  • orientation (string) : la disposition en portrait ("portrait") ou en paysage ("landscape")
  • defaut_paper_size (string) : la taille du papier ("a3", "a4", …)
  • dpi (int) : « Dots per Inch », le nombre de points ou de pixels qui seront rendus dans un pouce sur l’interface
  • default_font (string) : La police par défaut à utiliser ("sans-serif", "courier", "helvetica", "dejavu sans", …)
  • ...

Vous pouvez également modifier ces options dans le code avant de générer le fichier PDF à l'aide de la méthode setOptions() :

PDF::setOptions([
    "defaultFont" => "Courier",
    "defaultPaperSize" => "a4",
    "dpi" => 130
]);

Utiliser laravel-dompdf

Après avoir installé et configuré laravel-dompdf , vous pouvez créer une nouvelle instance Barryvdh\DomPDF\PDF et spécifier le contenu du fichier PDF comme suit :

1. Une vue (template Blade) avec la méthode loadView($view, $data) :

use PDF;

use App\Models\Post;

public function getPostPdf (Post $post)
{
    // L'instance PDF avec la 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>");

Depuis l'instance Barryvdh\DomPDF\PDF, vous pouvez utiliser la méthode download($fichier) pour forcer le navigateur à lancer le téléchargement du fichier PDF où $fichier représente le nom et l'extension du fichier PDF :

use PDF;

use App\Models\Post;

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 utiliser la méthode stream() pour afficher le fichier PDF dans un navigateur :

return $pdf->stream();

Ou encore utiliser la méthode save($path) pour enregistrer le fichier PDF dans $path :

$pdf->save(public_path("storage/documents/fichier.pdf"));

Astuces

1. Vous pouvez combiner des méthodes :

return PDF::loadView('posts.show', compact('post'))
            ->setPaper('a4', 'landscape')
            ->setWarnings(false)
            ->save(public_path("storage/documents/fichier.pdf"))
            ->stream();

2. Pour le prendre en charge UTF-8, ajoutez une balise meta à votre template :

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

3. Pour créer un saut de page, vous pouvez utiliser les propriétés 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 ?
Partagez-la avec vos ami(e)s sur les réseaux sociaux.

Wilo Ahadi

Wilo Ahadi, l'auteur

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

Commentaires