Генерация pdf-файлов с помощью php и библиотеки TCPDF

Если вам необходимо реализовать генерацию pdf-файла с помощью php, у вас возникнет выбор между несколькими библиотеками.

  • Расширение PDFLib для PHP (http://www.pdflib.com)
  • Библиотека FPDF (http://www.fpdf.org/)
  • Библиотека TCPDF (http://www.tcpdf.org/)

Расширение PDFLib работает с кодировкой UTF-8 только в платной версии, что является безусловным его минусом, поэтому данный вариант не подлежит рассмотрению. Также это расширение должно быть установлено на хостинге, где будет работать PHP-скрипт, что тоже ограничивает сферу применения скрипта.

Библиотека FPDF также не поддерживает UTF-8 кодировку, что тоже отметает этот вариант. Работа с библиотекой на первый взгляд для реализации типовых решений совсем несложная, однако, чтобы сгенерировать нечто сложное и необычное, придется потрудиться.

Итак, примем во внимание библиотеку TCPDF и рассмотрим некоторые тонкости и небольшой примерчик с реализацией.

Шаг 1. Скачиваем библиотеку с официального сайта (http://www.tcpdf.org/index.php)
Шаг 2. Подключаем библиотеку на нашем(вашем) сайте.

require_once('tcpdf/tcpdf.php');

Шаг 3. Создаем экземпляр класса TCPDF

// создаем объект TCPDF - документ с размерами формата A4
// ориентация - книжная
// единицы измерения - миллиметры
// кодировка - UTF-8
$pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
// убираем на всякий случай шапку и футер документа
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->SetMargins(20, 25, 25); // устанавливаем отступы (20 мм - слева, 25 мм - сверху, 25 мм - справа)
$pdf->AddPage(); // создаем первую страницу, на которой будет содержимое

Для альбомной ориентации при создании экземпляра следует вместо параметра P указать L.

При выводе информации я использовала метод writeHTML(), который предназначен для вывода в формате html. Пример:

$html ='<a href="http://odenisova.ru/">This is link</a>';
$pdf->writeHTML($html, true, false, true, false, '');
$pdf->Output('doc.pdf', 'I'); // выводим документ в браузер, заставляя его включить плагин для отображения PDF (если имеется)

Если вы все сделали верно,у вас должен был загрузиться pdf-файл с ссылкой на главную страницу моего блога.

Этот же текст полностью:

&lt;?
require_once($_SERVER["DOCUMENT_ROOT"].'/lib/tcpdf/tcpdf.php');
// создаем объект TCPDF - документ с размерами формата A4
// ориентация - книжная
// единицы измерения - миллиметры
// кодировка - UTF-8
$pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
// убираем на всякий случай шапку и футер документа
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->SetMargins(20, 25, 25); // устанавливаем отступы (20 мм - слева, 25 мм - сверху, 25 мм - справа)
$pdf->AddPage(); // создаем первую страницу, на которой будет содержимое
$html ='&lt;a href="http://odenisova.ru/"&gt;This is link on my blog&lt;/a&gt;';
$pdf-&gt;writeHTML($html, true, false, true, false, '');
$pdf-&gt;Output('doc.pdf', 'I'); // выводим документ в браузер, заставляя его включить плагин для отображения PDF (если имеется)
?&gt;

Пример получившейся страницы можно посмотреть по ссылке http://odenisova.ru/lib/tcpdf/examples/example.php

Также в архиве с библиотекой есть другие примеры реализации интересных вещей, например:
Круговая диаграмма
Градиент
Использование XHTML + CSS
Отрисовка графических элементов
Форма XHTML

И множество других примеров, которые облегчат вам жизнь. Код этих и других страниц, повторюсь, есть в директории «examples» папки с библиотекой.

Теперь рассмотрю еще 1 крайне интересный момент — вывод русскоязычного текста на сайте.
Если вы уже успели попробовать, как бы вы не старались и какую кодировку файла бы ни делали, обычными средствами русский текст библиотека не выводит, т.к. кириллических шрифтов в ней нет. Но есть все необходимое, чтобы их сделать. Допустим нам понабился шрифт Arial нормального начертания. Берем шрифт Arial (начертание — normal) из системной папки Windows (например) – файл arial.ttf – и копируем его в папку fonts/utils.
В этой папке есть утилита ttf2ufm, которой мы должны скормить файл arial.ttf:
ttf2ufm -a -F arial.ttf
Далее запускаем скрипт makefont.php (предполагается, что путь к php есть в переменной окружения PATH системы):
php -q makefont.php arial.ttf arial.ufm
Если на вашей локальной машине нет интерпретатора PHP, можете выполнить на сервере файл следующего содержания:

<?php
require('makefont.php');
MakeFont('times.ttf', 'times.ufm', true,' iso-8859-5');
?>

Если вы «скормили» несколько файлов и хотите сформировать сразу все шрифты (для которых созданы файлы *.ufm), имеющиеся в папке, запустите makeallttffonts.php.
После работы данной утилиты у нас в папке utils появятся три файла: arial.php, arial.z, arial.ctg.z, которые мы должны будем переместить в папку fonts. Файлы arial.ttf и arial.ufm нам больше не нужны, поэтому можем смело их удалять.
В итоге мы подготовили шрифт Arial, который будет присоединен к формируемому PDF-файлу. Но при этом нужно учесть, что размер формируемого PDF-документа возрастет примерно на размер файла шрифта arial.z. Также необходимо учесть, что если мы хотим вывести надпись курсивно, нам нужно будет для этого создавать отдельный шрифт ariali, или если полужирным начертанием – arialb.

Если вам очень лень заниматься всем этим, а из кириллических шрифтов нужен только 1 и подойтет arial, можете скачать архив со всеми нужными файлами и поместить содержимое в папку fonts.

Ну вот и рассмотрены все моменты, достаточные для того, чтобы сделать типовой pdf. Удачи!

  • Riddya85

    ссылка на готовые шрифты уже не действительна? 

    • Аноним

      Перезалила и обновила ссылку. Спасибо 

      • Riddya85

        Уже ближе, но 404 ошибка вылазит. Посмотрите еще раз, пожалуйста 😉 Премного благодарен

        • Аноним

          невнимательность — мой порок :( http://odenisova.ru/lib/tcpdf/fonts/cirillica.zip

          • Riddya85

            У всех бывает 😀 Спасибо, теперь рабочая :)

          • Riddya85

            А Вы бы не могли дать свои контакты, мне на email? Возникли кое-какие вопросы, и в других мануалах так же неясно написано. 

          • Аноним
          • Riddya85

            Отправил Вам вопрос, но ответа так и не получил. Дело довольно важное. Буду благодарен за помощь.

  • vetkrs

    Как вставить переменную вместо html текста чтобы реализовать генерацию на всех страницах сайта?

  • Павел

    Здравствуйте !

    У меня проблемка с формирование pdf, а суть ее в следующем — когда пишу код в отдельном php файле, то все работает нормально, а вот когда вставляю его на свой сайт, то происходит ошибка (TCPDF ERROR: Some data has already been output to browser, can’t send PDF file). Использование ob_end_clean() не помагает. Может быть что нибудь посоветуете ?

  • mailfox

    спасибо за русские шрифты!!!

    • admin

      пожалуйста! :)

  • ytDasha

    Спасибо за готовый архив с кириллицей!! ))