developer blog

451 degrees Fahrenheit

Рисуем свой pdf файл на php, часть 2

October 28th, 2007 by pilot |

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

Итак бибилиотеке fpdf 1.5.3 , скачиваем, распаковываем к себе на сервер в любую папку, к примеру pdf, после распаковки получаем следующую структуру папок:

У себя я использую пакет denver от dklab.ru, либо XAMPP http://www.apachefriends.org/en/xampp.html, который включает полный пакет программ необходимых веб разработчику. К тому же XAMPP подойдет как тем кто любит Linux, так и Windwos разработчикам.

pdf/
-doc/
-font/
-tutorial/
-FAQ.htm
-fpdf.css
-fpdf.php
-histo.htm
-install.txt

Оставляем только необходимое папку font/ и fpdf.php. Конечно, у кого есть немного времени чтоб ознакомиться с примерами из папки tutorial/, вы не пожалеете, примеры показывают практически исчерпывающую информацию по работе с fpdf.

Для начала создамим первый простой pdf файл, создайте pdf/test.php, с кодом:

[cc lang="php"]
require(’fpdf.php’);

$pdf = new FPDF();
$pdf->AddPage();
$pdf->SetFont(’Arial’,'B’,16);
$pdf->Cell(40,10,’Hello World!’);
$pdf->Output();
[/cc]

Первой строчкой мы подключаем библиотеку, далее:

[cc lang="php"]$pdf = new FPDF(); // Создаем новый объект[/cc]

Изначально наш pdf файл пуст, по-этому добавляем в наш pdf, новый лист:

[cc lang="php"]$pdf->AddPage(); // по умолчанию создется лист формата А4[/cc]

Перед выводом любого текста, предварительно нужно задать шрифт, в противном случае при создание будет сообщено об ошибке:
[cc lang="php"]$pdf->SetFont(’Arial’,'B’,16);[/cc]

И вот теперь мы может напечатать свой первый текст в первом pdf файле, с помощью функции Сell(), эта функция нарисует прямоугольную область с надписью внутри. Фактически будет выведена ячейка таблицы с текстом внутри.

[cc lang="php"]Cell(40,10,’Hello World!’);[/cc]

Для вывода просто текста используюется функция Write(), а для перевода на новую строку отдельная функция Ln():

[cc lang="php"]
$pdf->Ln(); // перевод картеки на новую строку
$pdf->Write(4, “текс для вывода”); // значение 4 означение высоту строки
[/cc]

Выводим сам pdf, с помощью функции Output(), которая может принимать несколько значний, Output(”пусть/имя.pdf”, dest) имя выводимого файла, и второй необязательный параметр как будет выводиться файл, сразу в броузер либо сохранен на диск:

[cc lang="php"]$pdf->Output();[/cc]

Вот и создан первый pdf файл, на практиче простые текстовые файлы создаются довольно просто и библиотека работает безупречно.

И так вывод тикетов в pdf файл, ниже я буду давать php код с минимумом текстовых коментариев, так как основные принципы создания pdf файла я описал выше…

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

[cc lang="php"]
// Входящий массив - список идентификаторов отелей
$idhostel(’12′,’14′,’43′,’45′,’54′,’67′);

$pdf = new PDF(); // Создаем новый объект

$pages = ceil(count($idhostel)/27); // 27 тикетов на стрнице, считаем количество страниц

for ($p = 1; $p < ($pages+1); $p++){
if (count($idhostel) > 27) $to = 27; else $to = count($idhostel);
for ($i = 0; $i < $to; $i++){

// array_shift() - удаляем из массива $idhostel обработанный id
$sql = "SELECT name, street, zip, city, country FROM fe_hostels WHERE idhostel='".array_shift($idhostel)."'";
$result = DB::getRow($sql); // getRow() из класса работы с базой, у каждого свой.
$hostel[] = $result;
}

// Информация для отладки, попробуйте с ней.
//echo "page: ".$p.""; // Текущая страница
//print_r($hostel); // Массив данных для вывода на тикеты
//echo "
“;

// Добавляем новую странцу
$pdf->AddPage();
// Рисуем прямоугольники - моя функция описание ниже
//$pdf->pageRect();
// Пишем текст на тикетах - моя функция описание ниже
$pdf->printText($hostel);
// После вывода очищаем массив с данными предыдущей страницы
unset($hostel);
}

// Рисуем pdf, параметр D - отправить в бороузер и предложить скачать.
$pdf->Output(”", “D”);
[/cc]

Выше показан основной код, который создает новый объект класса PDF(), который в свою очередь является расширением (extends) класса FPDF нашей библиотеки, ниже приведен код моему класса, который непосредственно рисует закрашенный прямоугольники, выводит текст с переносом на следующую строки и перестройкой каждой последующей строки.

Замечу, что при выводе текста с помощью функции Write() возникает проблема переноса текста на следующую строку. Перед тем как начать вывод нужно задать координаты вывода функцией SetXY(), а следовательно и контролировать эти координа при переносах строк.

Показанный ниже код нужно вставить перед

[cc lang="php"]$pdf = new PDF();[/cc]

В коде я обрезал вывод метов класса PDF(), полный вывод каждого метода вы можете скачать одним файлом, в конце статьи.

[cc lang="php"]
include(”fpdf.php”);
class PDF extends FPDF {

// Рисуем зарашенные прямоугольники
function pageRect(){
$this->SetFillColor(153,204,255); // Задаем цвет фона
// Рисем прямоугольники 3 колонки по 27 штук
$k = 16;
for ($i = 1; $i < 10; $i++){
$this->Rect(8,$k,63,29.4,’FD’);
$this->Rect(73.5,$k,63,29.4,’FD’);
$this->Rect(139,$k,63,29.4,’FD’);
$k = $k + 29.4;
}
}
// Разбиваем длиные имена отелей
function splitName($longname, $col_st, $b){
………………………… // полную версию вы можете скачать ниже
return $st;
}

// Декодируем html мнемоники
function decoder($text){
$text = utf8_decode(html_entity_decode($text, ENT_QUOTES));
return $text;
}

// Печатаем текст на тикетах
function printText ($hostel){
$a = 18; // Задаем координаты смещения для каждой строки
$b = 22;
$c = 26;
$d = 31;
$e = 36;

for ($i = 0; $i < count($hostel); $i += 3){
// Печатаем текст
$this->SetXY(10,$a);
$this->SetFont(’Arial’,'U’,6);
$this->Write(4,$this->decoder(’451f.com.ua - записи разработчика’));

……………………………. // полную версию вы можете скачать ниже

$a = $a + 29.4; // Задаем приращение, высота прямоуголька 29.4 мм
$b = $b + 29.4;
$c = $c + 29.4;
$d = $d + 29.4;
$e = $e + 29.4;
}

}
}

[/cc]

Оставляйте ваши коментарии, и не забудьте подписать на RSS и e-mail рассылку.

Скачать полную версию ticket.php

top of hotblogs.org.ua

Раздел php

4 Responses

  1. Nikolya Says:

    interesting information :) thanks a lot…

  2. Андрей Says:

    Это конечно все хорошо и работает неплохо…
    Только вот подскажите как его заставить русские буквы выводить?

  3. Андрей Says:

    отвечу на свой же вопрос http://phpclub.ru/detail/article/fpdf

  4. pilot Says:

    Спасибо за полезную ссылку. Когда работал с fpdf, русская кодировка не нужна была.
    Для тех кто читает эту статью впервые, вот отрывок из ссылки выше:
    require(’font/makefont/makefont.php’);
    MakeFont(’times.ttf’,times.afm’,'cp1251);

    т.е. для работы с кирилистическими шрифтами. нужно предварительно создать этот шрифт.

    Полее подробнее по ссылке выше.

Leave a Comment

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.