# 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:

- La fine della linea è al margine destro ed il testo inizia al margine a sinistra
- The current position moves at the end of the text

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.