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();

?>

[Eseguire]

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.