[2] | 1 | <HTML> |
---|
| 2 | <HEAD> |
---|
| 3 | <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1"> |
---|
| 4 | <TITLE>Links and flowing text</TITLE> |
---|
| 5 | <LINK TYPE="text/css" REL="stylesheet" HREF="../fpdf.css"> |
---|
| 6 | </HEAD> |
---|
| 7 | <BODY> |
---|
| 8 | <H2>Links and flowing text</H2> |
---|
| 9 | This tutorial explains how to insert links (internal and external) and shows a new text writing |
---|
| 10 | mode. It also contains a rudimentary HTML parser. |
---|
| 11 | <BR> |
---|
| 12 | <BR> |
---|
| 13 | <TABLE WIDTH="100%" STYLE="color:#4040C0; border-style:ridge" BORDERCOLORLIGHT="#B0B0E0" BORDERCOLORDARK="#000000" BORDER="2" CELLPADDING=6 CELLSPACING=0 BGCOLOR="#F0F5FF"><TR><TD style="border-width:0px"> |
---|
| 14 | <NOBR><code><font color="#000000"> |
---|
| 15 | <?php<br>define<font class="kw">(</font><font class="str">'FPDF_FONTPATH'</font><font class="kw">,</font><font class="str">'font/'</font><font class="kw">);<br>require(</font><font class="str">'fpdf.php'</font><font class="kw">);<br><br>class </font>PDF <font class="kw">extends </font>FPDF<br><font class="kw">{<br>var </font>$B<font class="kw">;<br>var </font>$I<font class="kw">;<br>var </font>$U<font class="kw">;<br>var </font>$HREF<font class="kw">;<br><br>function </font>PDF<font class="kw">(</font>$orientation<font class="kw">=</font><font class="str">'P'</font><font class="kw">,</font>$unit<font class="kw">=</font><font class="str">'mm'</font><font class="kw">,</font>$format<font class="kw">=</font><font class="str">'A4'</font><font class="kw">)<br>{<br> </font><font class="cmt">//Call parent constructor<br> </font>$<font class="kw">this-></font>FPDF<font class="kw">(</font>$orientation<font class="kw">,</font>$unit<font class="kw">,</font>$format<font class="kw">);<br> </font><font class="cmt">//Initialization<br> </font>$<font class="kw">this-></font>B<font class="kw">=</font>0<font class="kw">;<br> </font>$<font class="kw">this-></font>I<font class="kw">=</font>0<font class="kw">;<br> </font>$<font class="kw">this-></font>U<font class="kw">=</font>0<font class="kw">;<br> </font>$<font class="kw">this-></font>HREF<font class="kw">=</font><font class="str">''</font><font class="kw">;<br>}<br><br>function </font>WriteHTML<font class="kw">(</font>$html<font class="kw">)<br>{<br> </font><font class="cmt">//HTML parser<br> </font>$html<font class="kw">=</font>str_replace<font class="kw">(</font><font class="str">"\n"</font><font class="kw">,</font><font class="str">' '</font><font class="kw">,</font>$html<font class="kw">);<br> </font>$a<font class="kw">=</font>preg_split<font class="kw">(</font><font class="str">'/<(.*)>/U'</font><font class="kw">,</font>$html<font class="kw">,-</font>1<font class="kw">,</font>PREG_SPLIT_DELIM_CAPTURE<font class="kw">);<br> foreach(</font>$a <font class="kw">as </font>$i<font class="kw">=></font>$e<font class="kw">)<br> {<br> if(</font>$i<font class="kw">%</font>2<font class="kw">==</font>0<font class="kw">)<br> {<br> </font><font class="cmt">//Text<br> </font><font class="kw">if(</font>$<font class="kw">this-></font>HREF<font class="kw">)<br> </font>$<font class="kw">this-></font>PutLink<font class="kw">(</font>$<font class="kw">this-></font>HREF<font class="kw">,</font>$e<font class="kw">);<br> else<br> </font>$<font class="kw">this-></font>Write<font class="kw">(</font>5<font class="kw">,</font>$e<font class="kw">);<br> }<br> else<br> {<br> </font><font class="cmt">//Tag<br> </font><font class="kw">if(</font>$e<font class="kw">{</font>0<font class="kw">}==</font><font class="str">'/'</font><font class="kw">)<br> </font>$<font class="kw">this-></font>CloseTag<font class="kw">(</font>strtoupper<font class="kw">(</font>substr<font class="kw">(</font>$e<font class="kw">,</font>1<font class="kw">)));<br> else<br> {<br> </font><font class="cmt">//Extract attributes<br> </font>$a2<font class="kw">=</font>explode<font class="kw">(</font><font class="str">' '</font><font class="kw">,</font>$e<font class="kw">);<br> </font>$tag<font class="kw">=</font>strtoupper<font class="kw">(</font>array_shift<font class="kw">(</font>$a2<font class="kw">));<br> </font>$attr<font class="kw">=array();<br> foreach(</font>$a2 <font class="kw">as </font>$v<font class="kw">)<br> if(</font>ereg<font class="kw">(</font><font class="str">'^([^=]*)=["\']?([^"\']*)["\']?$'</font><font class="kw">,</font>$v<font class="kw">,</font>$a3<font class="kw">))<br> </font>$attr<font class="kw">[</font>strtoupper<font class="kw">(</font>$a3<font class="kw">[</font>1<font class="kw">])]=</font>$a3<font class="kw">[</font>2<font class="kw">];<br> </font>$<font class="kw">this-></font>OpenTag<font class="kw">(</font>$tag<font class="kw">,</font>$attr<font class="kw">);<br> }<br> }<br> }<br>}<br><br>function </font>OpenTag<font class="kw">(</font>$tag<font class="kw">,</font>$attr<font class="kw">)<br>{<br> </font><font class="cmt">//Opening tag<br> </font><font class="kw">if(</font>$tag<font class="kw">==</font><font class="str">'B' </font><font class="kw">or </font>$tag<font class="kw">==</font><font class="str">'I' </font><font class="kw">or </font>$tag<font class="kw">==</font><font class="str">'U'</font><font class="kw">)<br> </font>$<font class="kw">this-></font>SetStyle<font class="kw">(</font>$tag<font class="kw">,</font>true<font class="kw">);<br> if(</font>$tag<font class="kw">==</font><font class="str">'A'</font><font class="kw">)<br> </font>$<font class="kw">this-></font>HREF<font class="kw">=</font>$attr<font class="kw">[</font><font class="str">'HREF'</font><font class="kw">];<br> if(</font>$tag<font class="kw">==</font><font class="str">'BR'</font><font class="kw">)<br> </font>$<font class="kw">this-></font>Ln<font class="kw">(</font>5<font class="kw">);<br>}<br><br>function </font>CloseTag<font class="kw">(</font>$tag<font class="kw">)<br>{<br> </font><font class="cmt">//Closing tag<br> </font><font class="kw">if(</font>$tag<font class="kw">==</font><font class="str">'B' </font><font class="kw">or </font>$tag<font class="kw">==</font><font class="str">'I' </font><font class="kw">or </font>$tag<font class="kw">==</font><font class="str">'U'</font><font class="kw">)<br> </font>$<font class="kw">this-></font>SetStyle<font class="kw">(</font>$tag<font class="kw">,</font>false<font class="kw">);<br> if(</font>$tag<font class="kw">==</font><font class="str">'A'</font><font class="kw">)<br> </font>$<font class="kw">this-></font>HREF<font class="kw">=</font><font class="str">''</font><font class="kw">;<br>}<br><br>function </font>SetStyle<font class="kw">(</font>$tag<font class="kw">,</font>$enable<font class="kw">)<br>{<br> </font><font class="cmt">//Modify style and select corresponding font<br> </font>$<font class="kw">this-></font>$tag<font class="kw">+=(</font>$enable <font class="kw">? </font>1 <font class="kw">: -</font>1<font class="kw">);<br> </font>$style<font class="kw">=</font><font class="str">''</font><font class="kw">;<br> foreach(array(</font><font class="str">'B'</font><font class="kw">,</font><font class="str">'I'</font><font class="kw">,</font><font class="str">'U'</font><font class="kw">) as </font>$s<font class="kw">)<br> if(</font>$<font class="kw">this-></font>$s<font class="kw">></font>0<font class="kw">)<br> </font>$style<font class="kw">.=</font>$s<font class="kw">;<br> </font>$<font class="kw">this-></font>SetFont<font class="kw">(</font><font class="str">''</font><font class="kw">,</font>$style<font class="kw">);<br>}<br><br>function </font>PutLink<font class="kw">(</font>$URL<font class="kw">,</font>$txt<font class="kw">)<br>{<br> </font><font class="cmt">//Put a hyperlink<br> </font>$<font class="kw">this-></font>SetTextColor<font class="kw">(</font>0<font class="kw">,</font>0<font class="kw">,</font>255<font class="kw">);<br> </font>$<font class="kw">this-></font>SetStyle<font class="kw">(</font><font class="str">'U'</font><font class="kw">,</font>true<font class="kw">);<br> </font>$<font class="kw">this-></font>Write<font class="kw">(</font>5<font class="kw">,</font>$txt<font class="kw">,</font>$URL<font class="kw">);<br> </font>$<font class="kw">this-></font>SetStyle<font class="kw">(</font><font class="str">'U'</font><font class="kw">,</font>false<font class="kw">);<br> </font>$<font class="kw">this-></font>SetTextColor<font class="kw">(</font>0<font class="kw">);<br>}<br>}<br><br></font>$html<font class="kw">=</font><font class="str">'You can now easily print text mixing different<br>styles : <B>bold</B>, <I>italic</I>, <U>underlined</U>, or<br><B><I><U>all at once</U></I></B>!<BR>You can also insert links<br>on text, such as <A HREF="http://www.fpdf.org">www.fpdf.org</A>,<br>or on an image: click on the logo.'</font><font class="kw">;<br><br></font>$pdf<font class="kw">=new </font>PDF<font class="kw">();<br></font><font class="cmt">//First page<br></font>$pdf<font class="kw">-></font>AddPage<font class="kw">();<br></font>$pdf<font class="kw">-></font>SetFont<font class="kw">(</font><font class="str">'Arial'</font><font class="kw">,</font><font class="str">''</font><font class="kw">,</font>20<font class="kw">);<br></font>$pdf<font class="kw">-></font>Write<font class="kw">(</font>5<font class="kw">,</font><font class="str">'To find out what\'s new in this tutorial, click '</font><font class="kw">);<br></font>$pdf<font class="kw">-></font>SetFont<font class="kw">(</font><font class="str">''</font><font class="kw">,</font><font class="str">'U'</font><font class="kw">);<br></font>$link<font class="kw">=</font>$pdf<font class="kw">-></font>AddLink<font class="kw">();<br></font>$pdf<font class="kw">-></font>Write<font class="kw">(</font>5<font class="kw">,</font><font class="str">'here'</font><font class="kw">,</font>$link<font class="kw">);<br></font>$pdf<font class="kw">-></font>SetFont<font class="kw">(</font><font class="str">''</font><font class="kw">);<br></font><font class="cmt">//Second page<br></font>$pdf<font class="kw">-></font>AddPage<font class="kw">();<br></font>$pdf<font class="kw">-></font>SetLink<font class="kw">(</font>$link<font class="kw">);<br></font>$pdf<font class="kw">-></font>Image<font class="kw">(</font><font class="str">'logo.png'</font><font class="kw">,</font>10<font class="kw">,</font>10<font class="kw">,</font>30<font class="kw">,</font>0<font class="kw">,</font><font class="str">''</font><font class="kw">,</font><font class="str">'http://www.fpdf.org'</font><font class="kw">);<br></font>$pdf<font class="kw">-></font>SetLeftMargin<font class="kw">(</font>45<font class="kw">);<br></font>$pdf<font class="kw">-></font>SetFontSize<font class="kw">(</font>14<font class="kw">);<br></font>$pdf<font class="kw">-></font>WriteHTML<font class="kw">(</font>$html<font class="kw">);<br></font>$pdf<font class="kw">-></font>Output<font class="kw">();<br></font>?> |
---|
| 16 | </font> |
---|
| 17 | </code></NOBR></TD></TR></TABLE><P></P> |
---|
| 18 | <SCRIPT> |
---|
| 19 | <!-- |
---|
| 20 | if(document.location.href.indexOf('http:')==0) |
---|
| 21 | { |
---|
| 22 | document.write("<P CLASS='demo'><A HREF='tuto6.php' TARGET='_blank' CLASS='demo'>[Demo]</A></P>"); |
---|
| 23 | } |
---|
| 24 | //--> |
---|
| 25 | </SCRIPT> |
---|
| 26 | The new method to print text is <A HREF='../doc/write.htm'>Write()</A>. It is very close to <A HREF='../doc/multicell.htm'>MultiCell()</A>; the differences |
---|
| 27 | are: |
---|
| 28 | <UL> |
---|
| 29 | <LI>The end of line is at the right margin and the next line begins at the left one |
---|
| 30 | <LI>The current position moves at the end of the text |
---|
| 31 | </UL> |
---|
| 32 | So it allows to write a chunk of text, alter the font style, then continue from the exact |
---|
| 33 | place we left it. On the other hand, you cannot full justify it. |
---|
| 34 | <BR> |
---|
| 35 | <BR> |
---|
| 36 | The method is used on the first page to put a link pointing to the second one. The beginning of |
---|
| 37 | the sentence is written in regular style, then we switch to underline and finish it. The link |
---|
| 38 | is created with <A HREF='../doc/addlink.htm'>AddLink()</A>, which returns a link identifier. The identifier is |
---|
| 39 | passed as third parameter of Write(). Once the second page is created, we use <A HREF='../doc/setlink.htm'>SetLink()</A> to |
---|
| 40 | make the link point to the beginning of the current page. |
---|
| 41 | <BR> |
---|
| 42 | <BR> |
---|
| 43 | Then we put an image with a link on it. An external link points to an URL (HTTP, mailto...). |
---|
| 44 | The URL is simply passed as last parameter of <A HREF='../doc/image.htm'>Image()</A>. |
---|
| 45 | Note that external links do not work when the PDF is displayed inside Netscape's plug-in. |
---|
| 46 | <BR> |
---|
| 47 | <BR> |
---|
| 48 | Finally, the left margin is moved after the image with <A HREF='../doc/setleftmargin.htm'>SetLeftMargin()</A> and some text in |
---|
| 49 | HTML format is output. An HTML parser is used for this, based on the regular expression splitting |
---|
| 50 | function preg_split() and the option PREG_SPLIT_DELIM_CAPTURE (introduced in PHP 4.0.5) which |
---|
| 51 | allows to fetch the separators as well (in this case the tags). If you use an older version of |
---|
| 52 | PHP, replace the line with this one: |
---|
| 53 | <BR> |
---|
| 54 | <BR> |
---|
| 55 | <TABLE WIDTH="100%" STYLE="color:#4040C0; border-style:ridge" BORDERCOLORLIGHT="#B0B0E0" BORDERCOLORDARK="#000000" BORDER="2" CELLPADDING=6 CELLSPACING=0 BGCOLOR="#F0F5FF"><TR><TD style="border-width:0px"> |
---|
| 56 | <NOBR><code><font color="#000000"> |
---|
| 57 | $a<font class="kw">=</font>preg_split<font class="kw">(</font><font class="str">'/[<>]/'</font><font class="kw">,</font>$html<font class="kw">);</font><br> |
---|
| 58 | </font> |
---|
| 59 | </code></NOBR></TD></TR></TABLE><P></P> |
---|
| 60 | which is less strict but gives the same results with valid HTML. |
---|
| 61 | <BR> |
---|
| 62 | Recognized tags are <B>, <I>, <U>, <A> and <BR>; the others are |
---|
| 63 | ignored. The parser also makes use of the Write() method. An external link is put the same way as |
---|
| 64 | an internal one (third parameter of Write()). |
---|
| 65 | <BR> |
---|
| 66 | Note that <A HREF='../doc/cell.htm'>Cell()</A> also allows to put links. |
---|
| 67 | </BODY> |
---|
| 68 | </HTML> |
---|