Je développe actuellement une application intranet pour mon boulot et j'ai besoin de générer des pdf dynamiquement. Mon choix s'est donc porté sur la bibliothèque TCPDF de Nicola Asuni, dérivée de la vieille FPDF d'Olivier Plathey.
Et je vais vous montrer comment l'utiliser simplement dans une application construite avec le framework Yii.
Importer la classe
La première chose à faire pour pouvoir utiliser la classe tcpdf est de dire à Yii où la trouver.
Pour cela, il faut tout d'abord créer un dossier, que vous appellerez obligatoirement "vendors", dans le dossier "protected", qui est le cœur de votre application.
Ensuite, dans ce dossier fraichement créé, vous glissez le contenu de l'archive que vous aurez téléchargée au préalable sur le site de sourceforge.
Au final, l'arborescence de votre application doit ressembler à ceci :
-
Yii
- assets
- css
- images
-
protected
- commands
- components
- config
-
controllers
- GenerateurController.php
- data
- extensions
- messages
-
models
- Generateur.php
- modules
- runtime
- tests
-
vendors
- tcpdf
-
views
-
generateur
- generateur.php
-
layouts
- pdf.php
-
generateur
- widgets
- themes
Dans le contrôleur avec lequel vous souhaitez générer des pdf (que nous appellerons "générateur" pour l'exemple), avant la déclaration de sa classe, il faut ajouter les deux lignes suivantes :
Yii::import('application.vendors.*'); require 'tcpdf/tcpdf.php';
NB : La documentation préconise l'utilisation de require_once, mais si vous n'utilisez pas la classe ailleurs, cela n'est pas nécessaire et permettra d'augmenter un peu le temps de chargement.
Le choix de la langue
Le choix de la langue se fait par l'intermédiaire d'une méthode du contrôleur générateur, appelée "lang()" :
// TCPDF language file (contains translated texts). // @package com.tecnick.tcpdf // @abstract TCPDF language file. // @author Nicola Asuni // @copyright 2004-2009 Nicola Asuni // Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY // www.tecnick.com - info(at)tecnick.com // @link http://tcpdf.sourceforge.net // @license http://www.gnu.org/copyleft/lesser.html LGPL // since 2004-03-03 function lang() { // ENGLISH $l = Array(); // PAGE META DESCRIPTORS $l['a_meta_charset'] = 'UTF-8'; $l['a_meta_dir'] = 'ltr'; $l['a_meta_language'] = 'fr'; // TRANSLATIONS $l['w_page'] = 'page'; return $l; }
La variable $l (lire $L) retournée sera utilisée dans la vue un peu plus tard. Elle doit être passée à la vue par la méthode associée du contrôleur :
public function actionGenerateur() { //Définition du layout pdf $this->layout = '//layouts/pdf'; /* ICI VOTRE SCRIPT */ $this->render('generateur', array( 'model'=> A DEFINIR, 'l'=>$this->lang(); }
Le layout pdf
Il doit être le plus épuré possible :
<?php $content;?>
Personnalisation du pdf
Si vous souhaitez personnaliser, par exemple, les entêtes ou les pieds de page du pdf généré, il vous faut ajouter une nouvelle classe qui étendra les fonctionnalités de la classe tcpdf. J'ai choisi de la placer dans le même fichier que celui du contrôleur générateur. Je vous laisse vous reporter aux exemples pour savoir comme faire .
/** * MyPdf * Customize header and footer * * @date 03/08/2011 * @author Maguire Cyril **/ class MyPdf extends TCPDF { private $titre; public function Titre($titre = null) { return $this->titre = $titre; } //Header public function Header() { $this->SetFont('helvetica', 'B', 8); $this->Ln(5); $this->Cell(0,0,Yii::t('app','Mon pdf'),0,'','C'); $this->Ln(10); $this->SetFont('helvetica','',10); $this->writeHtml($this->Titre($this->titre),false,false,false,false,'C'); } //Footer public function Footer() { $this->SetFont('helvetica', '', 6); $this->SetY(-15); $this->Cell(0,10,Yii::t('app','Page ').$this->getAliasNumPage().'/'.$this->getAliasNbPages(),0,0,'C'); } }
La vue
Le pdf sera généré lors de l'appel de la vue par un lien depuis une autre vue.
On placera la génération du contenu du pdf dans une variable que l'on affectera grâce aux données récupérées par les fonctions de bufferisation de sortie (ob_xxxxx) :
<?php $titre = 'Le titre que je veux donner à mon pdf'; $nom = 'Le_nom_du_document_genere'; ob_start(); /* ICI VOTRE SCRIPT POUR GENERER LE CONTENU DYNAMIQUEMENT */ $contenu = ob_get_contents(); ob_end_clean(); //------------------------- // CONFIGURATION DU PDF //------------------------- //Création d'un objet MyPdf $pdf = new MyPdf(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); //Affectation du titre $pdf->Titre($titre); //Informations sur le document généré $pdf->SetCreator(PDF_CREATOR); $pdf->SetAuthor('Votre serviteur'); $pdf->SetTitle($nom); $pdf->SetSubject('Comment générer un pdf avec tcpdf'); $pdf->SetKeywords('tcpdf,Yii,générer pdf'); //Header par défaut $pdf->SetHeaderData('', PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE, PDF_HEADER_STRING); //Polices pour Header et Footer $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN,'',PDF_FONT_SIZE_MAIN); $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA); //Default monospace font $pdf->SetDefaultMonospaceFont(PDF_FONT_MONOSPACE); //Définition des marges du documents $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); $pdf->SetHeaderMargin(15); $pdf->SetFooterMargin(PDF_MARGIN_FOOTER); //Sauts de page automatiques $pdf->SetAutoPageBreak(true, PDF_MARGIN_BOTTOM); //facteur d'échelle pour les images $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); //Définition de la langue du pdf généré par appel de la variable $l définie dans le contrôleur $pdf->setLanguageArray($l); //------------------------- // LE CONTENU DU PDF //------------------------- $pdf->addPage(); $pdf->SetLineWidth(0.3); $pdf->SetFont('','B'); $pdf->SetFont('helvetica','',6); $pdf->writeHtml($contenu, true, false, false, false, 'C'); $pdf->Ln(); $pdf->LastPage(); //------------------------- // FERMETURE ET GENERATION DU PDF //------------------------- $pdf->Output($nom.'.pdf', 'D'); ?>
Pour conclure
TCPDF est vraiment une classe qui vaut le détour. Les possibilités offertes sont quasi-illimitées et les pdf générés sont de qualité.
A vous de jouer.