TUTORIELS 

Utiliser la librairie FPDF
Par Cyril Pierre de Geyer (Kaptive / PHPTeam)

Présentation d'une alternative gratuite à la PDFLib, librairie permettant de créer des documents PDF à la volée: FPDF.  (16 avril 2002)
 

Introduction à la librairie FPDF

FPDF est une classe PHP qui permet de générer dynamiquement des fichiers PDF en pur PHP, c'est-à-dire sans utiliser la librairie PDFlib (donc sans payer). Le F de FPDF signifie Free : vous êtes libre de l'utiliser et de la modifier comme vous le souhaitez.
FPDF a d'autres avantages : des fonctions de haut niveau. 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 et PNG)
- Couleurs
- Compression des pages

FPDF ne nécessite aucune extension (à part Zlib pour activer la compression) et est compatible avec PHP3 jusqu'à la version 1.31.

Installer la librairie FPDF

La première étape consiste à "downloader" les fichiers de la librairie.
Au 1er avril 2002 la version en cours est la 1.41. Vous pouvez la télécharger sur le
site de l' auteur.
Vous devrez alors mettre les fichiers de la FPDF dans votre arborescence Web.
C'est fait ? Vous pouvez déjà utiliser la FPDF en utilisant des "include".
Cependant il peut être intéressant de définir le chemin d'accès à la FPDF dans la variable include_path.

Un premier exemple

Script PHP pour un document PDF "hello world"
<?
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 librairie, 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.

Utiliser des entêtes et pieds de pages

Un document PDF plus complexe
<?php
require('fpdf.php');

class PDF extends FPDF
{
  //En-tête
  function Header()
  {
    //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();
?>
[Voir le résultat]

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.

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 apparaît que la librairie FPDF est un outil très puissant et très 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 lib FPDF pour une multitude de raisons.
Un exemple plus poussé peut être trouvé ici.
La FPDF n'a cependant pas encore toutes les fonctionnalités que pourrait offrir un Acrobat Writer mais c'est un très bon début. Bravo à l'auteur et qu'il continue ! Les prochaines fonctionnalités : Liens, Figures géométriques, Polices TrueType, Jeux de caractères autres que Windows-1252, Signets.

 
[ Cyril Pierre de Geyer,pour JDNet
 
Accueil | Haut de page