FPDF est Freeware (c'est indiqué au début du fichier source). Il n'y a pas de restriction d'usage. Vous pouvez l'incorporer librement dans votre application (commerciale ou non), avec ou sans modification.
2. Lorsque j'essaie de créer un PDF, plein de caractères bizarres s'affichent à l'écran.Ces caractères "bizarres" sont en fait le contenu réel du PDF. Ce comportement est un bug d'IE.
Lorsqu'il reçoit d'abord une page HTML, puis un PDF à partir de la même URL, il l'affiche
directement sans lancer le plug-in Acrobat. Cela arrive fréquemment en cours de développement :
à la moindre erreur de script, une page HTML est envoyée, et après correction, le PDF arrive.
Pour résoudre le problème, il suffit de fermer IE et de le relancer. On peut aussi aller sur
une autre URL et revenir.
Pour éviter ce genre de désagrément durant le développement, on peut générer le PDF directement
dans un fichier et l'ouvrir via l'explorateur.
Tout d'abord, vérifiez que vous n'envoyez rien au navigateur après le PDF (même pas un espace
ou un retour-chariot). Vous pouvez mettre un exit juste après l'appel à la méthode Output()
pour en être sûr.
Si ce n'est pas ça, c'est que vous êtes victime du syndrome de la "page blanche". IE utilisé
en conjonction avec le plug-in Acrobat souffre de très nombreux bugs, quelles que soient les
versions. Essayez de tester votre application avec le plus de versions d'IE possible (en tout cas
si elle est sur Internet). Le problème survient surtout lorsqu'on utilise la méthode POST, c'est
pourquoi il est déconseillé de l'utiliser (d'autant qu'elle pose d'autres problèmes, voir la
question suivante). Le GET marche mieux mais peut échouer lorsque l'URL devient trop longue : il
ne faut pas dépasser 45 caractères pour la query string. Il existe cependant une astuce pour
dépasser cette limite : terminer l'URL par .pdf, ce qui trompe IE. Si vous utilisez un
formulaire, il suffit de rajouter un champ caché en dernière position :
<INPUT TYPE="HIDDEN" NAME="ext" VALUE=".pdf"> |
//Détermination d'un nom de fichier temporaire dans le répertoire courant $file=basename(tempnam(getcwd(),'tmp')); //Sauvegarde du PDF dans le fichier $pdf->Output($file); //Redirection JavaScript echo "<HTML><SCRIPT>document.location='getpdf.php?f=$file';</SCRIPT></HTML>"; |
<?php $f=$HTTP_GET_VARS['f']; //Contrôle du fichier (à ne pas oublier !) if(substr($f,0,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_ENV_VARS['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; ?> |
//Détermination d'un nom de fichier temporaire dans le répertoire courant $file=basename(tempnam(getcwd(),'tmp')); rename($file,$file.'.pdf'); $file.='.pdf'; //Sauvegarde du PDF dans le fichier $pdf->Output($file); //Redirection JavaScript echo "<HTML><SCRIPT>document.location='$file';</SCRIPT></HTML>"; |
function CleanFiles($dir) { //Efface les fichiers temporaires $t=time(); $h=opendir($dir); while($file=readdir($h)) { if(substr($file,0,3)=='tmp' and substr($file,-4)=='.pdf') { $path=$dir.'/'.$file; if($t-filemtime($path)>3600) @unlink($path); } } closedir($h); } |
C'est un problème qui affecte certaines versions d'IE (en particulier la première 5.5). Voir la question précédente pour les moyens de le contourner.
5. Lorsque j'utilise une session PHP, IE n'affiche plus mon PDF mais propose de le télécharger.C'est un problème qui affecte certaines versions d'IE. Pour le contourner, ajoutez la ligne
suivante avant session_start() :
session_cache_limiter('private'); |
Il s'agit d'un problème lié aux paramètres nationaux. Le séparateur décimal est configuré comme
étant une virgule alors que le point est nécessaire pour obtenir des documents valides. Pour
rétablir le bon paramètre, il suffit de mettre la ligne suivante :
setlocale('LC_NUMERIC','C'); |
setlocale('LC_NUMERIC','en'); |
setlocale('LC_NUMERIC','en_US'); |
Acrobat 5 a un bug et ne peut pas afficher les images transparentes monochromes (i.e. avec 1 bit par pixel). Enlevez la transparence ou passez votre image en 16 couleurs (4 bits par pixel) ou plus.
8. Je voudrais mettre mon image en taille réelle dans mon PDF. Comment convertir les pixels en mm ?Une image n'a pas de "taille réelle". La dimension qu'on lui donne dans le document est arbitraire. A moins que vous ne vouliez imposer une résolution particulière (par exemple 300 dpi), auquel cas le rapport entre la taille en pixels et la résolution donne la longueur.
9. Je n'arrive pas à faire de retour à la ligne. J'ai bien mis \n dans la chaîne imprimée par MultiCell mais ça ne marche pas.Il faut mettre la chaîne entre guillemets et non pas entre apostrophes.
10. J'essaie de mettre le caractère euro mais je n'y arrive pas.Pour les polices standard, le caractère euro a pour code 128. Vous pouvez par commodité définir
une constante comme suit :
define('EURO',chr(128)); |
Pour respecter les dimensions, il faut décocher la case "Ajuster" dans la boîte de dialogue d'impression.
12. Je voudrais utiliser toute la surface de la page mais à l'impression j'ai toujours des marges. Comment les enlever ?Les imprimantes ont toutes des marges physiques (variables en fonction du modèle), il est donc impossible de les supprimer et d'imprimer sur la totalité de la page.
13. Quelle est la taille limite des fichiers que je peux générer avec FPDF ?Il n'y a pas de limite particulière. Il existe cependant certaines contraintes :
- La taille mémoire allouée par défaut aux scripts PHP est de 8 Mo. Pour de très gros
documents, en particulier avec des images, cette limite peut être atteinte (le fichier étant
construit en mémoire). Elle est paramétrée dans php.ini.
- Le temps d'exécution alloué par défaut est de 30 secondes. Cette limite peut bien entendu
être facilement dépassée. Elle est paramétrée dans php.ini et peut être éventuellement modifiée
à l'exécution par set_time_limit().
- Les navigateurs ont généralement un time-out de 5 minutes. Si vous envoyez le PDF directement
au navigateur et que vous dépassez cette limite, il sera perdu. Il est donc conseillé pour les
très gros documents de les générer dans un fichier, et d'envoyer des données de temps en temps
au navigateur (par exemple page 1, page 2... en utilisant flush() pour forcer l'envoi).
Lorsque le fichier est terminé, vous pouvez effectuer une redirection dessus avec JavaScript
ou bien créer un lien.
Remarque : même lorsque le navigateur part en time-out, le script continue généralement à
s'exécuter sur le serveur.
Non. Il y aura (j'espère) une version à l'avenir permettant d'importer le contenu d'un PDF pour pouvoir l'enrichir.
15. Je voudrais faire un moteur de recherche en PHP et indexer des PDF. Est-ce que je peux le faire avec FPDF ?Non. Par contre il existe un utilitaire en C, pdftotext, capable d'extraire le contenu textuel
d'un PDF. Il est fourni avec l'archive de Xpdf.
http://www.foolabs.com/xpdf/
Non. Par contre il existe un utilitaire en C, htmldoc, qui permet de le faire et qui donne de
bons résultats.
http://www.easysw.com/htmldoc/
Non.
18. Comment faire pour activer les protections sur un PDF ? Je voudrais empêcher qu'on puisse copier-coller le texte ou modifier le document.On ne peut pas actuellement. Protéger un PDF nécessite de le crypter, et l'algorithme utilisé (RC4) n'est en principe pas libre (bien qu'il y ait un certain flou à ce sujet et qu'il semble qu'il soit toléré pour des applications non commerciales). La question nécessite d'être approfondie.