Generating PDF files with PHP and FPDF

Original author: Lana Kovacevic
  • Translation
Большинство web-сервисов экспортируют данные в разных форматах для дальнейшего использования. Данная статья о том, как экспортировать данные в pdf-формате.
Хотя многие знают как это делать, я опишу кратко для тех кто не знает.

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

PDFlib
PHP API содержит большое количество функций для работы с PDF, реализованных на базе PDFlib. Несмотря на это, данная библиотека не является бесплатной для коммерческого использования. Бесплатная версия называется PDFlib Lite и бесплатная для персонального использования, однако она ограничена в функциональности. Для того чтобы использовать полную библиотеку PDFlib необходимо купить лицензию.

Почему FPDF?
Альтернатива — это использование FPDF, бесплатный класс содержащий большое количество функций для создания и манипулирования PDF-документами. Ключевое слово для данного момента — это ее бесплатность. Вы можете скачать, использовать и модифицировать данный класс как вам заблагорассудится. В дополнение к бесплатности, эта библиотека намного проще, чем PDFlib. Для использования PDFlib необходимо установить ее как расширение к PHP, в то время как FPDF может быть подключена в программу напрямую.

Создание документов PDF
Для того чтобы начать, необходимо скачать код FPDF с сайта FPDF Web site и включить в программу. Например, вот так
require('fpdf.php');

Ниже пример использования библиотеки для генерации простого PDF.
Мы создадим новый объект FPDF:
$pdf= new FPDF();

Конструктор FPDF принимает следующие параметры
  • Ориентация страницы (P or L) книжная или альбомная
  • Размерность (pt,mm,cm или in)
  • Размер документа (A3, A4, A5, Letter and Legal)

Далее мы установим некоторые свойства документа
$pdf->SetAuthor('Lana Kovacevic');
$pdf->SetTitle('FPDF tutorial');

Так как в данном примере мы используем одинаковый шрифт для всего документа, мы устанавливаем его до создания страницы
$pdf->SetFont('Helvetica','B',20);
$pdf->SetTextColor(50,60,100);

У функции SetFont 3 параметра; название шрифта, стиль и размер. Мы используем Helvetica, жирный и 20 пунктов, мы будем использовать его для заголовка документа.
Вы можете использовать любой другой шрифт, используя функцию AddFont.
Используя функцию SetTextColor, мы устанавливаем цвет шрифта для всего документа. Цвет может быть представлен в RGB или grey scale. В данном примере мы используем RGB-значения.
Теперь когда главное сделано, приступим к созданию страниц.
$pdf->AddPage('P');
$pdf->SetDisplayMode('real','default');

В функцию AddPage () можно передать параметры «P» или «L» для указания ориентации страницы. Функция SetDisplayMode определяет как будет отображена страница. Вы можете определить параметры увеличения и разметки. В примере мы используем 100% увеличение и разметку по умолчанию, определенную в программе, используемой для просмотра.

Сейчас, когда у нас есть страница, давайте вставим в нее изображение для того чтобы сделать страницу приятней, также мы добавим ссылку. Мы отобразим логотип FPDF используя функцию Image и передадим в нее следующие параметры — название файла, размерность и адрес.
$pdf->Image('logo.png',10,20,33,0,' ','http://www.fpdf.org/');

Для того чтобы добавить ссылку воспользуемся следующей командой
$pdf->Link(10, 20, 33,33, 'http://www.fpdf.org/');

Сейчас созададим заголовок с рамкой
$pdf->SetXY(50,20);
$pdf->SetDrawColor(50,60,100);
$pdf->Cell(100,10,'FPDF Tutorial',1,0,'C',0);

Функция SetXY устанавливает x и y координаты точки, в которой мы хотим вывести заголовок. SetDrawColor устанавливает цвет границы, используя значения RGB. После этого мы вызываем функцию Cell для вывода прямоугольника с текстом нашего заголовка. Мы передаем в функцию следующие параметры: ширина, высота, текст, граница, ln, выравнивание и заполнение. Значение границы 0 — отсутствие границы или 1 для наличия границы. Для ln мы используем значение по умолчанию 0, «C» — выравнивание текста по цуентру и 0 для параметра заполнение. Если мы бы установили последний паараметр в 1 наш прямоугольник был бы закрашен, значение 0 оставит его прозрачным.
Теперь мы хотим написать маленький текст в наш документ
$pdf->SetXY(10,50);
$pdf->SetFontSize(10);
$pdf->Write(5,'Congratulations! You have generated a PDF. ');

Итак снова мы устанавливаем координаты вывода текста x и y, но теперь мы уменьшим размер шрифта, используя SetFontSize. Функция Write напечатает текст в наш документ. Параметр 5 устанавливает высоту, он имеет смысл только тогда когда у нас есть много строк в нашем тексте.
В конце мы выведен наш результат, используя функцию Output.
$pdf->Output('example1.pdf','I');

Здесь мы указали имя файла и параметры вывода, в данном случае «I». «I»-параметр выведет результат в браузер.

Итак полный текст:
require('fpdf.php');
//create a FPDF object
$pdf=new FPDF();
//set document properties
$pdf->SetAuthor('Lana Kovacevic');
$pdf->SetTitle('FPDF tutorial');
//set font for the entire document
$pdf->SetFont('Helvetica','B',20);
$pdf->SetTextColor(50,60,100);
//set up a page
$pdf->AddPage('P');
$pdf->SetDisplayMode(real,'default');
//insert an image and make it a link
$pdf->Image('logo.png',10,20,33,0,' ','http://www.fpdf.org/');
//display the title with a border around it
$pdf->SetXY(50,20);
$pdf->SetDrawColor(50,60,100);
$pdf->Cell(100,10,'FPDF Tutorial',1,0,'C',0);
//Set x and y position for the main text, reduce font size and write content
$pdf->SetXY (10,50);
$pdf->SetFontSize(10);
$pdf->Write(5,'Congratulations! You have generated a PDF.');
//Output the document
$pdf->Output('example1.pdf','I');


Сейчас когда мы научились создавать документы, посмотрим что еще можно сделать, используя FPDF. Пример ниже показывает нам как создать верх и низ (хедер и футер :-) ) нашего документа.
require('fpdf.php');
class PDF extends FPDF
{
  function Header()
  {
    $this->Image('logo.png',10,8,33);
    $this->SetFont('Helvetica','B',15);
    $this->SetXY(50, 10);
    $this->Cell(0,10,'This is a header',1,0,'C');
  }
  function Footer()
  {
    $this->SetXY(100,-15);
    $this->SetFont('Helvetica','I',10);
    $this->Write (5, 'This is a footer');
  }
}
$pdf=new PDF();
$pdf->AddPage();
$pdf->Output('example2.pdf','D');

Как вы видите мы создали дочерний класс, используя наследование и создания функций Header и Footer. Затем мы создали новый объект и добавили страницу в документ. Функция AddPage автоматически вызовет функции Header и Footer. В конце мы вывели полученную информацию в файл с названием example2.pdf, используя значение «D». В этом случае браузер предложит сохранить данный файл.

Итак, мы изучили основы создания PDF-документов, для более подробной информации используйте FPDF Web site.

Русская версия документации ZIP и TGZ
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 48

    +1
    помню, с русским языком я в свое время намучился
      0
      Я пролистал до комментариев, чтобы спросить про русские символы :) а тут единственный комментарий и точно в тему.
        +1
        о добавлении кириллических шрифтов можно здесь почитать, например
        http://phpclub.ru/detail/article/fpdf
        у меня были проблемы с кернингом.
          0
          Это кривое решение. Русских кодировок по моему штук 8. Под каждую свой конвертор писать? ;)
        0
        Да-да, я тоже хотел узнать про русский. Это большая проблема библиотек PDF. Когда-то пришлось ставить PECL-модуль для работы с Perl, чтобы из Perl-библиотеки генерировать PDF с русскими буквами.
        +3
        UFPDF - расширение FPDF
        http://acko.net/node/56
        не заметил проблем с русским.
          +1
          а ещё лучше берите TCPDF - дальнейшее развитие FPDF с Unicode поддержкой
            0
            О, отличная оказалась штука. Идёт даже в комлекте с несколькими unicode-шрифтами, так что для создания всяческих печатных форм подходит отлично: скачал и используй, сразу же.
              0
              Спасибо, очень помогла наводка. Хорошая библиотека, и толковые примеры. Быстро реализовал то, что было нужно. Респект.
            0
            Опечатка в конце статьи: стьраницу
              0
              наконецто :)
                +1
                Eсли язык PHP и нужна библиотека которая бы поддерживала полупрозрачные PNG картинки, то лучше использовать модуль Zend_PDF http://zendframework.com/manual/en/zend.pdf.html.
                  0
                  по моему, поддержка Unicode там анонсированна только в последней версии.
                    0
                    уже пофиксили
                    http://framework.zend.com/issues/browse/ZF-1507
                      0
                      У вас получилось что-нибудь по-русски сгенерировать?
                        0
                        а у Вас? У меня пока только крякозябры. 1.7.3
                          0
                          Вроде да — достаточно в utf передавать строки.
                          Не помню точно, так как остановились на варианте html2fpdf.
                  0
                  А не лучше ли, генерировать html страницу (это уже все давно научились) и конвертировать её в PDF? Например, с помощью http://html2fpdf.sourceforge.net/.
                    0
                    Это отстой вообще :( Я в своё время искал опенсорсное или хотя бы фриварное решение - ан нет. Пришлось по триста баксов покупать лицензии на компонент от WebSuperGoo :(
                      0
                      Это для ASP, как я понял.
                        0
                        Это не для ASP, а для Windows Server вообще. У нас COM-версия, её можно юзать из любого приложения под виндой, не исключая PHP ;)
                          0
                          Я в курсе возможностей COM. Но это частное решение. Давайте рассмотрим общий случай - сервер моет быть под Линуксом, Юниксом, МакОсом и еще чем нить экзотическим.
                            0
                            См. комментарий про ещё одну машинку. Расходы на дополнительный сервер под виндой не такие большие, как принято думать, зато там всё будет работать без лишних телодвижений и баксовложений.
                              0
                              Не резонно. Ваше решение не очень грамотно. Вместо точечного решения вы предлагает излишние мощности туда поставить. нужно все таки думать и о финансовой стороне проекта.
                                0
                                Вот я и предлагаю подумать. Сравнить стоимость сервера + Windows (даже не обязательно Server, если уж мы экономим) + WSG компонента + хостинг (если проект внешний), со стоимостью добавления/переработки PDF другими средствами. Если окупится за год-два-сколько_допустимо_политикой_компании — берём винду, не окупится за этот срок — не берём. Всё просто.
                                  0
                                  Стоитмость поддержки Windows и других платформ отличается и иногда серьезно.
                                    0
                                    И к чему вы это сказали? Я прекрасно знаю, что отличается, если уж вы сомневались :) Anyway надо считать в каждом конкретном случае, а не идти на поводу у потенциально холиварских лозунгов.
                                      +1
                                      И все таки , покупку доп. машины для перегонки в PDF я считаю нецелесообразным в любом проекте. Правильнее поставить еще один сервер на той же платформе, что бы его саппортил то же админ. Что бы везде было одно и тоже окружение. Такую связку легко реплицировать и масштабировать. Ладно. закрыли ветку. Спасибо за мнение.
                      0
                      согласен. так и делаю обычно.
                        0
                        Нагрузка на машинку немаленькая будет.
                          0
                          Зато дешевле докупить ещё одну машинку, чем оплачивать работу по созданию кучи PDF-онли отчётов, особенно если уже есть html-версия. Прикинь, 2 дня менял отчётик в html, а потом надо еще переверстать для PDF - ипануца. Мы как раз из-за этого ушли от прямого создания pdf...
                            0
                            Ваша правда, амиго.
                        0
                        html2fpdf — очень кривая штука. Спотыкается даже на простых вещах.
                        0
                        Нет поддержки Unicode. Так что даже не рассматриваю как современное решение.
                          0
                          Скажите лучше, как доставать текст из PDF средствами PHP?
                            0
                            не знаю правильно ли отвечаю на ваш вопрос, посмотрите http://www.setasign.de/products/pdf-php-…
                              0
                              это дополнение / изменение существуещего PDF документа. Может, конечно, я что-то упустил читая доку по FPDF, но, к сожалению, не нашёл как достать из PDF хотя бы plain text. :(
                          0
                          Одно время искал такую штуку.

                          А каким образом непосредственно в PHP обрабатывается формат PDF?
                            0
                            а посмотрите код fpdf
                            0
                            Вопрос на злобу дня: а можно ли с помощью этой библиотеки задать страницам колонтитулы?
                              0
                              Поторопился с вопросом - сам нашел ответ, да можно. Раздел называется Header и Footer.
                              0
                              Помню, в свое время была проблема со встраиванием изображений по тексту...
                                0
                                Прочел заголовок - хотел поругать автора - мол зачем прописные истины постишь.
                                НО! Поймал себя на мысли, что сам же сюда полезу за готовым решением :)
                                Голосовать не могу, так что +1
                                  0
                                  Мы используем FPDF для генерации счетов и в своё время я намучился с рендерингом таблиц - ибо не работал перенос строк в ячейках. Было найдено решение - использовать расширение PDF_MC_Table. Возможно, придётся подработать напильничком, т.к. были проблемы с переносом таблицы на новую страницу с сохранением заголовков и необходимым отступом снизу.

                                  Но всё же я ищу альтернативу, ибо FPDF давненько не обновлялся и были траблы с UTF8 и альфа-каналом в png-картинках, так что возлагаю все надежды на реализацию от Zend.
                                    0
                                    как вариант - HTMLDOC (http://www.htmldoc.org/)

                                    HTMLDOC converts Hyper-Text Markup Language ("HTML") input files into indexed HTML, Adobe® PostScript®, or Adobe Portable Document Format ("PDF") files.

                                    кирилические шрифты http://upload.com.ua/get/900120997
                                      0
                                      У вас в примере пробел в параметре типа файла, в итоге функция и автоматом не работает и на пробел ругается.
                                      $pdf->Image('logo.png',10,20,33,0,'png','http://www.fpdf.org/');
                                        0
                                        А еще есть вариант генерить TeX и компилировать его в PDF.

                                        Only users with full accounts can post comments. Log in, please.