Файлы PDF довольно широко используются для представления электронных документов в различных системах. Данный формат файлов весьма стал популярным в виду его независимости от операционных систем. Документ при необходимости можно распечатать, либо передать по почте другому человеку. В PDF формате в интернете можно найти учебники, различные мануалы, а также другие материалы в электронном виде. Кроме того, различные сервисы которым необходимо выдавать различного рода документы своим пользователям, могут генерировать PDF-документы в режиме реального времени. В общем и целом, использование PDF может покрыть потребность выдачи различного рода документов в сети.
В данном посту мы поговорим о том, как можно создавать PDF файлы используя язык PHP. Для генерации PDF-документов существует библиотека FDPF. Далее речь пойдет об её использовании, и перед этим, её следует скачать к себе на компьютер.
Ссылка на библиотеку FPDF:
http://www.fpdf.org/en/download.php
Разместить файлы библиотеки следует в рабочей директории проекта. Расположена библиотека может в разных директориях, в этом случае следует задать местоположение посредством переменной PHP library path. Давайте рассмотрим пример вывода строки «Hello world» в PDF файл. Для этого следует создать PHP файл, и прописать в нём следующее.
<?php define('FPDF_FONTPATH', '/local/myproject/font/'); require( 'fpdf.php' ); $pdf = new FPDF(); $pdf->SetFont('Arial','',72); $pdf->AddPage(); $pdf->Cell(40,10,"Hello World!",15); $pdf->Output();
В результате будет создан PDF-документ следующего вида:
В самом начале мы задали константу FPDF_FONTPATH, эта константа указывает папку в которой находятся шрифты, используемые для генерации документа. Затем подключается сам файл библиотеки fpdf.php. После подключения файла библиотеки создаётся экземпляр класса FPDF(), далее вся работа происходит с объектом этого класса. Метод SetFont() устанавливает параметры шрифта для текста. Метод AddPage() указывает на создание новой страницы в PDF-документе. Добавить текст в документ можно посредством добавления ячейки. Добавляется ячейка посредством метода Cell(), для которой задаются размеры, а так же их содержимое. Ячеек в самом деле может быть целое множество, с их помощью можно формировать структуру документа. Непосредственное формирование документа выполняется через метод Output(). Как вы уже заметили, все названия методов интуитивно понятные.
Пример указанный выше довольно простой, и для лучшего понимания стоит сделать уже что-то по сложнее. Давайте выведем некоторые динамические данные в цикле, и сформируем таблицу в PDF-документе. Этот пример показывает работу с библиотекой, в случае с некоторыми динамическими данными. Для начала сделаем вывод заголовков таблицы. В связи с тем, что в PDF файлах нет табличной структуры как в HTML, построение табличных данных там происходит посредством набора ячеек, каждая из которых получает параметры ширины, шрифта, фоновой заливки, и цвета рамки.
<?php define('FPDF_FONTPATH','/local/myproject/font/'); require( 'fpdf.php' ); require( 'data-result.php' ); class PDF extends FPDF { function EventTable($event) { $this->SetFont('','B','24'); $this->Cell(40,10,$event['name'],15); $this->Ln(); $this->SetXY( 10, 45 ); $this->SetFont('','B','10'); $this->SetFillColor(128,128,128); $this->SetTextColor(255); $this->SetDrawColor(92,92,92); $this->SetLineWidth(.3); $this->Cell(70,7,"Team 1",1,0,'C',true); $this->Cell(20,7,"Score 1",1,0,'C',true); $this->Cell(70,7,"Team 2",1,0,'C',true); $this->Cell(20,7,"Score 2",1,0,'C',true); $this->Ln(); } } $pdf = new PDF(); $pdf->SetFont('Arial','',10); foreach( getResult() as $event ) { $pdf->AddPage(); $pdf->EventTable($event); } $pdf->Output();
В результате был сформирован PDF-документ такого вида:
Первое, на что стоит обратить внимание в данном примере, это файл data-result.php который подключается после библиотеки FPDF. В данном файле формируется массив данных, который мы в дальнейшем будем использовать для генерации документа. Далее объявляется класс PDF, который является наследником класса FPDF. Класс содержит метод EventTable($event), в качестве входного параметра получает массив с данными. Метод создаёт строку в документе, с набором ячеек, с установленными параметрами шрифтов, и т.д. Вызывается метод в цикле, в котором передаются данные из функции getResult(). Функция getResult() возвращает массив, по сути, вместо функции может быть и обычная переменная с массивом данных.
По аналогии с формированием заголовков таблицы, можно заполнить таблицу уже готовыми данными. Для заполнения таблицы мы допишем код таким образом:
<?php define('FPDF_FONTPATH','/local/myproject/font/'); require( 'fpdf.php' ); require( 'data-result.php' ); class PDF extends FPDF { function EventTable($event) { $this->SetFont('','B','24'); $this->Cell(40,10,$event['name'],15); $this->Ln(); $this->SetFont('','B','10'); $this->SetFillColor(128,128,128); $this->SetTextColor(255); $this->SetDrawColor(92,92,92); $this->SetLineWidth(.3); $this->Cell(70,7,"Team 1",1,0,'C',true); $this->Cell(20,7,"Score 1",1,0,'C',true); $this->Cell(70,7,"Team 2",1,0,'C',true); $this->Cell(20,7,"Score 2",1,0,'C',true); $this->Ln(); $this->SetFillColor(224,235,255); $this->SetTextColor(0); $this->SetFont(''); $fill = false; foreach($event['games'] as $game){ $this->SetFont('Times',((int)$game['score1']>(int)$game['score2'])?'BI':''); $this->Cell(70,6,$game['team1'],'LR',0,'L',$fill); $this->Cell(20,6,$game['score1'],'LR',0,'R',$fill); $this->SetFont('Times',((int)$game['score1']<(int)$game['score2'])?'BI':''); $this->Cell(70,6,$game['team2'],'LR',0,'L',$fill); $this->Cell(20,6,$game['score2'],'LR',0,'R',$fill); $this->Ln(); $fill =! $fill; } $this->Cell(180,0,'','T'); } } $pdf = new PDF(); $pdf->SetFont('Arial','',10); foreach( getResult() as $event ) { $pdf->AddPage(); $pdf->EventTable($event); } $pdf->Output();
Результат формирования таблицы в PDF:
Как вы можете заметить, в дополнения к выводу заголовков таблицы в методе EventTable() появился цикл foreach, который дополнительно выводит данные по результатам «матчей». Для наглядности каждая стока таблицы меняет цвет, сделано это посредством переменной $fill. Жирным курсивом выделены названия команд победителей. Так же происходит смена шрифтов.
Добавляется изображения в документ довольно просто. Сделать это можно посредством метода Image().
$pdf->Image('logo.png',5,5,33);
$pdf – это есть объект класса FDPF, logo.php – файл который следует разместить в документе, далее идёт положение по x, y координатам, и ширина в DPI. Переданы данному методу могут 7 параметров, более детально о всех параметрах и методах вы можете ознакомиться на сайте проекта FPDF (ссылка была указана выше). У меня на этом всё, надеюсь примеры были не такими сложными, всего доброго!
как быть в случае многострочного текста в ячейке?
Вариант 1 - Использовать функцию Text:
http://www.fpdf.org/en/doc/text.htm
Вариант 2 - Использовать функцию MultiCell:
http://www.fpdf.org/en/doc/multicell.htm
ошибка FPDF: не удалось включить файл определения шрифта
Как это лечится?
Первое что приходит на ум - проверить путь до шрифта, выставить права доступа для папки.