Je galère aussi...

Creer des fichiers PDF facilement avec PHP et FPDF

Posté par Sword dans PHP

Lors du développement d’un site, il m’a été demandé de permet l’exportation des résultats sous Pdf.
Ces documents devaient être générés dynamiquement à partir de données récupérées de MySQL, et de variables de session et de calculs, dans le but d’être sauvegarder sur le serveur et ainsi de les proposer en téléchargement.

Après une rapide étude des possibilités qui était à ma disposition j’ai opté pour FPDF. Et ce pour plusieurs raisons :
-FPDF est une classe PHP qui permet de générer des fichiers PDF en pur PHP, c’est-à-dire sans utiliser la librairie PDFlib.
-Il est open source, ce qui signifie que je peux l’utiliser gratuitement.
-FPDF ne nécessite aucune extension (à part zlib pour activer la compression) et fonctionne avec PHP 4 et PHP 5.

La vitesse de génération du document est plus faible qu’avec PDFlib (mais celui-ci est payant) mais l’écart de performance reste très raisonnable.

Afin de comprendre le fonctionnement de cette librairie, nous allons regarder un cas simple et basique : écrire une chaîne de caractère dans un pdf.

Script php

       
                <?php
                require(‘fpdf.php’);
                $pdf=new FPDF();
                $pdf->AddPage();
                $pdf->SetFont(‘Arial’,‘B’,16);
                $pdf->Cell(40,10,‘Hello World !’);
                $pdf->Output();
                ?>
 

La première ligne permet d’inclure le fichier de la classe FPDF pour la suite des opérations. La deuxième ligne permet d’instancier un nouveau objet FPDF qu’on appelle $pdf. Ainsi, on va appliquer diverses méthodes définies dans fpdf.php tel que ci-dessous :

-AddPage() : permet d’ajouter une nouvelle page au document. On peut lui passer en paramètre l’attribut L ou P pour definir si le document sera en portrait (P) ou en paysage (L). Par défaut, il sera en portrait.

-SetFont() : fixe la police utilisée pour imprimer les chaînes de caractères. Il est obligatoire d’appeler cette méthode au moins une fois avant d’imprimer du texte, sinon le document résultant ne sera pas valide. Ainsi on précise la police, le style (ici B pour gras) et le taille.

-Cell() : imprime une cellule (zone rectangulaire) avec éventuellement des bords, un fond et une chaîne de caractères.

-Output() : envoie le document vers une destination donnée : chaîne de caractères en mémoire, fichier local ou navigateur. Dans ce dernier cas, on peut utiliser le plug-in (s’il est présent) ou forcer la boîte de téléchargement de fichier.

Pour les besoins de ce pdf, j’ai crée une nouvelle classe PDF qui étend la classe FPDF (class PDF extends FPDF) dans mes fichiers de créations.

Ainsi, j’ai ajouté :
-une méthode header qui ajoute un entête de page et une autre footer qui ajoute un bas de page
-diverses autres méthodes qui me permettent de simplifier l’écriture du pdf.
Ainsi, si j’ai un texte à entrer dans le document la méthode CorpsChapitre() précise toute la mise en page du texte. De cette manière, j’évite de multiplier les lignes de code (sachant qu’il s’agit de fichiers assez lourd en lignes de code) mais surtout d’éviter d’éventuelles erreurs.
Toute entrée dans le pdf a ainsi sa méthode : AjouterChapitre(), TitreChapitre(),BasicTable()….

Voici un exemple de fonction pour que vous voyez le principe :

Script php

class PDF extends FPDF
{
function Header()
{
    global $titre;

    //Arial gras 15
    $this->SetFont(‘Arial’,‘B’,15);
    //Calcul de la largeur du titre et positionnement
    $w=$this->GetStringWidth($titre)+6;
    $this->SetX((210-$w)/2);
    //Couleurs du cadre, du fond et du texte
    $this->SetDrawColor(0,80,180);
    $this->SetFillColor(230,230,0);
    $this->SetTextColor(0,80,180);
    //Epaisseur du cadre (1 mm)
    $this->SetLineWidth(1);
    //Titre centré
    $this->Cell($w,9,$titre,1,1,‘C’,1);
    //Saut de ligne
    $this->Ln(5);
}

function Footer()
{
    //Positionnement à 1,5 cm du bas
    $this->SetY(-15);
    //Arial italique 8
    $this->SetFont(‘Arial’,‘I’,8);
    //Couleur du texte en gris
    $this->SetTextColor(128);
    //Numéro de page
        $this->Cell(0,10,‘Texte du footer’,0,0,‘C’);
    $this->Ln(3);   
        $this->Cell(0,10,‘Page ‘.$this->PageNo(),0,0,‘C’);
}

function TitreChapitre($num,$lib)
{
    //Arial 12
    $this->SetFont(‘Arial’,,12);
    //Couleur de fond
    $this->SetFillColor(200,220,255);
    $this->SetTextColor(0,0,0);
    //Titre
    $this->Cell(0,6," $num  $lib",0,1,‘L’,1);
    //Saut de ligne
    $this->Ln(4);
}

function CorpsChapitre($txt)
{
    //Times 12
    $this->SetFont(‘Times’,,12);
    //Sortie du texte justifié
    $this->MultiCell(0,5,$txt);
    //Saut de ligne
    $this->Ln();
    //Mention en italique
    $this->SetFont(,‘I’);
}

//Tableau simple
function BasicTable($header,$data)
{
        $this->SetFont(‘Times’,,12);
    //En-tête
    foreach($header as $col)
        $this->Cell(40,7,$col,1,0,‘C’);
    $this->Ln();
    //Données
    foreach($data as $row)
    {
        foreach($row as $col)
            $this->Cell(40,6,$col,1,0,‘C’);
        $this->Ln();
    }
}

function AjouterChapitre($num,$titre,$txt)
{
    $this->AddPage();
    $this->TitreChapitre($num,$titre);
    $this->CorpsChapitre($txt);
}
}
 


Tags : , , , .
Partager et découvrir : These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Netvouz
  • DZone
  • ThisNext
  • MisterWong
  • Wists

6 commentaires

  1. Anonymous

    Creer des fichiers PDF facilement avec PHP et FPDF…

    Comment gnrer un fichier PDF dynamiquement avec PHP…

  2. Osiris

    Merci pour ceux commentaires, mais il me semble bien que les hébergeurs n’acceptent pas les variables global (voir $titre, fonction header(), classe PDF hérité de FPDF), en tout cas, joli site!

  3. Sword

    Hum on peut très bien le faire sans variable global aussi ;)

  4. bart

    Petit détail: open source ne signifie pas que tu peux l’utiliser gratuitement ! Même si c’est la cas pour FPDF.

  5. pozzy_5

    je vais pas critiquez pour une fois que quelqu’un explique plutôt pas mal comment générer un fichier pdf avec php.
    Merci à toi.
    Pozzy_5

    P.S: ton site est bien sympas!

  6. mannok

    Nouveau en PDF et FPDF, mon projet doit aussi permettre de générer dynamiquement des PDF à partir de données récupérées de MySQL, et de variables de session et de calculs. J’ai tous les problèmes pour afficher les variables de sessions et les calculs. Aidez-moi SVP
    SWORD Pourrais-je avoir un aperçu de ton code comme exemple. Merci

Donne ton avis