- Plan du Site | Contact

Générer du PDF avec PHP

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. 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 plus haut niveau. Voici une liste de ses principales fonctionnalités :

  • Choix des unités, du format des pages et des marges
  • Gestion des en-têtes et pieds de page
  • Saut de page automatique
  • Saut de ligne automatique et justification
  • Images (JPEG et PNG)
  • Couleurs
  • Liens
  • Support des polices TrueType et Type1
  • Compression des pages

 

 

Utilisation

FPDF est une librairie libre qui permet de générer facilement des fichiers pdf à partir de scripts PHP. Son utilisation est relativement simple et le site www.fpdf.org étant très bien documenté concernant son implémentation, cet article sera plus orienté vers la résolution de problèmes spécifiques rencontrés lors de son utilisation dans divers projets.

 

Attention : cet article s'adresse à des développeurs PHP ayant déjà de bonnes notions et maitrisant notamment l'utilisation de classes et d'objets. Pour toute demande ou information complémentaire, n'hésitez pas à consulter / utiliser la FAQ. Merci de votre attention.

 

Déclaration de Base de Données

Pour des besoins évidents, il est parfois utile de pouvoir consulter une base de données directement lors de la génération de fichiers PDF en récupérant l'objet de connexion à la base que vous utilisez ailleurs dans votre code. Pour ce faire, il est possible (c'est une solution comme autre) d'ajouter un paramètre à la classe d'origine FPDF.

 

Pour ce faire, il suffit d'ajouter sa déclaration dans votre propre implémentation (fichier myFPDF.class.php, par exemple):

<?php

session_start();

 

class myFPDF extends FPDF {

 

  var $db;

 

  function myFPDF ($orientation='P',$unit='mm',$format='A4',$db){

    parent::FPDF($orientation='P',$unit='mm',$format='A4');

    $this->db = $db;

  }

 

(...)

 

}

Générer plusieurs fichiers à la volée...

Apparemment simple, ce problème est finalement plus ardu qu'il ne semble. La génération d'un fichier PDF envoyant ses headers, il n'est pas possible de générer plusieurs documents et de les envoyer au navigateur directement et tous ensembles. C'est en parcourant la très bonne FAQ du site fpdf.org que j'ai pu (enfin !) trouver cette solution :

Principe Général

Selon la méthode basée sur la génération d'un fichier temporaire, on génèrera d'abord les fichiers dans un répertoire tmp/ (par exemple). Au passage, on enregistre dans une variable de session les fichiers avec un identifiant unique avant de faire une redirection de type header vers une autre page qui pourra afficher de nouvelles informations (opération suivante dans l'applicatif, affichage d'un récapitulatif, etc...) et qui ouvrira via javascript un pop-up appellant la page getpdf.php dont il est question dans la FAQ citée ci-dessus pour chaque entrée trouvée dans la variable de session.

Code & Explications

Génération des Documents

  • les conditions $_POST['print_contrat'] et $_POST['print_facture'] correspondent à des cases à cocher dans un formulaire appelant
  • ensuite, on prépare les pdf à partir d'informations envoyées dans un tableau $tab éventuellement complété par des informations issues de la base de données
  • enfin, on génère des noms de fichiers uniques basés sur le nom d'utilisateur et sur un horodatage à la seconde avec $fic = './tmp/0'.$_SESSION['idu'].date("dmYHis").'.pdf';

 

Vous pouvez éventuellement, pour le pas déclarer toutes vos classes à chaque fois utiliser la fonction autoload (PHP5+) :

/* AUTOLOAD LIBRAIRIE LOCALES */

function __autoload($class_name){

  require_once 'lib/'.$class_name.'.class.php';

}

function genereFacture ($session='facture'){

  if($_POST['print_contrat']=="on"){

    // Impression Du Contrat

    $_SESSION['print'] = 'contrat';

    $pdf = new myFPDF($orientation='P',$unit='mm',$format='A4',$this->db);

    $pdf->AliasNbPages();

    $pdf->SetMargins(5,5);

    $pdf->SetAutoPageBreak(1,15);

    $pdf->Contrat($tab);

    $fic = './tmp/0'.$_SESSION['idu'].date("dmYHis").'.pdf';

    $_SESSION['pdf'][] = $fic;

    $pdf->Output($fic,'F');

  }

i  f($_POST['print_facture']=="on"){

    // Impression Facture

    $_SESSION['print'] = 'vente/facture';

    $pdf = new myFPDF($orientation='P',$unit='mm',$format='A4',$this->db);

    $pdf->AliasNbPages();

    $pdf->SetMargins(5,5);

    $pdf->SetAutoPageBreak(1,15);

    $pdf->Facture($tab);

    $fic = './tmp/1'.$_SESSION['idu'].date("dmYHis").'.pdf';

    $_SESSION['pdf'][] = $fic;

    $pdf->Output($fic,'F');

  }

header("Location: http:/localhost/");exit();

}

Appels Javascripts

function getPDF(){

  $cnt = '';

  if($_SESSION['pdf']!=""){

    if(is_array(($_SESSION['pdf']))){

      foreach($_SESSION['pdf'] as $c => $v){

        $cnt .= '<script>window.open("getpdf.php?c='.$c.'", "getpdf'.$c.'", "toolbar=no, location=no, directories=no, status=no, scrollbars=auto, resizable=no, copyhistory=no, width=500, height=375, left=200, top=100");</script>'."\n";

      }

    }else{

      $cnt = '<script>window.open("getpdf.php", "getpdf", "toolbar=no, location=no, directories=no, status=no, scrollbars=auto, resizable=no, copyhistory=no, width=500, height=375, left=200, top=100");</script>'."\n";

    }

  }

  return $cnt;

}

Fichier getpdf.php

<?php

session_start();

if($_SESSION['pdf']!=""){

  if(is_array(($_SESSION['pdf']))){

    $f=$_SESSION['pdf'][$_GET['c']];

    unset($_SESSION['pdf'][$_GET['c']]);

  }else{

    $f=$_SESSION['pdf'];

    unset($_SESSION['pdf']);

  }

  //Contrôle du fichier (à ne pas oublier !)

  if(substr($f,2,3)!='tmp' or strpos($f,'/') or strpos($f,'\\'))

    //die("Nom de fichier incorrect");

    if(!file_exists($f))

      die("Le fichier n'existe pas");

  //Traitement de la requête spéciale IE au cas où

  if($HTTP_SERVER_VARS['HTTP_USER_AGENT']=='contype'){

    Header('Content-Type: application/pdf');

    exit;

  }

  //Envoi du PDF

  Header('Content-Type: application/pdf');

  Header('Content-Length: '.filesize($f));

  readfile($f);

  //Suppression du fichier

  unlink($f);

  exit;

}

?>

Note

Si cet article vous a été de quelque secours, n'hésitez pas à laisser un message sur notre Blog / FAQ, il est là pour cela ! Merci.

Actualités
29-08-2007
Plusieurs extensions permettent d'intégrer les éléments de cette API mise à disposition par Google.
1-03-2007
TinyButStrong est un moteur de Template pour le language PHP.
20-11-2006
Le LABEL CLE a été décerné au Portail de la Communauté de Communes de Sartilly.
9-11-2006
Depuis sa version 2.0, OpenOffice n'a plus rien à démontrer face aux suites logicielles de bureautiq...
9-11-2006
Disponible dans plus de 33 langues, le nouveau Firefox est encore plus rapide, plus sûr et totalemen...
8-11-2006
Artichow est une librairie qui permet de créer simplement des graphiques avec PHP et GD. On pourra a...
25-08-2006
Le célèbre navigateur "Firefox" est plus performant que jamais. Naviguez sur le Web avec confiance !
25-08-2006
Un des meilleurs CMS ! TYPO3 dispose de références prestigieuses à travers l’Europe et est intégré ...
Services | Solutions | Formations | Portfolio | Photos | F.A.Q. | Accès Client
© 2004-2008 ACCEDO - Siret : 452 155 112 00017
6, Chemin des Moires - 50740 CAROLLES
Tél : 06 83 88 31 78