Tutorial 6 - Links und Fließtext

Arbeiten mit Links und Fließtexten

Diese Anleitung erläutert, wie interne Dokumentverweise und externe Links eingefügt werden, sowie einen neuen Weg Text zu erzeugen. Des Weiteren ist ein einfacher HTML Parser enthalten.

<?php

define('FPDF_FONTPATH','font/');
require('fpdf.php');

class PDF extends FPDF
{
  var $B;
  var $I;
  var $U;
  var $HREF;

  function PDF($orientation='P',$unit='mm',$format='A4')
  {
    //Call parent constructor
    $this->FPDF($orientation,$unit,$format);
    //Initialization
    $this->B=0;
    $this->I=0;
    $this->U=0;
    $this->HREF='';
  }

  function WriteHTML($html)
  {
    //HTML parser
    $html=str_replace("\n",' ',$html);
    $a=preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE);
    foreach($a as $i=>$e)
    {
      if($i%2==0)
      {
        //Text
        if($this->HREF)
          $this->PutLink($this->HREF,$e);
        else
          $this->Write(5,$e);
      }
      else
      {
        //Tag
        if($e{0}=='/')
          $this->CloseTag(strtoupper(substr($e,1)));
        else
        {
          //Extract attributes
          $a2=explode(' ',$e);
          $tag=strtoupper(array_shift($a2));
          $attr=array();
          foreach($a2 as $v)
            if(ereg('^([^=]*)=["\']?([^"\']*)["\']?$',$v,$a3))
          $attr[strtoupper($a3[1])]=$a3[2];
          $this->OpenTag($tag,$attr);
        }
     }
    }
  }

  function OpenTag($tag,$attr)
  {
    //Opening tag
    if($tag=='B' or $tag=='I' or $tag=='U')
     $this->SetStyle($tag,true);
    if($tag=='A')
     $this->HREF=$attr['HREF'];
    if($tag=='BR')
     $this->Ln(5);
  }

  function CloseTag($tag)
  {
    //Closing tag
    if($tag=='B' or $tag=='I' or $tag=='U')
     $this->SetStyle($tag,false);
    if($tag=='A')
     $this->HREF='';
  }

  function SetStyle($tag,$enable)
  {
    //Modify style and select corresponding font
    $this->$tag+=($enable ? 1 : -1);
    $style='';
    foreach(array('B','I','U') as $s)
     if($this->$s>0)
     $style.=$s;
    $this->SetFont('',$style);
  }

  function PutLink($URL,$txt)
  {
    //Put a hyperlink
    $this->SetTextColor(0,0,255);
    $this->SetStyle('U',true);
    $this->Write(5,$txt,$URL);
    $this->SetStyle('U',false);
    $this->SetTextColor(0);
  }
}

$html='You can now easily print text mixing different
styles : <B>bold</B>, <I>italic</I>, <U>underlined</U>, or
<B><I><U>all at once</U></I></B>!<BR>You can also insert links
on text, such as <A HREF="http://www.fpdf.org">www.fpdf.org</A>,
or on an image: click on the logo.';

$pdf=new PDF();
//First page
$pdf->AddPage();
$pdf->SetFont('Arial','',20);
$pdf->Write(5,'To find out what\'s new in this tutorial, click ');
$pdf->SetFont('','U');
$link=$pdf->AddLink();
$pdf->Write(5,'here',$link);
$pdf->SetFont('');
//Second page
$pdf->AddPage();
$pdf->SetLink($link);
$pdf->Image('logo.png',10,10,30,0,'','http://www.fpdf.org');
$pdf->SetLeftMargin(45);
$pdf->SetFontSize(14);
$pdf->WriteHTML($html);
$pdf->Output();

?>

Die neue Methode Text einzufügen ist Write(). Die sehr an MultiCell() angelehnte Methode zeichnte sich durch folgende Unterschiede aus:

    Das Ende einer Zeile ist am rechten Seitenrand und die nächste Zeile beginnt am linken Seitenrand.
    Die aktuelle Position ist im Anschluss am Ende des Textes. 

Somit erlaubt sie beliebigen Text zu einzufügen, die Schriftart anzupassen und fortzufahren, wo der letzte Text zuvor eingefügt wurde. Der Nachteil bei dieser Methode ist, dass durch die Verwendung von Fließtext keine vollständige Ausrichtung erzielt werden kann.

In diesem Beispiel wird Write() auf der ersten Seite angewendet um einen Link auf die zweite Seite zu erzeugen. Der Anfang des Satzes wird normal, der Rest unterstrichen eingefügt. Die Verknüpfung wird mit AddLink() erzeugt und ein Bezeichner für die Verknüpfung zurückgegeben. Der Bezeichner der Verknüpfung wird der Methode Write() als dritter Parameter übergeben. Wenn die zweite Seite erzeugt wurde, wird SetLink() verwendet um die zuvor erzeugte Verknüpfung auf das Anfang der aktuellen Seite zeigen zu lassen.

Im Anschluss fügen wir ein Bild ein und versehen es mit einer Verknüpfung. Die Verknüpfung ist ein externer Link zu einem URL (HTTP, mailto...). Der URL wird einfach per Parameter beim Aufruf von Image() übergeben.

Zuletzt wird der Seitenabstand nach dem Bild mit SetLeftMargin() angepasst und Text in HTML Format eingefügt. Ein HTML Parser, basierend auf einer Trennung mit Hilfe der Funktion preg_split() und der Option PREG_SPLIT_DELIM_CAPTURE (eingeführt in PHP 4.0.5) die erlaubt die Trennzeichen ebenfalls zu extrahierenm wird hierfür verwendet. Wenn eine ältere Version von PHP verwendet wird, kann die entsprechende Zeile durch folgenden Code ersetzt werden:

<?php

$a=preg_split('/[<>]/',$html);

?>

Diese Code ist weniger strikt, liefert aber bei validem HTML Code das gleiche Ergebnis.
Unterstützte Tags für die Formatierung sind <B>, <I>, <U>, <A> and <BR>; alle anderen werden ignoriert. Der HTML Parser verwendet ebenfalls Write() um den Text einzufügen. Interne und externe Verweise werden auf gleiche Weise, über den dritten Parameter von Write() gesetzt.


Hinweis: Die Methode Cell() kann ebenfalls dazu genutzt werden Verweise einzufügen.