Сегодня рассмотрим возможность создания PDF-файла из скрипта на PHP. Зачем нам нужно создавать PDF? Существует множество разных ситуаций, в которых это необходимо, но мы знаем точно одно – PDF как никакой другой формат отлично обеспечит точность отображения представленной в нем информации на листе бумаги. Другими словами, если мы хотим, чтобы некий документ распечатался правильно на любой системе, мы должны его подготовить в формате PDF.

Когда необходимость создать документ из PHP застала и меня, я бросился на поиски готовых решений и рассмотрел три наиболее популярных с моей точки зрения решения (может быть я и ошибаюсь):

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

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

Не зная еще про то, что FPDF тоже не поддерживает UTF-8 (но не требует дополнительных расширений для PHP), я первым делом взялся за нее, но потом тоже отбросил по понятной причине.

В итоге я узнал о библиотеке TCPDF, которая имеет поддержку UTF-8, что мне было необходимо, и которая не требовательна к функциям хостинга.

Итак, попытаемся на ее основе сгенерировать простой PDF-документ на русском языке, который будет отображаться везде (даже на тех компьютерах , где нет нужных шрифтов).

Руководство по использованию этой библиотеки я дублировать здесь не буду icon smile Генерируем PDF с помощью TCPDF .Вы с успехом сможете найти его на сайте http://www.tcpdf.org/. Там же есть примеры использования этой библиотеки с исходными кодами. Честно говоря, руководства как такового там нет, но есть справка по всем функциям и классам (http://www.tecnick.com/pagefiles/tcpdf/doc/index.html), а также различные примеры, как я уже писал предложением ранее. Из того, что там дано, несложно понять, что и как делается. Но справка по функциям, честно сказать, не очень удобна (видимо формировалась автоматически на основе комментариев в коде библиотеки).

Цель данного поста – показать, как эту библиотеку использовать, и рассказать о ньюансах использования шрифтов.

Пусть наш документ будет содержать в себе простое предложение – «Привет, Мир!», окрашенное в зеленый цвет и содержащееся в синей рамке. Пусть это предложение вместе с рамкой будет отцентрировано по горизонтали и выведено в начале листа формата A4. Мы предполагаем, что на компьютере, где этот документ будут читать, нет шрифта Arial, на котором мы напишем «Привет, Мир!» (всякое бывает), поэтому мы научимся подготавливать шрифты для их вставки в PDF, чтобы документ был автономным.

Итак, скачиваем с официального сайта библиотеку и подключаем ее, дописав несколько строк кода, которые «нарисуют» нам наш документ (предполагается, что директория tcpdf находится на одном уровне с нашим скриптом):

<?php
	require_once '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(); // создаем первую страницу, на которой будет содержимое

	$pdf->SetXY(90, 10);           // устанавливаем координаты вывода текста в рамке:
	                               // 90 мм - отступ от левого края бумаги, 10 мм - от верхнего

	$pdf->SetDrawColor(0, 0, 200); // устанавливаем цвет рамки (синий)
	$pdf->SetTextColor(0, 200, 0); // устанавливаем цвет текста (зеленый)

	$pdf->Cell(30, 6, 'Hello, World!', 1, 1, 'C'); // выводим ячейку с надписью шириной 30 мм и высотой 6 мм. Строка отцентрирована относительно границ ячейки

	$pdf->Output('doc.pdf', 'I'); // выводим документ в браузер, заставляя его включить плагин для отображения PDF (если имеется)
?>

Сейчас мы вывели строку «Hello, World!», поскольку по-русски мы пока вывести ничего не можем, т.к. шрифт используется стандартный – helvetica – без поддежки UTF-8.

Теперь подготовим шрифт Arial с кодировкой UTF-8. Условимся, что нам нужен пока только этот шрифт с начертанием «нормальный» (бывает еще жирный, курсивный, жирный курсив).

В TCPDF делается это не очень удобно (я бы даже сказал, очень неудобно), но скажем спасибо создателю, что хоть такая возможность есть icon smile Генерируем PDF с помощью TCPDF

Все шрифты, готовые к использованию в TCPDF хранятся в папке fonts внутри директории библиотеки. Открыв ее, мы увидим множество файлов разных расширений (кстати, эта папка весит более 12 метров). Удалим все файлы, оставив только helvetica.php (т.к. она используется по умолчанию и если мы ее удалим, TCPDF работать не будет) и папку utils (она нам понадобится для подготовки файлов шрифта Arial). Теперь берем шрифт Arial (начертание – normal) из системной папки Windows (у меня Vista) – файл arial.ttf – и копируем его в папку fonts/utils.

В этой папке есть утилита ttf2ufm, которой мы должны скормить файл arial.ttf:


ttf2ufm -a -F arial.ttf

Далее запускаем скрипт makefont.php (предполагается, что путь к php есть в переменной окружения PATH системы):


php -q makefont.php arial.ttf arial.ufm

После работы данной утилиты у нас в папке utils появятся три файла: arial.php, arial.z, arial.ctg.z, которые мы должны будем переместить в папку fonts. Файлы arial.ttf и arial.ufm нам больше не нужны, поэтому можем смело их удалять.

В итоге мы подготовили шрифт Arial, который будет присоединен к формируемому PDF-файлу. Попробуем теперь вывести надпись по-русски:

<?php
	require_once '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(); // создаем первую страницу, на которой будет содержимое

	$pdf->SetXY(90, 10);           // устанавливаем координаты вывода текста в рамке:
	                               // 90 мм - отступ от левого края бумаги, 10 мм - от верхнего

	$pdf->SetDrawColor(0, 0, 200); // устанавливаем цвет рамки (синий)
	$pdf->SetTextColor(0, 200, 0); // устанавливаем цвет текста (зеленый)

	$pdf->SetFont('arial', '', 9); // устанавливаем имя шрифта и его размер (9 пунктов)
	$pdf->Cell(30, 6, 'Привет, Мир!', 1, 1, 'C'); // выводим ячейку с надписью шириной 30 мм и высотой 6 мм. Строка отцентрирована относительно границ ячейки

	$pdf->Output('doc.pdf', 'I'); // выводим документ в браузер, заставляя его включить плагин для отображения PDF (если имеется)
?>

Но при этом нужно учесть, что размер формируемого PDF-документа возрастет примерно на размер файла шрифта arial.z.

Также необходимо учесть, что если мы хотим вывести надпись курсивно, нам нужно будет для этого создавать отдельный шрифт ariali, или если полужирным начертанием – arialb.

В этом конечно заключается недостаток библиотеки – чем больше шрифтов используем в PDF-документе, тем он больше «весит». Создатели этой библиотеки приводят метод использования шрифтов, установленных в системе, без их присоединения к PDF-документу, но лично у меня ничего не получилось (прочитать о том, как готовить шрифты для PDF, можно в файле README.txt, который находится в папке fonts/utils).

Но с другой стороны, если мы хотим быть уверены, что получатель нашего документа прочитает его, мы должны присоединить шрифт к документу, как проделывали это выше. К тому же, если это документ в буквальном смысле слова (например, платежное поручение), то шрифтов там должно использоваться по минимуму.

Кстати, забыл написать, что TCPDF разработана как для PHP4, так и для PHP5.

А вот и получившийся документ: doc.pdf

Думаю, эта статья поможет кому-то сэкономить время на изучение этой великолепной библиотеки TCPDF icon smile Генерируем PDF с помощью TCPDF

P.S. Если кто-то знает способ формирования PDF лучший (и более удобный), чем тот, что я привел – прошу в комменты icon wink Генерируем PDF с помощью TCPDF Буду рад узнать о других возможностях.

источник: http://i-novice.net/generiruem-pdf-s-pomoshhyu-tcpdf/