FPDF – библиотека для создания PDF-файлов на PHP

С каждым днем количество форматов файлов становится все больше и больше. PDF-файлы набирают или можно даже сказать что набрали свою популярность, так как он является кроссплатформенным и существует большое количество бесплатных программ с помощью которых можно просмотреть документы. Кстати немного ранее я рассматривал бесплатную и достаточно быструю программу для просмотра файлов PDF. Привилегий у этого формата большое количество и сейчас речь пойдет не об этом. Об этом формате, и об его истории Вы сможете прочесть на ВИКИпедии.

FPDF - библиотека для создания PDF-файлов на PHP

Я вам расскажу как при помощи PHP и библиотеки FPDF, создавать файлы с расширением pdf. Это могут быть какие то отчеты, или допустим вы хотите чтобы ваши страницы сайта генерировались в большую и познавательную книгу. С помощью этой библиотеки можно делать любые манипуляции, будь то вывод из базы или вывод просто текста введенного пользователем.

Немного про тот формат с которым придется иметь дело.

PDF (аббр. от Portable Document Format,) – формат электронных документов, разработанный компанией Adobe Systems. Кроссплатформенность формата создает удобные условия для организации электронного документооборота. В первую очередь предназначен для представления в электронном виде полиграфической продукции, — значительное количество современного профессионального печатного оборудования может обрабатывать PDF непосредственно. Документ в формате pdf может содержать шрифты, графику, мультимедийные элементы, что гарантирует правильное отображение независимо от операционной системы, программного обеспечения и пользовательских настроек конкретного компьютера. Именно это свойство – сохранять исходный вид и делает его привлекательным.

Достаточно популярные библиотеки PDFLib и ClibPDF требуют дополнительной настройки PHP, а класс FPDF подключается к вашим скриптам командой include() и другими командами подобного рода, при этом ненужно настраивать дополнительно серверную часть, что дает классу FPDF большое преимущество над другими подобными библиотеками.

Класс FPDF является совершенно бесплатным, его можно использовать как в коммерческих целях так и в личных.

При работе с этим классом возникают сложности с кириллическими буквами, так как FPDF был разработан иностранными разработчиками, но я постараюсь в двух словах объяснить как избавиться от этих проблем. В частности могу сказать из собственного опыта что буквы начинают наезжать друг на друга или наоборот расходиться.

Избавляемся от проблем с кириллицей

В windows в качестве шрифтов используются файлы с расширением TTF. Для того чтобы скрипты работали правильно и нормально помимо вышесказанных шрифотв нужные файлы с расширением AFM. Существует большое количество утилит позволяющих создать фалы AFM из любого кириллического шрифта. Одной из таких утилит является ttf2pt1. Суть работы данной утилиты состоит в том чтобы преобразовать шрифты TrueType (большая часть шрифтов под Windows) в формат Type1. Другими словами можно взять любой шрифт из директории С:\Windows\fonts и получить для него метрику.

Скачать утилиту ttf2pt1 можно:

Итак я надеюсь вы уже скачали архив с утилитой. Я скачивал архив по второй ссылке. По второй ссылке Вы сможете скачать уже готовый к работе на Windows платформе файл с расширением .exe. И так по второй ссылке Вам будет предоставлен архив с exe-файлом, и файлом копирайтинга. Распакуйте архив в директорию любую, в которой Вам будет удобно использовать данную утилиту (например у меня место расположения утилиты выглядит так – D:\ttf2pt1\ttf2pt1.exe).

Итак теперь попробуем разобраться как же пользоваться данной утилитой. Скачайте какой нибудь шрифт из директории С:\Windows\fonts (например Arial).

При скачке данного шрифта получаем следующие файлы:

  • arial.ttf – Arial обычный
  • arialbd.ttf – Arial полужирный
  • arialbi.ttf – Arial полужирный курсив
  • ariali.ttf – Arial курсив

Вышеуказанные файлы шрифтов скопируйте в директорию с утилитой ttf2pt1. Теперь пришло время воспользоваться ранее скачанной утилитой ttf2pt1. Если Вы сделали как я говорил раньше(иначе говоря создали папку на диске D и поместили туда ttf2pt1.exe), то открываем командную строку Windows, для этого нужно зайти Пуск->Выполнить (как альтернативный вариант Кнопка Windows+R) и в появившемся окне написать команду cmd. Если Вы не знаете как работать с командной строкой то почитайте хелп набрав в командной строке help или воспользуйтесь файловым менеджером. В командной строке перейдите в директорию с файлом ttf2pt1.exe и наберите следующее(команды следует вводить по отдельности):
ttf2pt1 -A arial.ttf arial
ttf2pt1 -A arialbd.ttf arialbd
ttf2pt1 -A arialbi.ttf arialbi
ttf2pt1 -A ariali.ttf ariali

В этих командах:

  • “ttf2pt1” – вызов программы
  • “-A” – ключ, указывающий на необходимость сформировать файл AFM
  • “arial.ttf”,”arialbd.ttf”,”arialbi.ttf”,”ariali.ttf “- файл True Type шрифта
  • “arial”,”arialbd”,”arialbi”,”ariali” – имя будущего метрического файла (c расширение .afm)

После выполнения этих команд у вас должны появиться следующие файлы:

FPDF - библиотека для создания PDF-файлов на PHP

Теперь нужно сгенерировать файл с описанием шрифта – обычный php-файл. Вместе с FPDF поставляется скрипт makefont, который очень легко решит эту задачу.

Для начала работы с FPDF распакуйте скачанный архив (fpdf16.zip) по этому адресу – http://www.fpdf.org/en/dl.php?v=16&f=zip в любую директорию на вашем сайте.

Скрипт makefont находится в директории font/makefont/ ранее распакованного архива, и имеет имя makefont.php. В директорию fpdf/font нужно скопировать ранее полученные файлы с расширением .afm.

Чтобы использовать данный скрипт нужно:

  • Создать файл например font.php, который скопировать в папку fpdf/font
  • Записать в него следующие строки:
  • require("makefont/makefont.php"); // подключаем нужный скрипт
    MakeFont("arial.ttf","arial.afm","cp1251"); // запускаем нужную нам функцию
    MakeFont("arialbd.ttf","arialbd.afm","cp1251");
    MakeFont("arialbi.ttf","arialbi.afm","cp1251");
    MakeFont("ariali.ttf","ariali.afm","cp1251");

И естественно незабываем о <?php и ?>.
Функция MakeFont() имеет следующий формат:
MakeFont(string fontfile, string afmfile [, string enc [, array patch [, string type]]])

Здесь fontfile – это путь к шрифту(файл TTF или PFB), afmfile – путь к файлу метрики AFM, enc – имя используемой кодировки (если вы хотите работать с кириллицей то кодировка здесь будет cp1252), patch – необязательный параметр, который задает массив модификации кодировки и type – тип шрифта, True Type по умолчанию.

Список кодировок, которые можно использовать:

  • cp1250 (Central Europe)
  • cp1251 (Cyrillic)
  • cp1252 (Western Europe)
  • cp1253 (Greek)
  • cp1257 (Baltic)
  • ISO-8859-1 (Western Europe)
  • ISO-8859-2 (Central Europe)
  • ISO-8859-4 (Baltic)
  • ISO-8859-4 (Cyrillic)
  • ISO-8859-7 (Greek)
  • ISO-8859-15 (Western Europe)
  • ISO-8859-16 (Central Europe)
  • KOI8-R (Cyrillic)

Теперь запускаем файл font.php на исполнение, для этого в браузере нужно ввести его полный адресс http://yourname.ua/fpdf/font/font.php. После запуска скрипта Вы должны получить файлы вида: имя_шрифта.php (например arial.php). Теперь все готово для генерации документов с русскими символами.

И да ниже на рисунках предоставлена структура папок:

FPDF - библиотека для создания PDF-файлов на PHP

FPDF - библиотека для создания PDF-файлов на PHP

FPDF - библиотека для создания PDF-файлов на PHP

Итак наконец таки мы подошли к использованию самой библиотеки FPDF.

Начало работы с FPDF

Давайте представим что нам нужно вывести на печать прайс-лист какой то фирмы.

Что должно получится в итоге:

  • На прайсе должен обязательно присутствовать какой то логотип
  • Естественно должен осуществляться вывод из БД, после должна на выходе получится таблица с такими полями: порядковый номер, наименование товара, цена товара, оптовая цена товара, количество товара на складе
  • У документа должен быть какой то заголовок
  • Название фирмы должно быть хорошо видно на прайсе, адрес, телефон
  • Данные должны выводится из БД

Конечно пример небольшой, но я думаю что он достаточно неплохо продемонстрирует работу с библиотекой FPDF.

Код для создания БД с записями (не обращайте внимания на всякие глупости(говнокод), суть сейчас разобраться с библиотекой FPDF):

$db = sqlite_open("bdsql\price.db");
$query_table = sqlite_query($db, "CREATE TABLE price_ceni
(id INTEGER PRIMARY KEY,
name TEXT,
cena TEXT,
opt_cena TEXT,
kol_vo TEXT);");
$query_insert = sqlite_query($db, "INSERT INTO price_ceni(id,name,cena,opt_cena,kol_vo) VALUES (NULL,'So-dimm ddr2 pc-3200/4200/5300/6400 2056mb','25 u.e.','10 u.e.','125 sht.');");
$query_insert = sqlite_query($db, "INSERT INTO price_ceni(id,name,cena,opt_cena,kol_vo) VALUES (NULL,'SATA 40-160GB','146 u.e.','121 u.e.','1005 sht.');");
$query_insert = sqlite_query($db, "INSERT INTO price_ceni(id,name,cena,opt_cena,kol_vo) VALUES (NULL,'DVD-R','1595 u.e.','1220 u.e.','1725 sht.');");
$query_insert = sqlite_query($db, "INSERT INTO price_ceni(id,name,cena,opt_cena,kol_vo) VALUES (NULL,'Nvidia 32mb geforce4 420go','2555  u.e.','1230  u.e.','12895 sht.');");
$query_insert = sqlite_query($db, "INSERT INTO price_ceni(id,name,cena,opt_cena,kol_vo) VALUES (NULL,'HP 17-20v','2655  u.e.','2360  u.e.','14525 sht.');");
$query_insert = sqlite_query($db, "INSERT INTO price_ceni(id,name,cena,opt_cena,kol_vo) VALUES (NULL,'HP pavilion zd7000','5225  u.e.','3330  u.e.','4725 sht.');");
$query_insert = sqlite_query($db, "INSERT INTO price_ceni(id,name,cena,opt_cena,kol_vo) VALUES (NULL,'Matrix 15.4 *(1280*800)','22345  u.e.','1330  u.e.','12335 sht.');");

В качестве БД как видно из вышеприведенного кода я взял SQLite. Просто иногда на статьи очень много времени уходит, а сейчас его как никогда не хватает, поэтому не судите строго за плохой код.

Переходя к практике создания файлов-pdf с помощью FPDF, создайте файл index.php,(ранее он был показан на скриншотах структуры папок) в который разместите следующий код:

define('FPDF_FONTPATH','FPDF/font/'); //  Устанавливаем путь к папке шрифтов
require('FPDF/fpdf.php'); // Подключаем класс FPDF

Чтобы вывести статическую информацию(Название фирмы, адрес, телефон, логотип, название документа) можно воспользоваться следующими методами класса FPDF:

cell():
Cell(float w [, float h [, string txt [, mixed border [, int ln [, string align [, int fill [, mixed link]]]]]]])

Метод cell() выведет ячейку или другими словами прямоугольную область с заданными границами, фоновым цветом и строкой.
Параметры:

  • w – Ширина ячейки
  • h – Высота ячейки
  • txt – Строка для вывода
  • border – Граница ячейки
  • ln – Текущая позиция после вывода ячейки
  • align – Выравнивание текста
  • fill – Фон ячейки: да (1), нет (0)
  • link – URL или идентификатор, возвращенный методом AddLink()

image():
Image(string file, float x, float y [, float w [, float h [, string type [, mixed link]]]])

Метод image() Выводит изображение на страницу. Метод поддерживает два формата файлов таких как JPEG и PNG.
Параметры:

  • file – Название вставляемого изображения
  • x – Абсцисса верхнего левого угла
  • y – Ордината верхнего левого угла
  • w – Ширина изображения
  • h – Высота изображения
  • type – Формат изображения
  • link – URL или идентификатор, возвращаемый методом AddLink()

Для начали использования методов библиотеки FPDF нужно создать экземпляр класса:

$printing = new FPDF();
$printing->Open();

Выше приведенные строки следует добавить в файл index.php.

Теперь нужно зарегистрировать несколько используемых шрифтов, которые Мы создали ранее:

$printing->AddFont('ArialMT','','arial.php');
$printing->AddFont('Arial-BoldMT','','arialbd.php');
$printing->AddFont('Arial-BoldItalicMT','','arialbi.php');

AddFont() :
AddFont(string family [, string style [, string file]])

Метод AddFont() импортирует TrueType или Type1 шрифт и делает его доступным.
Параметры:

  • family – Семейство шрифта
  • style -Стиль шрифта
  • file Файл определения шрифта

Теперь можно со спокойной душой перейти к созданию тела документа, для нам нужно будет создать еще один дополнительный файл и назовем его printing.class.php, который будет содержать следующий код:

class Printing extends FPDF {
function Title($title,$image,$company_name,$company_adres,$company_tel,$company_site) {
$this->Image($image,6,6,30,20);
$this->Cell(30); // выводим пустую ячейку, ширина которой 30
$this->SetFont('Arial-BoldMT','',10); // задаем шрифт, и размер шрифта
$this->Cell(40,4,$company_name,0,0,'L',0); // выводим название компании
$this->Cell(70);
$this->SetFillColor(187,189,189);  // задаем цвет заливки следующих ячеек (R,G,B)
$this->Cell(50,4,$title,0,0,'C',1); // выводим наименование компании
$this->ln(); // переходим на следующую строку
$this->Cell(30);
$this->SetFont('ArialMT','',10);
$this->Cell(40,4,$company_adres,0,10,'L',0); // выводим адрес компании
$this->Cell(40,4,$company_tel,0,10,'L',0); // выводим телфон компании
$this->Cell(40,4,$company_site,0,10,'L',0); // выводим адрес сайта компании
}
}

Для тех кто запутался и не понимает какой код и что и как ниже приведу два файла которые должны получится после всех вышеприведенных манипуляций.
Файл index.php:

define('FPDF_FONTPATH','FPDF/font/');
require('FPDF/fpdf.php');   
require('printing.class.php');
$printing = new Printing();
$printing->Open();
// Подключаем кириллические шрифты
$printing->AddFont('ArialMT','','arial.php');
$printing->AddFont('Arial-BoldMT','','arialbd.php');
$printing->AddFont('Arial-BoldItalicMT','','arialbi.php');
$printing->AddPage(); //Добавляем страничку в документ
$printing->Title('Прайс-лист','logo.jpg','ООО "имя компании"','г. Симферополь ул. КИМ д.1 кв.10','тел. 024-263','www.yourname.ua'); // Выводим заголовок воспользовавшись новым методом
$printing->Output();// Выводим документ в браузер

Файл printing.class.php:

class Printing extends FPDF {
function Title($title,$image,$company_name,$company_adres,$company_tel,$company_site) {
$this->Image($image,6,6,30,20);
$this->Cell(30); // выводим пустую ячейку, ширина которой 30
$this->SetFont('Arial-BoldMT','',10); // задаем шрифт, и размер шрифта
$this->Cell(40,4,$company_name,0,0,'L',0); // выводим название компании
$this->Cell(70);
$this->SetFillColor(187,189,189);  // задаем цвет заливки следующих ячеек (R,G,B)
$this->Cell(50,4,$title,0,0,'C',1); // выводим наименование компании
$this->ln(); // переходим на следующую строку
$this->Cell(30);
$this->SetFont('ArialMT','',10);
$this->Cell(40,4,$company_adres,0,10,'L',0); // выводим адрес компании
$this->Cell(40,4,$company_tel,0,10,'L',0); // выводим телфон компании
$this->Cell(40,4,$company_site,0,10,'L',0); // выводим адрес сайта компании
}
}

Здесь пришлось использовать некоторые методы, которые я ранее не описывал, поэтому ниже я приведу некоторые из них.
SetFont():
SetFont(string family [, string style [, float size]])

Метод SetFont() задает шрифт, который будет использоваться для печати символов строки.
Параметры:

  • family – Семейство шрифта, это может быть имя определенное в AddFont()
  • style – Стиль шрифта
  • size – Размер шрифта в точках

SetFillColor():
SetFillColor(int r [, int g, int b])

Метод SetFillColor() задает цвет, используемый для всех операций, использующих заливку.
Параметры:

  • r – Если g и b заданы – красная составляющая; если нет – градация серого (от 0 до 255)
  • g – Зеленая составляющая (от 0 до 255)
  • b – Синяя составляющая (от 0 до 255)

ln():
Ln([float h])

Метод ln() выполняет разрыв строки.
Параметры:

  • h – Высота разрыва

AddPage():
AddPage([string orientation])

Метод AddPage() добавляет новую страницу в документ.
Параметры:

  • orientation – Ориентация страницы (Книжная,Альбомная).

Output():
string Output([string name [, string dest]])

Метод Output() отображает документ документ в строку, локальный файл или в браузер
Параметры:

  • name – Имя файла
  • dest – Пункт назначения куда выводить документ

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

Выводим из БД

И вот настал тот момент когда мы подошли к выводу данных из базы. На выходе мы должны получить таблицу с заголовками: №, наименование товара, цена, опт. цена, кол-во. И естественно в таблице должны находится записи из ранее созданной БД.

В файл index.php нужно добавить следующие строки:

$header = array("№", "наименование товара", "цена", "опт. цена"," кол-во"); // Все заголовки столбцов загоняем в массив
$db = sqlite_open("bdsql/price.db"); // Открывает базу данных SQLite
$query = sqlite_query($db, "SELECT * FROM price_ceni;"); // Выборка всех данных из таблицы price_ceni
$printing->OutputTable($header,$query); // Передаем вновь созданному методу заголовки столбцов и запрос выборки из БД
$printing->Output();// Выводим документ в браузер

В файл printing.class.php нужно добавить следующие строки:

function OutputTable($header,$query) {
$w=array(10,70,40,30,30,30); // Массив с шириной столбцов
$this->Cell(10);
$this->SetFont('Arial-BoldMT','',11);
for($i=0;$i<count($header);$i++){$this->Cell($w[$i],7,$header[$i],1,0,'C');}
$this->Ln();
$this-> SetFont('ArialMT','',8);
while($array = sqlite_fetch_array($query))
{
$this->Cell(10);
$this->Cell(10,4,$array['id'],1,0,'C',0);
$this->Cell(70,4,$array['name'],1,0,'L',0);
$this->Cell(40,4,$array['cena'],1,0,'C',0);
$this->Cell(30,4,$array['opt_cena'],1,0,'C',0);
$this->Cell(30,4,$array['kol_vo'],1,0,'C',0,1);
$this->ln();
}
}

Комментировать методы я не буду, потому ранее я их все описывал, некоторые строки кода я прокомментировал и считаю что этого должно быть достаточно, если что то непонятно обращайтесь к мануалу в котором описаны все методы FPDF.

В итоге у Вас должно получится два следующих файла:
Файл index.php:

/*
$db = sqlite_open("bdsql\price.db");
$query_table = sqlite_query($db, "CREATE TABLE price_ceni
(id INTEGER PRIMARY KEY,
name TEXT,
cena TEXT,
opt_cena TEXT,
kol_vo TEXT);");
$query_insert = sqlite_query($db, "INSERT INTO price_ceni(id,name,cena,opt_cena,kol_vo) VALUES (NULL,'So-dimm ddr2 pc-3200/4200/5300/6400 2056mb','25 u.e.','10 u.e.','125 sht.');");
$query_insert = sqlite_query($db, "INSERT INTO price_ceni(id,name,cena,opt_cena,kol_vo) VALUES (NULL,'SATA 40-160GB','146 u.e.','121 u.e.','1005 sht.');");
$query_insert = sqlite_query($db, "INSERT INTO price_ceni(id,name,cena,opt_cena,kol_vo) VALUES (NULL,'DVD-R','1595 u.e.','1220 u.e.','1725 sht.');");
$query_insert = sqlite_query($db, "INSERT INTO price_ceni(id,name,cena,opt_cena,kol_vo) VALUES (NULL,'Nvidia 32mb geforce4 420go','2555  u.e.','1230  u.e.','12895 sht.');");
$query_insert = sqlite_query($db, "INSERT INTO price_ceni(id,name,cena,opt_cena,kol_vo) VALUES (NULL,'HP 17-20v','2655  u.e.','2360  u.e.','14525 sht.');");
$query_insert = sqlite_query($db, "INSERT INTO price_ceni(id,name,cena,opt_cena,kol_vo) VALUES (NULL,'HP pavilion zd7000','5225  u.e.','3330  u.e.','4725 sht.');");
$query_insert = sqlite_query($db, "INSERT INTO price_ceni(id,name,cena,opt_cena,kol_vo) VALUES (NULL,'Matrix 15.4 *(1280*800)','22345  u.e.','1330  u.e.','12335 sht.');");
*/
define('FPDF_FONTPATH','FPDF/font/');
require('FPDF/fpdf.php');   
require('printing.class.php');
 
$printing = new Printing();
$printing->Open();
// Подключаем кириллические шрифты
$printing->AddFont('ArialMT','','arial.php');
$printing->AddFont('Arial-BoldMT','','arialbd.php');
$printing->AddFont('Arial-BoldItalicMT','','arialbi.php');
$printing->AddPage(); //Добавляем страничку в документ
$printing->Title('Прайс-лист','logo.jpg','ООО "имя компании"','г. Симферополь ул. КИМ д.1 кв.10','тел. 024-263','www.yourname.ua'); // Выводим заголовок воспользовавшись новым методом
 
$header = array("№", "наименование товара", "цена", "опт. цена"," кол-во"); // Все заголовки столбцов загоняем в массив
$db = sqlite_open("bdsql/price.db"); // Открывает базу данных SQLite
$query = sqlite_query($db, "SELECT * FROM price_ceni;"); // Выборка всех данных из таблицы price_ceni
$printing->OutputTable($header,$query);
$printing->Output();// Выводим документ в браузер

Файл printing.class.php:

class Printing extends FPDF {
function Title($title,$image,$company_name,$company_adres,$company_tel,$company_site) {
$this->Image($image,6,6,30,20);
$this->Cell(30); // выводим пустую ячейку, ширина которой 30
$this->SetFont('Arial-BoldMT','',10); // задаем шрифт, и размер шрифта
$this->Cell(40,4,$company_name,0,0,'L',0); // выводим название компании
$this->Cell(70);
$this->SetFillColor(187,189,189);  // задаем цвет заливки следующих ячеек (R,G,B)
$this->Cell(50,4,$title,0,0,'C',1); // выводим наименование компании
$this->ln(); // переходим на следующую строку
$this->Cell(30);
$this->SetFont('ArialMT','',10);
$this->Cell(40,4,$company_adres,0,10,'L',0); // выводим адрес компании
$this->Cell(40,4,$company_tel,0,10,'L',0); // выводим телфон компании
$this->Cell(40,4,$company_site,0,10,'L',0); // выводим адрес сайта компании
$this->ln();
$this->ln(); 
}
function OutputTable($header,$query) {
$w=array(10,70,40,30,30,30); // Массив с шириной столбцов
$this->Cell(10);
$this->SetFont('Arial-BoldMT','',11);
for($i=0;$i<count($header);$i++){$this->Cell($w[$i],7,$header[$i],1,0,'C');}
$this->Ln();
$this-> SetFont('ArialMT','',8);
while($array = sqlite_fetch_array($query))
{
$this->Cell(10);
$this->Cell(10,4,$array['id'],1,0,'C',0);
$this->Cell(70,4,$array['name'],1,0,'L',0);
$this->Cell(40,4,$array['cena'],1,0,'C',0);
$this->Cell(30,4,$array['opt_cena'],1,0,'C',0);
$this->Cell(30,4,$array['kol_vo'],1,0,'C',0,1);
$this->ln();
}
}
}

Если Вы все сделали правильно то у Вас должен получится PDF-документ содержащий следующее:

FPDF - библиотека для создания PDF-файлов на PHP

Теперь я выложу все файлы вместе с библиотекой и полученным PDF-файлом в архив, который можно скачать здесь.

Мой вольный перевод Уроков с оф. сайта FPDF:

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

Ссылки

Удачного использования!

(Visited 1,278 times, 1 visits today)