Link e testo scorrevole

Questo tutorial spiega come inserire link (interni ed esterni) e mostrare una nuova modalità di scrittura. Contiene anche un parser HTML minimale.
<?php
require('fpdf.php');

class PDF extends FPDF
{
protected $B = 0;
protected $I = 0;
protected $U = 0;
protected $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(preg_match('/([^=]*)=["\']?([^"\']*)/',$v,$a3))
                        $attr[strtoupper($a3[1])] = $a3[2];
                }
                $this->OpenTag($tag,$attr);
            }
        }
    }
}

function OpenTag($tag, $attr)
{
    // Opening tag
    if($tag=='B' || $tag=='I' || $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' || $tag=='I' || $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><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,12,30,0,'','http://www.fpdf.org');
$pdf->SetLeftMargin(45);
$pdf->SetFontSize(14);
$pdf->WriteHTML($html);
$pdf->Output();
?>

[Demo]

Il nuovo metodo per mostrare il testo è Write(). È molto simile a MultiCell(); le differenze sono: Quindi per permettere di scrivere del testo, alterare lo stile del carattere, quindi continuare dal punto esatto dove eravamo rimasti. Purtroppo però non si può giustificare il testo.

Il metodo è utilizzato sulla prima pagina per inserire un link che punti alla seconda pagina. L'inizio della frase è scritto in testo normale, quindi si cambia in sottolineato e si conclude. Il link è creato con AddLink(), che ritorna un identificatore per il link. L'identificatore è passato come terzo parametro di Write(). Una volta che la seconda pagina è creata, usiamo SetLink() per creare un link che punti all'inizio della pagina corrente.

Quindi inseriamo un'immagine con un link esterno su di essa. Un link esterno è semplicemente un URL. È passato come ultimo parametro di Image().

Concludendo, il margine sinistro si sposta dopo l'immagine con SetLeftMargin() e del testo è mostrato in formato HTML. È utilizzato un parser HTML molto semplice per questo scopo, basato su espressioni regolari. I tag riconosciuti sono <b>, <i>, <u>, <a> e <br>; gli altri sono ignorati. Il parser fa anche uso del metodo Write(). Un link esterno è inserito allo stesso modo di uno interno (terzo parametro di Write()). Notare che anche Cell() permette di inserire link.