- 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.

Informations
6-03-2013
Le site www.laboratoire-ambio.fr vient d'être certifié HONcode.
5-12-2012
Dans le cadre de la procédure de Labellisation auprès des collectivités membres du Syndicat Mixte...
28-03-2012
Toute nouvelle section sur notre site pour vous présenter une nouvelle rubrique qui sera entièreme...
22-08-2009
Un cluster Single System Image (SSI) comme Kerrighed offre la vue d'une unique machine multi-process...
21-08-2009
Grâce aux efforts continus de la communauté open source, Heartbeat2 permet de mettre en place des ...
17-10-2008
Sortie le 13 Oct 2008 et compatible avec Office 2007 de Microsoft la nouvelle mouture de OpenOffice...
29-05-2008
... Et profitez d'un Web meilleur : Mozilla tente d'établir un record du nombre de logiciels télÃ...
29-08-2007
Plusieurs extensions permettent d'intégrer les éléments de cette API mise à disposition par Goog...
Services | Solutions | Formations | Portfolio | Accès Client
© 2004-2015 ACCEDO - Siret : 452 155 112 00033
105, Impasse La Corbière - 50400 GRANVILLE
Tél : 06 83 88 31 78