Web-разработка

FPDF — Урок 6: Ссылки и вывод HTML

, , , ,
24 января 2010, 19:45

Итак сегодня я продолжаю цикл вольных переводов уроков с официального сайта библиотеки FPDF.
Предыдущие уроки:

На протяжении прошлых уроков, мы с Вами вместе узнали достаточно много про то насколько функциональной является библиотека fpdf.

Этот урок расскажет Вам о том, как вставлять ссылки (внутренние или внешние) и том как выводить HTML.

require('Fpdf\fpdf.php');
 
class PDF extends FPDF
{
var $B;
var $I;
var $U;
var $HREF;
 
function PDF($orientation='P',$unit='mm',$format='A4')
{
    //Вызов родительского конструктора (конструктора библиотеки FPDF)
    $this->FPDF($orientation,$unit,$format);
    //Инициализация
    $this->B=0;
    $this->I=0;
    $this->U=0;
    $this->HREF='';
}
 
function WriteHTML($html)
{
    //Парсер HTML
    $html=str_replace("\n",' ',$html);
    $a=preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE);
    foreach($a as $i=>$e)
    {
        if($i%2==0)
        {
            //Текст
            if($this->HREF)
                $this->PutLink($this->HREF,$e);
            else
                $this->Write(5,$e);
        }
        else
        {
            //Тег
            if($e[0]=='/')
                $this->CloseTag(strtoupper(substr($e,1)));
            else
            {
                //Извлекаем атрибуты
                $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)
{
    //Открывающий тег
    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)
{
    //Закрывающий тег
    if($tag=='B' || $tag=='I' || $tag=='U')
        $this->SetStyle($tag,false);
    if($tag=='A')
        $this->HREF='';
}
 
function SetStyle($tag,$enable)
{
    //Изменение стиля и выбор соответствующего шрифта
    $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)
{
    //Ставим ссылку
    $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();
//Первая страница
$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('');
//Вторая страница
$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();

Здесь мы использовали новый метод Write (), который по сути очень схож с Multicell (). Но в отличии от Multicell (), Write () выводит текст от текущей позиции. Когда достигается правая граница страницы или встречается символ \n, строка обрывается и текст продолжает выводиться с левого края (с новой строки). После выполнения метода, текущая позиция находится в конце текста.

Метод Write () может принимать следующие параметры: h — высота строки, txt — сам текст для вывода, link — URL или идентификатор, возвращаемый методом AddLink().

Метод Write () используется на первой странице документа и при этом в тексте стоит ссылка на вторую страницу.

С помощью метода AddLink() можно создать новую внутреннюю ссылку и вернуть ее идентификатор. (при нажатии на внутреннюю ссылку вы перейдете в другую область документа). Идентификатор может указывать на такие методы как Cell(), Write(), Image() или Link(). Место перехода задается с помощью метода SetLink(), который мы также используем.

Метод SetLink() задает страницу и место в документе, куда указывает ссылка. У данного метода существуют следующие параметры: link — идентификатор ссылки, полученный с помощью AddLink(), y — ордината цели ссылки; -1 обозначает текущую позицию. По умолчанию 0 (верх страницы), page — номер страницы, на которую делается ссылка; -1 обозначает текущую позицию. Это значение по умолчанию.

В нашем же примере мы создаем ссылку методом AddLink(), и идентификатор передаем в качестве третьего параметра в метод Write (). После создания второй страницы мы воспользовались ранее описанным методом SetLink (), чтобы сделать ссылку указывающую на начало текущей страницы.

На второй странице мы разместили изображение со ссылкой, и ссылка уже не в документе а внешняя, и предается с помощью последнего параметра метода Image ().

После всех этих преобразования мы с помощью метода SetLeftMargin () задаем отступ от левой границы страницы (в качестве параметра передается только одно значение — сам отступ).

И теперь осталась лишь одна проблема — вывод HTML текста. В данном Уроке использует простой парсер HTML, работающий на основе регулярных выражений. Парсер понимает такие теги как:

<b></b>
<i></i>
<u></u>
<a></a>
<br>

При большом желании можно добавить свои теги. При добавлении внешней ссылки также используется метод Write ().

Кстати метод Cell () также позволяет ставить ссылки, используется при этом последний параметр метода.

Результат Урока 6: Ссылки и вывод HTML :

FPDF - Урок 6: Ссылки и вывод HTML

Из следующего урока можно узнать о том как добавить новые шрифты и о том с какими кодировками работает библиотека — FPDF – Урок 7: Добавление новых шрифтов и поддержка разных кодировок.

Ссылки:

Удачных Вам экспериментов с библиотекой FPDF.