[php] Générer des PDF avec DomPDF et CakePHP

Générer des PDF sous CakePHP n'a jamais été aussi simple.

Posté par Flavien BENINCA (ozee31) le 4 mai 2016

Générer des PDF avec DomPDF et CakePHP

Grâce à la librairie DomPDF couplé au plugin cakephp-dompdf, il est très facile de générer des PDF en HTML/CSS.

Environnement

Voici ma configuration pour cette démo

  • Une VM ubuntu server en version 14
  • Server Apache
  • PHP en version 7 (la version minimale est la 5.4.16)
  • CakePHP en version 3.2 (la version minimale est la 3.0)
  • La librairie DomPDF en version 0.7
  • Le plugin cakephp-dompdf en version 1.0

Installation

Pour installer la librairie ainsi que le plugin, rien de plus simple en utilisant composer

composer require daoandco/cakephp-dompdf

Très important, il ne faut pas oublié de générer les liens symboliques du plugin.

bin/cake plugin assets symlink

On charge ensuite le plugin

<?php
// config/bootstrap.php

Plugin::load('Dompdf');

En route pour l’aventure

Le plus simple pour générer les PDF est d’écouter les urls afin de traiter l’extension .pdf (Documentation)

On va donc, pour l’exemple définir une auto route.

<?php
Router::scope('/', function (RouteBuilder $routes) {
  $routes->extensions(['pdf']);
  $routes->connect('/demo/view/*', ['controller' => 'Demo', 'action' => 'view']);
}

Et pour le controlleur :

<?php
// scr/Controller/DemoController.php

namespace App\Controller;

class DemoController extends AppController {

  public function view($name) {

  }
}

On teste notre route http://localhost/demo/view/test.pdf et bim!!!

Template is missing

Ne vous inquiétez pas, c’est normal, pas de panique on a pas encore créé notre template.

J’ai view un PDF

Comme on écoute toujours la maîtresse et que l’on est bien sage, on va créer notre fichier view.ctp dans Demo/pdf/view.ctp

<!-- src/Template/Demo/pdf/view.ctp -->

<h1>Ceci est un pédéhèffe</h1>

<p>Il est généré avec Dôme Pédéhèffe</p>

Hey, t’est bien gentil mais là il me demande de créer un layout.

Oui je sais mais comme la vie est bien faite, notre petit plugin inclut justement un Layout qui nous permet entre autre de fixer un header ainsi qu’un footer.

Plugue ton Layout

Pour faire les choses bien (il faut toujours faire les choses bien), on va modifier notre Controller

<?php
public function view($name) {

  $this->viewBuilder()
    ->className('Dompdf.Pdf')
    ->layout('Dompdf.default')
    ->options(['config' => [
      'filename' => $name,
      'render' => 'browser',
  ]]);
}

On recharge la page, et là, sous vos yeux ébahis, un magnifique PDF apparaît dans votre Firefox (comment ça vous n’utilisez pas Firefox ?)

Le pdf généré

Tout ça juste pour charger un Layout ?

En fait on a surtout dit à CakePHP d’utiliser le plugin pour générer la vue, je vous invite à lire la documentation du plugin pour comprendre ce que je viens de faire.

Je veux du CSS et des nanas

Bon les h1 et les p c’est bien gentil mais comment je style ça ? Et les images comment ça marche ?

On y viens, et on va même faire un header et un footer comme je suis gentil.

Allez c’est parti on crée notre beau css

/* webroot/css/demo.css */

h1 {
  color: red;
}

Et comme tout est prévu, notre beau petit plugin possède un helper, on peut donc modifier notre fichier view.ctp

<!-- src/Template/Demo/pdf/view.ctp -->

<?= $this->Dompdf->css('demo'); ?>

<h1>Ceci est un pédéhèffe</h1>

<p>Il est généré avec Dôme Pédéhèffe</p>

Ah oui, j’oubliais les nanas, pour les images c’est aussi avec le helper (et on en profite pour rajouter le header et le footer)

<!-- src/Template/Demo/pdf/view.ctp -->

<?= $this->Dompdf->css('demo'); ?>

<?php
$this->start('header');
  echo '<p>I\'m a header</p>';
$this->end();

$this->start('footer');
  echo '<p>I\'m a footer</p>';
$this->end();
?>

<h1>Ceci est un pédéhèffe</h1>

<p>Il est généré avec Dôme Pédéhèffe</p>

<?= $this->Dompdf->image('nanas.jpg'); ?>

On actualise la page, et voilà notre PDF stylé comme jamais enter image description here

Aller plus loin

Je vous invite à lire la documentation du plugin qui est très complète.