Générer du PDF
Publié par cyruss il y a 4 mois
Introduction à la bibliothèque FPDF
FPDF est une classe PHP qui permet de générer dynamiquement des fichiers PDF en pur PHP. Le F de FPDF signifie Free : vous êtes libre de l'utiliser et de la modifier comme vous le souhaitez.
Voici une liste de ses principales fonctionnalités :
- Choix des unités et des marges
- Gestion des en-têtes et pieds de page
- Composition du document par cellules
- Saut de page automatique
- Saut de ligne automatique et justification
- Images (JPEG, PNG et GIF)
- Compression des pages
- Gestion des signets
- Compatible PHP 5
FPDF ne nécessite aucune extension (à part Zlib pour activer la compression).
Installer la bibliothèque FPDF
La première étape consiste à downloder les fichiers de la bibliothèque.
Installez les fichiers dans votre arborescence Web.
C'est fait ! vous pouvez deja utiliser la FPDF en utilisant des include.
Cependant il peut être interessant de définir le chemin d'acces à la FPDF dans la variable include_path.
La bibliothèque FPDF est développée en objet. Même sans avoir de notion d'objet vous devriez comprendre le fonctionnement. Cependant je vous invite à vous rendre sur l'article objet de commentcamarche pour en savoir plus.
Un premier exemple
- <?php
- require('fpdf.php');
- $pdf=new FPDF();
- $pdf->Open();
- $pdf->AddPage();
- $pdf->SetFont('Arial','B',16);
- $pdf->Cell(40,10,'Hello World !');
- $pdf->Output();
- ?>
[Voir le résultat]
Après avoir inclus la bibliothèque, un objet FPDF est créé. Le constructeur FPDF() est utilisé ici avec les valeurs par défaut. Les pages sont en portrait A4 et l'unité de mesure est le millimètre. On aurait pu l'indiquer explicitement par :
$pdf=new FPDF('P','mm','A4');
Il est possible de passer en paysage (L), d'utiliser d'autres formats de page (comme A3 et A5) ainsi que d'autres unités de mesure (pt, cm, in).
Open() commence le document PDF. Il n'y a pour l'instant encore aucune page, c'est pourquoi il faut en ajouter une avec AddPage(). L'origine est en haut à gauche et la position courante est placée par défaut à 1 cm des bords; on peut changer ces marges par SetMargins().
Avant d'imprimer du texte, il est impératif de définir la police avec SetFont(), sinon le document serait invalide. On choisit de l'Arial gras en taille 16 :
$pdf->SetFont('Arial','B',16);
On aurait pu spécifier de l'italique avec (I) ou une police sans style avec une chaîne vide. A noter que la taille de la police est ici donnée en points, pas en millimètres (ou autre unité choisie); c'est la seule exception. Les autres polices disponibles sont Times, Courier, Symbol et ZapfDingbats.
On imprime ensuite une cellule grâce à Cell(). Une cellule est une zone rectangulaire, éventuellement encadrée, qui contient du texte. Elle est imprimée à la position courante. On spécifie ses dimensions, le texte (centré ou aligné), si des bords doivent être tracés, et si la position courante doit être déplacée à droite, en dessous ou bien doit retourner au début de la ligne suivante. On aurait par exemple encadré le texte comme ceci :
$pdf->Cell(40,10,'Hello World !',1);
Si on veut ajouter une nouvelle cellule à droite avec du texte centré et retourner à la ligne, on fait :
$pdf->Cell(60,10,'Powered by FPDF.',0,1,'C');
Remarque : le retour à la ligne peut également s'effectuer grâce à la méthode Ln(). Cette dernière permet de préciser en plus la hauteur du saut de ligne.
Enfin, le document est terminé et envoyé au navigateur grâce à Output(). On aurait pu le sauvegarder directement dans un fichier en passant le nom souhaité.
Attention : dans le cas où le PDF est envoyé au navigateur, rien d'autre ne doit être envoyé, ni avant, ni après (le moindre espace ou retour-chariot compte). Si vous envoyez des données avant, vous obtiendrez le message : "Some data has already been output to browser, can't send PDF file". Si vous en envoyez après, il se peut que le navigateur affiche une page blanche.
Cet exemple exploite les méthodes Header() et Footer() pour traiter les en-têtes et pieds de page. Elles sont appelées automatiquement. Leur implémentation dans la classe FPDF est vide, aussi doit-on dériver la classe et les redéfinir.
Le logo est imprimé grâce à la méthode Image() en précisant le coin supérieur gauche et la largeur. La hauteur est calculée automatiquement afin de respecter la proportion de l'image.
- <?php
- require('fpdf.php');
- class PDF extends FPDF
- {
- //En-tête
- {
- //Logo
- $this->Image('logo_pb.png',10,8,33);
- //Police Arial gras 15
- $this->SetFont('Arial','B',15);
- //Décalage à droite
- $this->Cell(80);
- //Titre
- $this->Cell(30,10,'Titre',1,0,'C');
- //Saut de ligne
- $this->Ln(20);
- }
- //Pied de page
- function Footer()
- {
- //Positionnement à 1,5 cm du bas
- $this->SetY(-15);
- //Police Arial italique 8
- $this->SetFont('Arial','I',8);
- //Numéro de page
- $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C');
- }
- }
- //Instanciation de la classe dérivée
- $pdf=new PDF();
- $pdf->Open();
- $pdf->AliasNbPages();
- $pdf->AddPage();
- $pdf->SetFont('Times','',12);
- for($i=1;$i<=40;$i++)
- $pdf->Cell(50,10,'Impression de la ligne numéro '.$i,0,1);
- $pdf->Output();
- ?>
Pour imprimer le numéro de page, une valeur nulle est passée comme largeur de cellule. Cela signifie que cette dernière doit s'étendre jusqu'à la marge droite de la page; c'est pratique pour centrer du texte.
Le numéro de page courant est retourné par la méthode PageNo(); le nombre total de pages s'obtient quant à lui grâce à la valeur spéciale {nb} qui sera substituée lorsque le document sera terminé (à condition d'avoir au préalable appelé AliasNbPages()). A noter l'utilisation de la méthode SetY() qui permet de se positionner de manière absolue dans la page, à partir du haut ou du bas.
Une autre fonctionnalité intéressante est ici utilisée : le saut de page automatique. Lorsqu'une cellule descend trop bas (à 2 centimètres du bas de la page par défaut), un saut de page est effectué et la police est restaurée.
Bien que l'en-tête et le pied de page spécifient leur propre police (Arial), le corps de la page continue en Times. Ce principe de restauration automatique s'applique aussi à l'épaisseur des traits et aux couleurs. Le seuil de déclenchement du saut de page se règle avec SetAutoPageBreak().
Conclusion
En conclusion il apparait que la bibliothèque FPDF est un outil tres puissant et tres orienté pour le monde professionel où il est tres important de disposer d'un standard de communication. Effectivement les documents word ne sont pas universellement lisibles et le standard le plus utilisé est le PDF. Les utilisations sont multiples : du plan à la facture en passant par des articles vous pouvez utiliser la biliothèque FPDF pour une multitude de raisons.
Nous vous invitons également à consulter le tutoriel expliquant comment utiliser des templates PDF dans la rubrique expert.
Liens
Témoignages
Cyril PIERRE de GEYER (Anaska formation) :
Nous incluons dans nos formations PHP une session sur la FPDF qui ravit nos clients. Un de nos client l'a notament utilisé pour afficher les résultats (températures, pression,..) de leurs cuves de préparation d'ingrédients chimiques.. La création des pdf se fait en utilisant la bibliothèque JPGraph et la bibliothèque FPDF.
Nous même utilisons la FPDF pour générer notre catalogue de formation sur l'OpenSource en ligne
Maxime Delorme (société de services en environnement) :
Nous proposons à nos clients des outils publiant automatiquement des formulaires administratifs pré-remplis au format PDF.
Ces formulaires se doivent d'être conformes à l'original et imprimables. Le format PDF (contrairement à HTML) est le seul à nous garantir ces deux qualités. Le gros avantage de fpdf est la possibilité de placer les données au pixel près sur une page tout en contrôlant les débordement de cadre (dus à des textes trop long par exemple).
Avant d'utiliser la bibliothèque FPDF nous utilisions pc4p avec la bibliothèque pdflib. Grâce à fpdf le code ont diminués de 80%, le résultat est impeccable et des fonctionnalités complémentaires à pc4p nous permettent de répondre à toutes les demandes de nos clients.