Générer des PDF en mode hors-ligne

Dans un des précédents tutoriaux, j’ai montré comment générer et afficher un PDF à l’écran avec CakePHP v3. J’ai fait également mention de la possibilité d’écrire le fichier sur disque (option ‘F’ dans la fonction output de TCPDF).

Mais comment faire si l’on veut générer le fichier PDF sans rien afficher sur l’écran ? uniquement en faisant appel à une fonction en interne, et bien entendu tout en utilisant une vue générée par notre application ?

Voici ma petite astuce :

Je demande à CakePHP de créer la vue (PDF dans notre cas), sans l’afficher. CakePHP va donc générer tout le code HTML qui sera interprété par notre librairie PDF, et qui va ensuite l’enregistrer sur le disque. Tout cela à l’insu de l’utilisateur qui ne saura jamais qu’en cliquant sur le bouton « générer » le fichier PDF aura été produit.

Pour ce faire, rajouter la directive suivante dans le controller qui contiendra l’action de création du fichier PDF :

use Cake\View\View;

Créez une action que nous appellerons « generer_pdf » (comme par hasard), l’explication du code est dans les commentaires :

public function generer_pdf() {
$datas = $this->ma_fonction_de_recuperation();
                $filename = 'mon_fichier_pdf' . date('d-m-Y'); // création du nom du fichier PDF
                $view = new View(); // on créé une instance de la classe View
                $view->set(compact('datas', 'filename')); // on envoie à la classe nos variables
                $viewdata = $view->render('mon_controller/pdf/vue', 'pdf/default');
} // on demande le rendu du fichier PDF avec la vue /mon_controller/pdf/vue.ctp et le layout Layout/pdf/default.ctp

Vous l’aurez compris si vous avez lu le précédent tutorial, dans le fichier /Layout/pdf/default.ctp nous indiquerons que nous générons le fichier en sortie fichier uniquement :

$tcpdf->Output(APP . DS . 'pdf' . DS . $filename . '.pdf', 'F');

J’attire votre attention sur ce code au-dessus, j’ai volontairement généré le fichier en-dehors du webroot, donc le fichier ne sera pas accessible directement par téléchargement à l’utilisateur, il faudra donc passer par un controller de « téléchargement » pour récupérer le fichier.

Pourquoi ?

Pour des raisons de sécurité, cela permet de garder le contrôle de qui télécharge les fichiers, rajouter des statistiques, etc.

Pour parfaire notre petit bout de code nous pourrions même rajouter une routine de vérification de bon déroulement de l’opération et renvoyer un code de retour.

Nous pourrions écrire un petit truc de ce genre :

public function generer_pdf() {
try {
$datas = $this->ma_fonction_de_recuperation();
                $filename = 'mon_fichier_pdf' . date('d-m-Y');
                $view = new View(); // on créé une instance de la classe View
                $view->set(compact('datas', 'filename'));
                $viewdata = $view->render('mon_controller/pdf/vue', 'pdf/default');
return (file_exists(APP . DS . 'pdf' . DS . $filename . '.pdf'));
} catch (Exception $ex) {
return false
}
}

Cette fonction pourra donc être utilisée comme suit :

if ($this->generer_pdf()) {
                $this->Flash->success(__('Votre fichier PDF est prêt !'));
} else {
                $this->Flash->error(__('Erreur de création du PDF'));
}

Voilà en quelques lignes de code comment créer un fichier PDF en mode hors-ligne, en espérant que cela vous sera utile.

A bientôt !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *