tuto6.htm 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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>Liens et texte en mode flot</title>
  6. <link type="text/css" rel="stylesheet" href="../fpdf.css">
  7. </head>
  8. <body>
  9. <h1>Liens et texte en mode flot</h1>
  10. Ce tutoriel explique comment insérer des liens (internes et externes) et montre un nouveau mode
  11. d'écriture du texte. Il contient également un parseur HTML rudimentaire.
  12. <div class="source">
  13. <pre><code>&lt;?php
  14. <span class="kw">require(</span><span class="str">'fpdf.php'</span><span class="kw">);
  15. class </span>PDF <span class="kw">extends </span>FPDF
  16. <span class="kw">{
  17. var </span>$B<span class="kw">;
  18. var </span>$I<span class="kw">;
  19. var </span>$U<span class="kw">;
  20. var </span>$HREF<span class="kw">;
  21. function </span>PDF<span class="kw">(</span>$orientation<span class="kw">=</span><span class="str">'P'</span><span class="kw">,</span>$unit<span class="kw">=</span><span class="str">'mm'</span><span class="kw">,</span>$format<span class="kw">=</span><span class="str">'A4'</span><span class="kw">)
  22. {
  23. </span><span class="cmt">//Appel au constructeur parent
  24. </span>$<span class="kw">this-&gt;</span>FPDF<span class="kw">(</span>$orientation<span class="kw">,</span>$unit<span class="kw">,</span>$format<span class="kw">);
  25. </span><span class="cmt">//Initialisation
  26. </span>$<span class="kw">this-&gt;</span>B<span class="kw">=</span>0<span class="kw">;
  27. </span>$<span class="kw">this-&gt;</span>I<span class="kw">=</span>0<span class="kw">;
  28. </span>$<span class="kw">this-&gt;</span>U<span class="kw">=</span>0<span class="kw">;
  29. </span>$<span class="kw">this-&gt;</span>HREF<span class="kw">=</span><span class="str">''</span><span class="kw">;
  30. }
  31. function </span>WriteHTML<span class="kw">(</span>$html<span class="kw">)
  32. {
  33. </span><span class="cmt">//Parseur HTML
  34. </span>$html<span class="kw">=</span>str_replace<span class="kw">(</span><span class="str">"\n"</span><span class="kw">,</span><span class="str">' '</span><span class="kw">,</span>$html<span class="kw">);
  35. </span>$a<span class="kw">=</span>preg_split<span class="kw">(</span><span class="str">'/&lt;(.*)&gt;/U'</span><span class="kw">,</span>$html<span class="kw">,-</span>1<span class="kw">,</span>PREG_SPLIT_DELIM_CAPTURE<span class="kw">);
  36. foreach(</span>$a <span class="kw">as </span>$i<span class="kw">=&gt;</span>$e<span class="kw">)
  37. {
  38. if(</span>$i<span class="kw">%</span>2<span class="kw">==</span>0<span class="kw">)
  39. {
  40. </span><span class="cmt">//Texte
  41. </span><span class="kw">if(</span>$<span class="kw">this-&gt;</span>HREF<span class="kw">)
  42. </span>$<span class="kw">this-&gt;</span>PutLink<span class="kw">(</span>$<span class="kw">this-&gt;</span>HREF<span class="kw">,</span>$e<span class="kw">);
  43. else
  44. </span>$<span class="kw">this-&gt;</span>Write<span class="kw">(</span>5<span class="kw">,</span>$e<span class="kw">);
  45. }
  46. else
  47. {
  48. </span><span class="cmt">//Balise
  49. </span><span class="kw">if(</span>$e<span class="kw">[</span>0<span class="kw">]==</span><span class="str">'/'</span><span class="kw">)
  50. </span>$<span class="kw">this-&gt;</span>CloseTag<span class="kw">(</span>strtoupper<span class="kw">(</span>substr<span class="kw">(</span>$e<span class="kw">,</span>1<span class="kw">)));
  51. else
  52. {
  53. </span><span class="cmt">//Extraction des attributs
  54. </span>$a2<span class="kw">=</span>explode<span class="kw">(</span><span class="str">' '</span><span class="kw">,</span>$e<span class="kw">);
  55. </span>$tag<span class="kw">=</span>strtoupper<span class="kw">(</span>array_shift<span class="kw">(</span>$a2<span class="kw">));
  56. </span>$attr<span class="kw">=array();
  57. foreach(</span>$a2 <span class="kw">as </span>$v<span class="kw">)
  58. {
  59. if(</span>preg_match<span class="kw">(</span><span class="str">'/([^=]*)=["\']?([^"\']*)/'</span><span class="kw">,</span>$v<span class="kw">,</span>$a3<span class="kw">))
  60. </span>$attr<span class="kw">[</span>strtoupper<span class="kw">(</span>$a3<span class="kw">[</span>1<span class="kw">])]=</span>$a3<span class="kw">[</span>2<span class="kw">];
  61. }
  62. </span>$<span class="kw">this-&gt;</span>OpenTag<span class="kw">(</span>$tag<span class="kw">,</span>$attr<span class="kw">);
  63. }
  64. }
  65. }
  66. }
  67. function </span>OpenTag<span class="kw">(</span>$tag<span class="kw">,</span>$attr<span class="kw">)
  68. {
  69. </span><span class="cmt">//Balise ouvrante
  70. </span><span class="kw">if(</span>$tag<span class="kw">==</span><span class="str">'B' </span><span class="kw">|| </span>$tag<span class="kw">==</span><span class="str">'I' </span><span class="kw">|| </span>$tag<span class="kw">==</span><span class="str">'U'</span><span class="kw">)
  71. </span>$<span class="kw">this-&gt;</span>SetStyle<span class="kw">(</span>$tag<span class="kw">,</span>true<span class="kw">);
  72. if(</span>$tag<span class="kw">==</span><span class="str">'A'</span><span class="kw">)
  73. </span>$<span class="kw">this-&gt;</span>HREF<span class="kw">=</span>$attr<span class="kw">[</span><span class="str">'HREF'</span><span class="kw">];
  74. if(</span>$tag<span class="kw">==</span><span class="str">'BR'</span><span class="kw">)
  75. </span>$<span class="kw">this-&gt;</span>Ln<span class="kw">(</span>5<span class="kw">);
  76. }
  77. function </span>CloseTag<span class="kw">(</span>$tag<span class="kw">)
  78. {
  79. </span><span class="cmt">//Balise fermante
  80. </span><span class="kw">if(</span>$tag<span class="kw">==</span><span class="str">'B' </span><span class="kw">|| </span>$tag<span class="kw">==</span><span class="str">'I' </span><span class="kw">|| </span>$tag<span class="kw">==</span><span class="str">'U'</span><span class="kw">)
  81. </span>$<span class="kw">this-&gt;</span>SetStyle<span class="kw">(</span>$tag<span class="kw">,</span>false<span class="kw">);
  82. if(</span>$tag<span class="kw">==</span><span class="str">'A'</span><span class="kw">)
  83. </span>$<span class="kw">this-&gt;</span>HREF<span class="kw">=</span><span class="str">''</span><span class="kw">;
  84. }
  85. function </span>SetStyle<span class="kw">(</span>$tag<span class="kw">,</span>$enable<span class="kw">)
  86. {
  87. </span><span class="cmt">//Modifie le style et sélectionne la police correspondante
  88. </span>$<span class="kw">this-&gt;</span>$tag<span class="kw">+=(</span>$enable <span class="kw">? </span>1 <span class="kw">: -</span>1<span class="kw">);
  89. </span>$style<span class="kw">=</span><span class="str">''</span><span class="kw">;
  90. foreach(array(</span><span class="str">'B'</span><span class="kw">,</span><span class="str">'I'</span><span class="kw">,</span><span class="str">'U'</span><span class="kw">) as </span>$s<span class="kw">)
  91. {
  92. if(</span>$<span class="kw">this-&gt;</span>$s<span class="kw">&gt;</span>0<span class="kw">)
  93. </span>$style<span class="kw">.=</span>$s<span class="kw">;
  94. }
  95. </span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">''</span><span class="kw">,</span>$style<span class="kw">);
  96. }
  97. function </span>PutLink<span class="kw">(</span>$URL<span class="kw">,</span>$txt<span class="kw">)
  98. {
  99. </span><span class="cmt">//Place un hyperlien
  100. </span>$<span class="kw">this-&gt;</span>SetTextColor<span class="kw">(</span>0<span class="kw">,</span>0<span class="kw">,</span>255<span class="kw">);
  101. </span>$<span class="kw">this-&gt;</span>SetStyle<span class="kw">(</span><span class="str">'U'</span><span class="kw">,</span>true<span class="kw">);
  102. </span>$<span class="kw">this-&gt;</span>Write<span class="kw">(</span>5<span class="kw">,</span>$txt<span class="kw">,</span>$URL<span class="kw">);
  103. </span>$<span class="kw">this-&gt;</span>SetStyle<span class="kw">(</span><span class="str">'U'</span><span class="kw">,</span>false<span class="kw">);
  104. </span>$<span class="kw">this-&gt;</span>SetTextColor<span class="kw">(</span>0<span class="kw">);
  105. }
  106. }
  107. </span>$html<span class="kw">=</span><span class="str">'Vous pouvez maintenant imprimer facilement du texte mélangeant différents styles : &lt;b&gt;gras&lt;/b&gt;,
  108. &lt;i&gt;italique&lt;/i&gt;, &lt;u&gt;souligné&lt;/u&gt;, ou &lt;b&gt;&lt;i&gt;&lt;u&gt;tous à la fois&lt;/u&gt;&lt;/i&gt;&lt;/b&gt; !&lt;br&gt;&lt;br&gt;Vous pouvez aussi
  109. insérer des liens sous forme textuelle, comme &lt;a href="http://www.fpdf.org"&gt;www.fpdf.org&lt;/a&gt;, ou bien
  110. sous forme d\'image : cliquez sur le logo.'</span><span class="kw">;
  111. </span>$pdf<span class="kw">=new </span>PDF<span class="kw">();
  112. </span><span class="cmt">//Première page
  113. </span>$pdf<span class="kw">-&gt;</span>AddPage<span class="kw">();
  114. </span>$pdf<span class="kw">-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span>20<span class="kw">);
  115. </span>$pdf<span class="kw">-&gt;</span>Write<span class="kw">(</span>5<span class="kw">,</span><span class="str">'Pour découvrir les nouveautés de ce tutoriel, cliquez '</span><span class="kw">);
  116. </span>$pdf<span class="kw">-&gt;</span>SetFont<span class="kw">(</span><span class="str">''</span><span class="kw">,</span><span class="str">'U'</span><span class="kw">);
  117. </span>$link<span class="kw">=</span>$pdf<span class="kw">-&gt;</span>AddLink<span class="kw">();
  118. </span>$pdf<span class="kw">-&gt;</span>Write<span class="kw">(</span>5<span class="kw">,</span><span class="str">'ici'</span><span class="kw">,</span>$link<span class="kw">);
  119. </span>$pdf<span class="kw">-&gt;</span>SetFont<span class="kw">(</span><span class="str">''</span><span class="kw">);
  120. </span><span class="cmt">//Seconde page
  121. </span>$pdf<span class="kw">-&gt;</span>AddPage<span class="kw">();
  122. </span>$pdf<span class="kw">-&gt;</span>SetLink<span class="kw">(</span>$link<span class="kw">);
  123. </span>$pdf<span class="kw">-&gt;</span>Image<span class="kw">(</span><span class="str">'logo.png'</span><span class="kw">,</span>10<span class="kw">,</span>12<span class="kw">,</span>30<span class="kw">,</span>0<span class="kw">,</span><span class="str">''</span><span class="kw">,</span><span class="str">'http://www.fpdf.org'</span><span class="kw">);
  124. </span>$pdf<span class="kw">-&gt;</span>SetLeftMargin<span class="kw">(</span>45<span class="kw">);
  125. </span>$pdf<span class="kw">-&gt;</span>SetFontSize<span class="kw">(</span>14<span class="kw">);
  126. </span>$pdf<span class="kw">-&gt;</span>WriteHTML<span class="kw">(</span>$html<span class="kw">);
  127. </span>$pdf<span class="kw">-&gt;</span>Output<span class="kw">();
  128. </span>?&gt;</code></pre>
  129. </div>
  130. <p class='demo'><a href='tuto6.php' target='_blank' class='demo'>[Démo]</a></p>
  131. La nouvelle méthode pour imprimer du texte est <a href='../doc/write.htm'>Write()</a>. Elle est très proche de <a href='../doc/multicell.htm'>MultiCell()</a> ;
  132. les différences sont les suivantes :
  133. <ul>
  134. <li>La fin de ligne est au niveau de la marge droite et la ligne suivante commence à la marge gauche</li>
  135. <li>La position courante se déplace juste à la fin du texte</li>
  136. </ul>
  137. Elle permet donc d'écrire une portion de texte, de modifier la police, puis de reprendre à partir
  138. de l'endroit où on était resté. Par contre on ne peut plus justifier.
  139. <br>
  140. <br>
  141. La méthode est utilisée sur la première page pour mettre un lien pointant sur la seconde. Le
  142. début de la phrase est écrit en style normal, puis on passe en souligné pour terminer. Le lien
  143. est créé grâce à la méthode <a href='../doc/addlink.htm'>AddLink()</a>, qui renvoie l'identifiant du lien. Cet identifiant
  144. est passé en troisième paramètre à <span style="white-space:nowrap">Write()</span>. Après avoir
  145. créé la seconde page, on utilise <a href='../doc/setlink.htm'>SetLink()</a> pour faire pointer le lien sur le début de la
  146. page courante.
  147. <br>
  148. <br>
  149. On place ensuite une image avec un lien externe dessus. Un lien externe pointe sur une URL (HTTP,
  150. mailto...). L'URL est simplement transmise en dernier paramètre de <a href='../doc/image.htm'>Image()</a>.
  151. <br>
  152. <br>
  153. Enfin, la marge gauche est déplacée après l'image grâce à <a href='../doc/setleftmargin.htm'>SetLeftMargin()</a> et du texte au
  154. format HTML est imprimé. Un parseur HTML très simple est utilisé pour cela, basé sur les
  155. expressions régulières. Les balises reconnues sont &lt;b&gt;, &lt;i&gt;, &lt;u&gt;, &lt;a&gt;
  156. et &lt;br&gt; ; les autres sont ignorées. Le parseur utilise lui aussi la méthode Write(). Le lien externe se pose de la
  157. même façon que l'interne (troisième paramètre de Write()). A noter que <a href='../doc/cell.htm'>Cell()</a> permet
  158. également de poser des liens.
  159. </body>
  160. </html>