FAQ.htm 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  5. <title>FAQ</title>
  6. <link type="text/css" rel="stylesheet" href="fpdf.css">
  7. <style type="text/css">
  8. ul {list-style-type:none; margin:0; padding:0}
  9. ul#answers li {margin-top:1.8em}
  10. .question {font-weight:bold; color:#900000}
  11. </style>
  12. </head>
  13. <body>
  14. <h1>FAQ</h1>
  15. <ul>
  16. <li><b>1.</b> <a href='#q1'>Quelle est exactement la licence de FPDF ? Y a-t-il des restrictions d'utilisation ?</a></li>
  17. <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>
  18. <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>
  19. <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>
  20. <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>
  21. <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>
  22. <li><b>7.</b> <a href='#q7'>Les caractères accentués sont remplacés par des caractères bizarres, par exemple é.</a></li>
  23. <li><b>8.</b> <a href='#q8'>J'essaie de mettre le caractère euro mais je n'y arrive pas.</a></li>
  24. <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>
  25. <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>
  26. <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>
  27. <li><b>12.</b> <a href='#q12'>Comment mettre un fond à mon PDF ?</a></li>
  28. <li><b>13.</b> <a href='#q13'>Comment mettre un en-tête ou un pied spécifique à la première page ?</a></li>
  29. <li><b>14.</b> <a href='#q14'>J'aimerais utiliser des extensions fournies par différents scripts. Comment les combiner ?</a></li>
  30. <li><b>15.</b> <a href='#q15'>Comment envoyer le PDF par mail ?</a></li>
  31. <li><b>16.</b> <a href='#q16'>Quelle est la taille limite des fichiers que je peux générer avec FPDF ?</a></li>
  32. <li><b>17.</b> <a href='#q17'>Est-ce que je peux modifier un PDF avec FPDF ?</a></li>
  33. <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>
  34. <li><b>19.</b> <a href='#q19'>Est-ce que je peux transformer une page HTML en PDF avec FPDF ?</a></li>
  35. <li><b>20.</b> <a href='#q20'>Est-ce que je peux concaténer des PDF avec FPDF ?</a></li>
  36. </ul>
  37. <ul id='answers'>
  38. <li id='q1'>
  39. <p><b>1.</b> <span class='question'>Quelle est exactement la licence de FPDF ? Y a-t-il des restrictions d'utilisation ?</span></p>
  40. La licence de FPDF est permissive : il n'y a pas de restriction d'usage. Vous pouvez l'incorporer
  41. librement dans votre application (commerciale ou non), avec ou sans modification.
  42. </li>
  43. <li id='q2'>
  44. <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>
  45. Ces caractères "bizarres" sont en fait le contenu réel du PDF. Ce comportement est un bug d'IE6.
  46. Lorsqu'il reçoit d'abord une page HTML, puis un PDF à partir de la même URL, il l'affiche
  47. directement sans lancer le plug-in Acrobat. Cela arrive fréquemment en cours de développement :
  48. à la moindre erreur de script, une page HTML est envoyée, et après correction, le PDF arrive.
  49. <br>
  50. Pour résoudre le problème, il suffit de fermer IE et de le relancer. On peut aussi aller sur
  51. une autre URL et revenir.
  52. <br>
  53. Pour éviter ce genre de désagrément durant le développement, on peut générer le PDF directement
  54. dans un fichier et l'ouvrir via l'explorateur.
  55. </li>
  56. <li id='q3'>
  57. <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>
  58. Tout d'abord, vérifiez que vous n'envoyez rien au navigateur après le PDF (même pas un espace
  59. ou un retour-chariot). Vous pouvez mettre un exit juste après l'appel à la méthode Output()
  60. pour en être sûr. Si ce n'est pas ça, c'est que vous êtes victime du syndrome de la "page blanche".
  61. IE utilisé en conjonction avec le plug-in Acrobat souffre de nombreux bugs. Pour éviter ces problèmes
  62. de manière fiable, il existe deux principales techniques :
  63. <br>
  64. <br>
  65. - Désactiver le plug-in et utiliser Acrobat comme application externe. Pour cela, lancez Acrobat, allez
  66. dans le menu Edition, Préférences, Internet, puis désactivez l'option "Afficher dans le navigateur".
  67. Puis, lorsque vous récupérez un PDF dans IE, ce dernier affiche la boîte "Ouvrir ce fichier" ou
  68. "Enregistrer ce fichier". Décochez la case "Toujours demander avant d'ouvrir ce type de fichier"
  69. et choisissez Ouvrir. Dorénavant les PDF s'ouvriront automatiquement dans une fenêtre Acrobat
  70. indépendante.
  71. <br>
  72. L'inconvénient de la méthode est qu'il faut toucher à la configuration du poste client, ce
  73. qu'on peut faire en intranet mais pas pour Internet.
  74. <br>
  75. <br>
  76. - Utiliser une technique de redirection. Le principe consiste à générer le PDF dans un fichier
  77. temporaire sur le serveur et à rediriger le client dessus. Par exemple, à la fin du script, on
  78. peut mettre :
  79. <div class="doc-source">
  80. <pre><code>//Détermination d'un nom de fichier temporaire dans le répertoire courant
  81. $file = basename(tempnam('.', 'tmp'));
  82. rename($file, $file.'.pdf');
  83. $file .= '.pdf';
  84. //Sauvegarde du PDF dans le fichier
  85. $pdf-&gt;Output($file, 'F');
  86. //Redirection
  87. header('Location: '.$file);</code></pre>
  88. </div>
  89. Cette méthode transforme un PDF dynamique en PDF statique et évite ainsi les ennuis.
  90. Par contre il faut prévoir une procédure de nettoyage pour effacer les fichiers temporaires.
  91. Par exemple :
  92. <div class="doc-source">
  93. <pre><code>function CleanFiles($dir)
  94. {
  95. //Efface les fichiers temporaires
  96. $t = time();
  97. $h = opendir($dir);
  98. while($file=readdir($h))
  99. {
  100. if(substr($file,0,3)=='tmp' &amp;&amp; substr($file,-4)=='.pdf')
  101. {
  102. $path = $dir.'/'.$file;
  103. if($t-filemtime($path)&gt;3600)
  104. @unlink($path);
  105. }
  106. }
  107. closedir($h);
  108. }</code></pre>
  109. </div>
  110. Cette fonction efface tous les fichiers de la forme tmp*.pdf dans le répertoire spécifié qui
  111. datent de plus d'une heure. Vous pouvez l'appeler où vous voulez, par exemple dans le script
  112. qui génère le PDF.
  113. </li>
  114. <li id='q4'>
  115. <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>
  116. Il faut mettre la chaîne entre guillemets et non pas entre apostrophes.
  117. </li>
  118. <li id='q5'>
  119. <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>
  120. Il faut utiliser le mot-clé <code>global</code> pour accéder aux variables globales, par exemple :
  121. <div class="doc-source">
  122. <pre><code>function Header()
  123. {
  124. global $titre;
  125. $this-&gt;SetFont('Arial', 'B', 15);
  126. $this-&gt;Cell(0, 10, $titre, 1, 1, 'C');
  127. }
  128. $titre = 'Mon titre';</code></pre>
  129. </div>
  130. Il est également possible de passer par une propriété de l'objet :
  131. <div class="doc-source">
  132. <pre><code>function Header()
  133. {
  134. $this-&gt;SetFont('Arial', 'B', 15);
  135. $this-&gt;Cell(0, 10, $this-&gt;titre, 1, 1, 'C');
  136. }
  137. $pdf-&gt;titre = 'Mon titre';</code></pre>
  138. </div>
  139. </li>
  140. <li id='q6'>
  141. <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>
  142. Il faut créer un objet de la classe PDF et non pas FPDF :
  143. <div class="doc-source">
  144. <pre><code>$pdf = new PDF();</code></pre>
  145. </div>
  146. </li>
  147. <li id='q7'>
  148. <p><b>7.</b> <span class='question'>Les caractères accentués sont remplacés par des caractères bizarres, par exemple é.</span></p>
  149. Il ne faut pas utiliser l'encodage UTF-8. Les polices standard de FPDF utilisent l'ISO-8859-1 ou Windows-1252.
  150. On peut effectuer une conversion en ISO-8859-1 grâce à utf8_decode() :
  151. <div class="doc-source">
  152. <pre><code>$str = utf8_decode($str);</code></pre>
  153. </div>
  154. Mais certains caractères comme l'euro ne seront pas correctement traduits. Si vous disposez de l'extension
  155. iconv, la bonne manière de faire est la suivante :
  156. <div class="doc-source">
  157. <pre><code>$str = iconv('UTF-8', 'windows-1252', $str);</code></pre>
  158. </div>
  159. </li>
  160. <li id='q8'>
  161. <p><b>8.</b> <span class='question'>J'essaie de mettre le caractère euro mais je n'y arrive pas.</span></p>
  162. Pour les polices standard, le caractère euro a pour code 128. Vous pouvez par commodité définir
  163. une constante comme suit :
  164. <div class="doc-source">
  165. <pre><code>define('EURO', chr(128));</code></pre>
  166. </div>
  167. </li>
  168. <li id='q9'>
  169. <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>
  170. Il ne faut rien envoyer d'autre au navigateur que le PDF lui-même : pas d'HTML, pas d'espace, pas de
  171. retour-chariot. Un cas fréquent est d'avoir des lignes vides à la fin d'un fichier inclus.<br>
  172. Si vous ne trouvez pas l'origine du problème, cet autre message apparaissant juste avant peut vous aider :<br>
  173. <br>
  174. <b>Warning:</b> Cannot modify header information - headers already sent by (output started at script.php:X)<br>
  175. <br>
  176. Cela signifie que script.php envoie quelque chose à la ligne X. Allez à cette ligne et corrigez-là.
  177. Si le message n'apparaît pas, vérifiez d'abord que vous n'avez pas désactivé l'affichage des erreurs,
  178. puis ajoutez cette ligne au tout début du script :
  179. <div class="doc-source">
  180. <pre><code>ob_end_clean();</code></pre>
  181. </div>
  182. S'il n'apparaît toujours pas, désactivez l'option zlib.output_compression dans votre php.ini.
  183. </li>
  184. <li id='q10'>
  185. <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>
  186. Pour respecter les dimensions, il faut sélectionner "Aucune" au lieu de "Réduire à la zone d'impression"
  187. dans la boîte de dialogue d'impression.
  188. </li>
  189. <li id='q11'>
  190. <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>
  191. Les imprimantes ont des marges physiques (variables en fonction du modèle), il est donc impossible de les
  192. supprimer et d'imprimer sur la totalité de la page.
  193. </li>
  194. <li id='q12'>
  195. <p><b>12.</b> <span class='question'>Comment mettre un fond à mon PDF ?</span></p>
  196. Pour une image, appelez Image() dans la méthode Header(), avant toute autre écriture. Pour mettre simplement
  197. une couleur, utilisez Rect().
  198. </li>
  199. <li id='q13'>
  200. <p><b>13.</b> <span class='question'>Comment mettre un en-tête ou un pied spécifique à la première page ?</span></p>
  201. Il suffit de tester le numéro de page :
  202. <div class="doc-source">
  203. <pre><code>function Header()
  204. {
  205. if($this-&gt;PageNo()==1)
  206. {
  207. //Première page
  208. ...
  209. }
  210. else
  211. {
  212. //Pages suivantes
  213. ...
  214. }
  215. }</code></pre>
  216. </div>
  217. </li>
  218. <li id='q14'>
  219. <p><b>14.</b> <span class='question'>J'aimerais utiliser des extensions fournies par différents scripts. Comment les combiner ?</span></p>
  220. Utilisez une chaîne d'héritage. Si vous avez deux classes, par exemple A dans a.php :
  221. <div class="doc-source">
  222. <pre><code>require('fpdf.php');
  223. class A extends FPDF
  224. {
  225. ...
  226. }</code></pre>
  227. </div>
  228. et B dans b.php :
  229. <div class="doc-source">
  230. <pre><code>require('fpdf.php');
  231. class B extends FPDF
  232. {
  233. ...
  234. }</code></pre>
  235. </div>
  236. alors faites hériter B de A :
  237. <div class="doc-source">
  238. <pre><code>require('a.php');
  239. class B extends A
  240. {
  241. ...
  242. }</code></pre>
  243. </div>
  244. et faites hériter votre propre classe de B :
  245. <div class="doc-source">
  246. <pre><code>require('b.php');
  247. class PDF extends B
  248. {
  249. ...
  250. }
  251. $pdf = new PDF();</code></pre>
  252. </div>
  253. </li>
  254. <li id='q15'>
  255. <p><b>15.</b> <span class='question'>Comment envoyer le PDF par mail ?</span></p>
  256. Comme n'importe quel autre fichier, mais une manière simple de faire est d'utiliser
  257. <a href="http://phpmailer.codeworxtech.com">PHPMailer</a> et sa fonction d'attachement en mémoire :
  258. <div class="doc-source">
  259. <pre><code>$mail = new PHPMailer();
  260. ...
  261. $doc = $pdf-&gt;Output('', 'S');
  262. $mail-&gt;AddStringAttachment($doc, 'doc.pdf', 'base64', 'application/pdf');
  263. $mail-&gt;Send();</code></pre>
  264. </div>
  265. </li>
  266. <li id='q16'>
  267. <p><b>16.</b> <span class='question'>Quelle est la taille limite des fichiers que je peux générer avec FPDF ?</span></p>
  268. Il n'y a pas de limite particulière. Il existe cependant certaines contraintes :
  269. <br>
  270. <br>
  271. - La taille mémoire allouée aux scripts PHP est généralement de 8 Mo. Pour de très gros
  272. documents, en particulier avec des images, cette limite peut être atteinte (le fichier étant
  273. construit en mémoire). Elle est paramétrée dans php.ini.
  274. <br>
  275. <br>
  276. - Le temps d'exécution alloué par défaut est de 30 secondes. Cette limite peut bien entendu
  277. être facilement dépassée. Elle est paramétrée dans php.ini et peut être éventuellement modifiée
  278. à l'exécution par set_time_limit().
  279. <br>
  280. <br>
  281. - Les navigateurs ont généralement un time-out de 5 minutes. Si vous envoyez le PDF directement
  282. au navigateur et que vous dépassez cette limite, il sera perdu. Il est donc conseillé pour les
  283. très gros documents de les générer dans un fichier, et d'envoyer des données de temps en temps
  284. au navigateur (avec un appel à flush() pour forcer l'envoi). Lorsque le document est terminé,
  285. vous pouvez effectuer une redirection dessus ou bien créer un lien.<br>
  286. Remarque : même lorsque le navigateur part en time-out, il est possible que le script continue
  287. de s'exécuter sur le serveur.
  288. </li>
  289. <li id='q17'>
  290. <p><b>17.</b> <span class='question'>Est-ce que je peux modifier un PDF avec FPDF ?</span></p>
  291. Il est possible d'importer des pages d'un PDF existant grâce à l'extension FPDI :<br>
  292. <br>
  293. <a href="http://www.setasign.de/products/pdf-php-solutions/fpdi/" target="_blank">http://www.setasign.de/products/pdf-php-solutions/fpdi/</a><br>
  294. <br>
  295. On peut ensuite leur ajouter du contenu.
  296. </li>
  297. <li id='q18'>
  298. <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>
  299. Non. Par contre il existe un utilitaire gratuit, pdftotext, capable d'extraire le contenu
  300. textuel d'un PDF. Il est fourni avec l'archive de Xpdf :<br>
  301. <br>
  302. <a href="http://www.foolabs.com/xpdf/" target="_blank">http://www.foolabs.com/xpdf/</a>
  303. </li>
  304. <li id='q19'>
  305. <p><b>19.</b> <span class='question'>Est-ce que je peux transformer une page HTML en PDF avec FPDF ?</span></p>
  306. On ne peut convertir que de l'HTML très simple, pas des pages réelles. Par contre il
  307. existe un utilitaire gratuit, htmldoc, qui permet de le faire et donne de bons résultats :<br>
  308. <br>
  309. <a href="http://www.htmldoc.org" target="_blank">http://www.htmldoc.org</a>
  310. </li>
  311. <li id='q20'>
  312. <p><b>20.</b> <span class='question'>Est-ce que je peux concaténer des PDF avec FPDF ?</span></p>
  313. 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>
  314. pour cela. Des utilitaires gratuits existent également :<br>
  315. <br>
  316. <a href="http://thierry.schmit.free.fr/spip/spip.php?rubrique7" target="_blank">mbtPdfAsm</a><br>
  317. <a href="http://www.accesspdf.com/pdftk/" target="_blank">pdftk</a>
  318. </li>
  319. </ul>
  320. </body>
  321. </html>