Liker
Discuter
Partager
Offrir
Youtube

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

Mis à jour il y a 2 semaines

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.

Wilo Ahadi

Auteur

Wilo A.

Technologies

Laravel, PHP

Introduction à laravel-dompdf

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 :

  • 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
  • Les images (GIF, PNG, JPG, …) et offre un support pour SVG
  • Les tableaux (lignes, colonnes, bordures de tableau, style de cellule, …)
  • La police d’écriture (font)

Nous voulons voir dans ce guide comment installer, configurer et utiliser le package laravel-dompdf dans un projet Laravel.

Installer et configurer laravel-dompdf

Voici la procédure pour télécharger, intégrer et configurer le package laravel-dompdf dans un projet Laravel :

1. Télécharger laravel-dompdf

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

Importation de laravel-dompdf par composer

2. Intégrer 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
    ],
// ...

3. Configurer laravel-dompdf

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 :

  • orientation (string) : la disposition en portrait ("portrait") ou en paysage ("landscape")
  • default_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", …)
  • ...

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
]);

Utiliser laravel-dompdf

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)$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"));

Astuces

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

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 Suivre

Commentaires