- Plan du Site | Contact |
|
Générer du PDF avec PHPFPDF 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 :
UtilisationFPDF 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éesPour 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éralSelon 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 & ExplicationsGénération des Documents
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; } ?>
NoteSi 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. |
|
||||||
Services | Solutions | Formations | Portfolio | Accès Client |