123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349 |
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
- <title>FAQ</title>
- <link type="text/css" rel="stylesheet" href="fpdf.css">
- <style type="text/css">
- ul {list-style-type:none; margin:0; padding:0}
- ul#answers li {margin-top:1.8em}
- .question {font-weight:bold; color:#900000}
- </style>
- </head>
- <body>
- <h1>FAQ</h1>
- <ul>
- <li><b>1.</b> <a href='#q1'>Quelle est exactement la licence de FPDF ? Y a-t-il des restrictions d'utilisation ?</a></li>
- <li><b>2.</b> <a href='#q2'>Lorsque j'essaie de créer un PDF, plein de caractères bizarres s'affichent à l'écran.</a></li>
- <li><b>3.</b> <a href='#q3'>J'essaie de générer un PDF et IE m'affiche une page blanche. Que se passe-t-il ?</a></li>
- <li><b>4.</b> <a href='#q4'>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.</a></li>
- <li><b>5.</b> <a href='#q5'>J'essaie d'afficher une variable dans la méthode Header mais rien ne s'imprime.</a></li>
- <li><b>6.</b> <a href='#q6'>J'ai défini les méthodes Header et Footer dans ma classe PDF mais rien ne s'affiche.</a></li>
- <li><b>7.</b> <a href='#q7'>Les caractères accentués sont remplacés par des caractères bizarres, par exemple é.</a></li>
- <li><b>8.</b> <a href='#q8'>J'essaie de mettre le caractère euro mais je n'y arrive pas.</a></li>
- <li><b>9.</b> <a href='#q9'>J'ai l'erreur suivante quand j'essaie de générer un PDF : Some data has already been output, can't send PDF file</a></li>
- <li><b>10.</b> <a href='#q10'>Je dessine un cadre avec des dimensions très précises, mais à l'impression je constate des écarts.</a></li>
- <li><b>11.</b> <a href='#q11'>Je voudrais utiliser toute la surface de la page mais à l'impression j'ai toujours des marges. Comment les enlever ?</a></li>
- <li><b>12.</b> <a href='#q12'>Comment mettre un fond à mon PDF ?</a></li>
- <li><b>13.</b> <a href='#q13'>Comment mettre un en-tête ou un pied spécifique à la première page ?</a></li>
- <li><b>14.</b> <a href='#q14'>J'aimerais utiliser des extensions fournies par différents scripts. Comment les combiner ?</a></li>
- <li><b>15.</b> <a href='#q15'>Comment envoyer le PDF par mail ?</a></li>
- <li><b>16.</b> <a href='#q16'>Quelle est la taille limite des fichiers que je peux générer avec FPDF ?</a></li>
- <li><b>17.</b> <a href='#q17'>Est-ce que je peux modifier un PDF avec FPDF ?</a></li>
- <li><b>18.</b> <a href='#q18'>Je voudrais faire un moteur de recherche en PHP et indexer des PDF. Est-ce que je peux le faire avec FPDF ?</a></li>
- <li><b>19.</b> <a href='#q19'>Est-ce que je peux transformer une page HTML en PDF avec FPDF ?</a></li>
- <li><b>20.</b> <a href='#q20'>Est-ce que je peux concaténer des PDF avec FPDF ?</a></li>
- </ul>
- <ul id='answers'>
- <li id='q1'>
- <p><b>1.</b> <span class='question'>Quelle est exactement la licence de FPDF ? Y a-t-il des restrictions d'utilisation ?</span></p>
- La licence de FPDF est permissive : il n'y a pas de restriction d'usage. Vous pouvez l'incorporer
- librement dans votre application (commerciale ou non), avec ou sans modification.
- </li>
- <li id='q2'>
- <p><b>2.</b> <span class='question'>Lorsque j'essaie de créer un PDF, plein de caractères bizarres s'affichent à l'écran.</span></p>
- Ces caractères "bizarres" sont en fait le contenu réel du PDF. Ce comportement est un bug d'IE6.
- 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.
- <br>
- 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.
- <br>
- 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.
- </li>
- <li id='q3'>
- <p><b>3.</b> <span class='question'>J'essaie de générer un PDF et IE m'affiche une page blanche. Que se passe-t-il ?</span></p>
- 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 nombreux bugs. Pour éviter ces problèmes
- de manière fiable, il existe deux principales techniques :
- <br>
- <br>
- - Désactiver le plug-in et utiliser Acrobat comme application externe. Pour cela, lancez Acrobat, allez
- dans le menu Edition, Préférences, Internet, puis désactivez l'option "Afficher dans le navigateur".
- Puis, lorsque vous récupérez un PDF dans IE, ce dernier affiche la boîte "Ouvrir ce fichier" ou
- "Enregistrer ce fichier". Décochez la case "Toujours demander avant d'ouvrir ce type de fichier"
- et choisissez Ouvrir. Dorénavant les PDF s'ouvriront automatiquement dans une fenêtre Acrobat
- indépendante.
- <br>
- L'inconvénient de la méthode est qu'il faut toucher à la configuration du poste client, ce
- qu'on peut faire en intranet mais pas pour Internet.
- <br>
- <br>
- - Utiliser une technique de redirection. Le principe consiste à générer le PDF dans un fichier
- temporaire sur le serveur et à rediriger le client dessus. Par exemple, à la fin du script, on
- peut mettre :
- <div class="doc-source">
- <pre><code>//Détermination d'un nom de fichier temporaire dans le répertoire courant
- $file = basename(tempnam('.', 'tmp'));
- rename($file, $file.'.pdf');
- $file .= '.pdf';
- //Sauvegarde du PDF dans le fichier
- $pdf->Output($file, 'F');
- //Redirection
- header('Location: '.$file);</code></pre>
- </div>
- Cette méthode transforme un PDF dynamique en PDF statique et évite ainsi les ennuis.
- Par contre il faut prévoir une procédure de nettoyage pour effacer les fichiers temporaires.
- Par exemple :
- <div class="doc-source">
- <pre><code>function CleanFiles($dir)
- {
- //Efface les fichiers temporaires
- $t = time();
- $h = opendir($dir);
- while($file=readdir($h))
- {
- if(substr($file,0,3)=='tmp' && substr($file,-4)=='.pdf')
- {
- $path = $dir.'/'.$file;
- if($t-filemtime($path)>3600)
- @unlink($path);
- }
- }
- closedir($h);
- }</code></pre>
- </div>
- Cette fonction efface tous les fichiers de la forme tmp*.pdf dans le répertoire spécifié qui
- datent de plus d'une heure. Vous pouvez l'appeler où vous voulez, par exemple dans le script
- qui génère le PDF.
- </li>
- <li id='q4'>
- <p><b>4.</b> <span class='question'>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.</span></p>
- Il faut mettre la chaîne entre guillemets et non pas entre apostrophes.
- </li>
- <li id='q5'>
- <p><b>5.</b> <span class='question'>J'essaie d'afficher une variable dans la méthode Header mais rien ne s'imprime.</span></p>
- Il faut utiliser le mot-clé <code>global</code> pour accéder aux variables globales, par exemple :
- <div class="doc-source">
- <pre><code>function Header()
- {
- global $titre;
- $this->SetFont('Arial', 'B', 15);
- $this->Cell(0, 10, $titre, 1, 1, 'C');
- }
- $titre = 'Mon titre';</code></pre>
- </div>
- Il est également possible de passer par une propriété de l'objet :
- <div class="doc-source">
- <pre><code>function Header()
- {
- $this->SetFont('Arial', 'B', 15);
- $this->Cell(0, 10, $this->titre, 1, 1, 'C');
- }
- $pdf->titre = 'Mon titre';</code></pre>
- </div>
- </li>
- <li id='q6'>
- <p><b>6.</b> <span class='question'>J'ai défini les méthodes Header et Footer dans ma classe PDF mais rien ne s'affiche.</span></p>
- Il faut créer un objet de la classe PDF et non pas FPDF :
- <div class="doc-source">
- <pre><code>$pdf = new PDF();</code></pre>
- </div>
- </li>
- <li id='q7'>
- <p><b>7.</b> <span class='question'>Les caractères accentués sont remplacés par des caractères bizarres, par exemple é.</span></p>
- Il ne faut pas utiliser l'encodage UTF-8. Les polices standard de FPDF utilisent l'ISO-8859-1 ou Windows-1252.
- On peut effectuer une conversion en ISO-8859-1 grâce à utf8_decode() :
- <div class="doc-source">
- <pre><code>$str = utf8_decode($str);</code></pre>
- </div>
- Mais certains caractères comme l'euro ne seront pas correctement traduits. Si vous disposez de l'extension
- iconv, la bonne manière de faire est la suivante :
- <div class="doc-source">
- <pre><code>$str = iconv('UTF-8', 'windows-1252', $str);</code></pre>
- </div>
- </li>
- <li id='q8'>
- <p><b>8.</b> <span class='question'>J'essaie de mettre le caractère euro mais je n'y arrive pas.</span></p>
- Pour les polices standard, le caractère euro a pour code 128. Vous pouvez par commodité définir
- une constante comme suit :
- <div class="doc-source">
- <pre><code>define('EURO', chr(128));</code></pre>
- </div>
- </li>
- <li id='q9'>
- <p><b>9.</b> <span class='question'>J'ai l'erreur suivante quand j'essaie de générer un PDF : Some data has already been output, can't send PDF file</span></p>
- Il ne faut rien envoyer d'autre au navigateur que le PDF lui-même : pas d'HTML, pas d'espace, pas de
- retour-chariot. Un cas fréquent est d'avoir des lignes vides à la fin d'un fichier inclus.<br>
- Si vous ne trouvez pas l'origine du problème, cet autre message apparaissant juste avant peut vous aider :<br>
- <br>
- <b>Warning:</b> Cannot modify header information - headers already sent by (output started at script.php:X)<br>
- <br>
- Cela signifie que script.php envoie quelque chose à la ligne X. Allez à cette ligne et corrigez-là.
- Si le message n'apparaît pas, vérifiez d'abord que vous n'avez pas désactivé l'affichage des erreurs,
- puis ajoutez cette ligne au tout début du script :
- <div class="doc-source">
- <pre><code>ob_end_clean();</code></pre>
- </div>
- S'il n'apparaît toujours pas, désactivez l'option zlib.output_compression dans votre php.ini.
- </li>
- <li id='q10'>
- <p><b>10.</b> <span class='question'>Je dessine un cadre avec des dimensions très précises, mais à l'impression je constate des écarts.</span></p>
- Pour respecter les dimensions, il faut sélectionner "Aucune" au lieu de "Réduire à la zone d'impression"
- dans la boîte de dialogue d'impression.
- </li>
- <li id='q11'>
- <p><b>11.</b> <span class='question'>Je voudrais utiliser toute la surface de la page mais à l'impression j'ai toujours des marges. Comment les enlever ?</span></p>
- Les imprimantes ont 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.
- </li>
- <li id='q12'>
- <p><b>12.</b> <span class='question'>Comment mettre un fond à mon PDF ?</span></p>
- Pour une image, appelez Image() dans la méthode Header(), avant toute autre écriture. Pour mettre simplement
- une couleur, utilisez Rect().
- </li>
- <li id='q13'>
- <p><b>13.</b> <span class='question'>Comment mettre un en-tête ou un pied spécifique à la première page ?</span></p>
- Il suffit de tester le numéro de page :
- <div class="doc-source">
- <pre><code>function Header()
- {
- if($this->PageNo()==1)
- {
- //Première page
- ...
- }
- else
- {
- //Pages suivantes
- ...
- }
- }</code></pre>
- </div>
- </li>
- <li id='q14'>
- <p><b>14.</b> <span class='question'>J'aimerais utiliser des extensions fournies par différents scripts. Comment les combiner ?</span></p>
- Utilisez une chaîne d'héritage. Si vous avez deux classes, par exemple A dans a.php :
- <div class="doc-source">
- <pre><code>require('fpdf.php');
- class A extends FPDF
- {
- ...
- }</code></pre>
- </div>
- et B dans b.php :
- <div class="doc-source">
- <pre><code>require('fpdf.php');
- class B extends FPDF
- {
- ...
- }</code></pre>
- </div>
- alors faites hériter B de A :
- <div class="doc-source">
- <pre><code>require('a.php');
- class B extends A
- {
- ...
- }</code></pre>
- </div>
- et faites hériter votre propre classe de B :
- <div class="doc-source">
- <pre><code>require('b.php');
- class PDF extends B
- {
- ...
- }
- $pdf = new PDF();</code></pre>
- </div>
- </li>
- <li id='q15'>
- <p><b>15.</b> <span class='question'>Comment envoyer le PDF par mail ?</span></p>
- Comme n'importe quel autre fichier, mais une manière simple de faire est d'utiliser
- <a href="http://phpmailer.codeworxtech.com">PHPMailer</a> et sa fonction d'attachement en mémoire :
- <div class="doc-source">
- <pre><code>$mail = new PHPMailer();
- ...
- $doc = $pdf->Output('', 'S');
- $mail->AddStringAttachment($doc, 'doc.pdf', 'base64', 'application/pdf');
- $mail->Send();</code></pre>
- </div>
- </li>
- <li id='q16'>
- <p><b>16.</b> <span class='question'>Quelle est la taille limite des fichiers que je peux générer avec FPDF ?</span></p>
- Il n'y a pas de limite particulière. Il existe cependant certaines contraintes :
- <br>
- <br>
- - La taille mémoire allouée aux scripts PHP est généralement 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.
- <br>
- <br>
- - 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().
- <br>
- <br>
- - 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 (avec un appel à flush() pour forcer l'envoi). Lorsque le document est terminé,
- vous pouvez effectuer une redirection dessus ou bien créer un lien.<br>
- Remarque : même lorsque le navigateur part en time-out, il est possible que le script continue
- de s'exécuter sur le serveur.
- </li>
- <li id='q17'>
- <p><b>17.</b> <span class='question'>Est-ce que je peux modifier un PDF avec FPDF ?</span></p>
- Il est possible d'importer des pages d'un PDF existant grâce à l'extension FPDI :<br>
- <br>
- <a href="http://www.setasign.de/products/pdf-php-solutions/fpdi/" target="_blank">http://www.setasign.de/products/pdf-php-solutions/fpdi/</a><br>
- <br>
- On peut ensuite leur ajouter du contenu.
- </li>
- <li id='q18'>
- <p><b>18.</b> <span class='question'>Je voudrais faire un moteur de recherche en PHP et indexer des PDF. Est-ce que je peux le faire avec FPDF ?</span></p>
- Non. Par contre il existe un utilitaire gratuit, pdftotext, capable d'extraire le contenu
- textuel d'un PDF. Il est fourni avec l'archive de Xpdf :<br>
- <br>
- <a href="http://www.foolabs.com/xpdf/" target="_blank">http://www.foolabs.com/xpdf/</a>
- </li>
- <li id='q19'>
- <p><b>19.</b> <span class='question'>Est-ce que je peux transformer une page HTML en PDF avec FPDF ?</span></p>
- On ne peut convertir que de l'HTML très simple, pas des pages réelles. Par contre il
- existe un utilitaire gratuit, htmldoc, qui permet de le faire et donne de bons résultats :<br>
- <br>
- <a href="http://www.htmldoc.org" target="_blank">http://www.htmldoc.org</a>
- </li>
- <li id='q20'>
- <p><b>20.</b> <span class='question'>Est-ce que je peux concaténer des PDF avec FPDF ?</span></p>
- Pas directement, mais il est possible d'utiliser <a href="http://www.setasign.de/products/pdf-php-solutions/fpdi/demos/concatenate-fake/" target="_blank">FPDI</a>
- pour cela. Des utilitaires gratuits existent également :<br>
- <br>
- <a href="http://thierry.schmit.free.fr/spip/spip.php?rubrique7" target="_blank">mbtPdfAsm</a><br>
- <a href="http://www.accesspdf.com/pdftk/" target="_blank">pdftk</a>
- </li>
- </ul>
- </body>
- </html>
|