Top > FPDF > tuto6

Links and flowing text

このチュートリアルはリンク (内部リンクと外部リンク) を挿入し,新しいテキストを書き込む方法を示します。基本的な HTML パーサも含みます。

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

テキストをプリントする新しいメソッドは Write() です。そのメソッドは MultiCell() によく似ています。違いは次のものです。

  • 行の終わりは右マージンで次の左端から次の行が始まります。
  • 現在の位置がテキストの最後に移動します。

そのように,テキストの塊を書けるようにし,フォントサイズを変え,そして,すぎたと思う位置から続けます。言い換えると,丁度に合わせることができません。

最初のページに二番目のページを示すリンクをおくためにメソッドを使用します。文の始めは標準のスタイルで書かれます。そして,下線を使用し,その使用を止めます。リンクは AddLink() で作成します。リンクの識別名を返します。識別名は Write() の三番目の引数に渡されます。二番めのページが作成されたとき SetLink() を現在のページの最初にリンクポイントを作成するために使用します。

次にリンクを伴ったイメージを取り付けます。URL (HTTP, mailto ...) への外部リンクポイントです。 URL は Image() の最後の引数に簡単に渡します。外部リンクは PDF が Netscape のプラグインに表示されているときは動作しないことに注意してください。

最後に, SetLeftMargin() でイメージの後,左余白を移動します。そして, HTML フォーマットのテキストを出力します。 HTML パーサはこれに使用します。正規表現の分割関数 preg_split() と適切なセパレータ (この場合タグ) を取り出すことができるようにする PREG_SPLIT_DELIM_CAPTURE オプション (PHP 4.0.5 で導入された) にもとづきます。 PHP の古いバージョンを使用しているなら次のものに置き換えます。

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

これは厳格さに欠けますが,妥当な HTML で同じ結果を与えます。
識別されるタグは <B>, <I>, <U>, <A>, <BR> です。他のものは無視されます。パーサは Write() メソッドも使用します。外部リンクは内部リンクと同様におかれます (Write() の三番目の引数で)。
Cell() もリンクをおくことができることに注意してください。


Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes