Создание PDF средствами PHP

18.12.2011

Теги: PHPWeb-разработка

Класс FPDF является чистым PHP кодом и легко подключается к скриптам командой include() или require(). Скачать класс и ознакомиться с документацией (в том числе на русском языке) можно на сайте www.fpdf.org.

Основная проблема при использовании класса — файлы кириллических шрифтов. Возьмем в папке C:/Windows/Fonts файлы шрифтов Arial, Times New Roman и Courier New:

  • arial.ttf, arialbd.ttf, ariali.ttf, arialbi.ttf
  • times.ttf, timesbd.ttf, timesi.ttf, timesbi.ttf
  • cour.ttf, courbd.ttf, couri.ttf, courbi.ttf

Вместе с классом FPDF поставляется скрипт makefont/makefont.php для генерация файла описания шрифта. Использовать его просто. Для этого создаем РНР файл (скажем, mf.php):

<?php
require('makefont/makefont.php');

MakeFont('arial.ttf', 'cp1251');
MakeFont('arialbd.ttf', 'cp1251');
MakeFont('ariali.ttf', 'cp1251');
MakeFont('arialbi.ttf', 'cp1251');

MakeFont('times.ttf', 'cp1251');
MakeFont('timesbd.ttf', 'cp1251');
MakeFont('timesi.ttf', 'cp1251');
MakeFont('timesbi.ttf', 'cp1251');

MakeFont('cour.ttf', 'cp1251');
MakeFont('courbd.ttf', 'cp1251');
MakeFont('couri.ttf', 'cp1251');
MakeFont('courbi.ttf', 'cp1251');
?>

Запустив скрипт mf.php в браузере, получим файлы:

  • arial.php, arialbd.php, ariali.php, arialbi.php и arial.z, arialbd.z, ariali.z, arialbi.z
  • times.php, timesbd.php, timesi.php, timesbi.php и times.z, timesbd.z, timesi.z, timesbi.z
  • cour.php, courbd.php, couri.php, courbi.php и cour.z, courbd.z, couri.z, courbi.z

Все эти файлы вместе с файлами шрифтов

  • arial.ttf, arialbd.ttf, ariali.ttf, arialbi.ttf
  • times.ttf, timesbd.ttf, timesi.ttf, timesbi.ttf
  • cour.ttf, courbd.ttf, couri.ttf, courbi.ttf

надо поместить в директорию font класса. Впрочем, можно самому указать директорию, которая будет хранить шрифты. Для этого нужно определить константу FPDF_FONTPATH:

define('FPDF_FONTPATH','font/');

А теперь попробуем сформировать PDF-документ, используя класс FPDF. Для начала создадим файл makepdf.php, который будет осуществлять вывод PDF-документа прямо в браузер. В одной папке с этим файлом поместим файл класса fpdf.php и папку font с вложенными в нее файлами кириллических шрифтов.

<?php
define('FPDF_FONTPATH', 'font/');
require 'fpdf.php';
// Создадаем экземпляр класса
$pdf = new FPDF();
$pdf->Open();

// Подключаем кириллические шрифты
$pdf->AddFont('ArialMT', '', 'arial.php');
$pdf->AddFont('Arial-BoldMT', '', 'arialbd.php');
$pdf->AddFont('Arial-ItalicMT', '', 'ariali.php');
$pdf->AddFont('Arial-BoldItalicMT', '', 'arialbi.php');
/*
$pdf->AddFont('TimesNewRomanPSMT', '', 'times.php');
$pdf->AddFont('TimesNewRomanPS-BoldMT', '', 'timesbd.php');
$pdf->AddFont('TimesNewRomanPS-ItalicMT', '', 'timesi.php');
$pdf->AddFont('TimesNewRomanPS-BoldItalicMT', '', 'timesbi.php');

$pdf->AddFont('CourierNewPSMT', '', 'cour.php');
$pdf->AddFont('CourierNewPS-BoldMT', '', 'courbd.php');
$pdf->AddFont('CourierNewPS-ItalicMT', '', 'couri.php');
$pdf->AddFont('CourierNewPS-BoldItalicMT', '', 'courbi.php');
*/
// Добавляем страницу в документ
$pdf->AddPage();
// Задаем режим отображения
$pdf->SetDisplayMode('real', 'default');
// Устанавливаем шрифт и его размер
$pdf-> SetFont('ArialMT', 'U', 22);
// Устанавливаем цвет текста заголовка (красный)
$pdf->SetTextColor(255, 0, 0);
// Устанавливаем цвет заливки (желтый)
$pdf->SetFillColor(255, 255, 0);
// Задаем абсциссу и ординату текущей позиции
$pdf->SetXY(20, 20);
// Устанавливаем цвет для рисования контура вокруг заголовка (красный)
$pdf->SetDrawColor(255, 0, 0);
// Выводим ячейку (прямоугольную область), которая будет заголовком:
// 100 - ширина ячейки; 10 - высота ячейки;
// $text - текст внутри ячейки; 1 - толщина рамки;
// 1 - текущая позиция после вывода ячейки будет в начале следующей строки;
// 'C' - выравнивание по центру; 1 - заливка фона ячейки
$text = 'Золотой теленок';
$pdf->Cell(150, 10, $text, 1, 1, 'C', 1);
// Вставляем изображение, которое будет ссылкой
$pdf->Image('image.jpg', 10, 40, 0, 0, 'JPG', 'http://www.fpdf.org/');
// Устанавливаем шрифт для текста
$pdf->SetFont('ArialMT', '', 12);
// Устанавливаем позицию начала текста
$pdf->SetXY (10, 140);
// Устанавливаем цвет текста
$pdf->SetTextColor(10, 10, 10);
$pdf->Write(5, 'Пешеходов  надо  любить.  Пешеходы  составляют  большую  часть  человечества.  Мало  того  —  лучшую  его  часть.  Пешеходы  создали  мир.  Это  они  построили  города,  возвели  многоэтажные  здания,  провели канализацию  и  водопровод, замостили улицы и осветили их электрическими лампами.');
// Устанавливаем шрифт для текста
$pdf-> SetFont('Arial-ItalicMT', '', 12);
$pdf->Write(5, ' Это они распространили культуру по всему свету, изобрели книгопечатание, выдумали порох, перебросили мосты через реки, расшифровали египетские иероглифы, ввели в употребление безопасную бритву, уничтожили торговлю рабами и установили, что из бобов сои можно изготовить сто четырнадцать вкусных питательных блюд.');
// Разрыв строки
$pdf->Ln();
$pdf->Ln();
// Устанавливаем шрифт для текста
$pdf-> SetFont('Arial-BoldMT', '', 12);
// Устанавливаем цвет текста (синий)
$pdf->SetTextColor(0, 0, 255);
$pdf->MultiCell(0, 5, 'И когда все было готово, когда родная планета приняла сравнительно благоустроенный вид, появились автомобилисты.', 1, 'R', 1);
// Разрыв строки
$pdf->Ln();
$pdf->Ln();
// Устанавливаем шрифт для текста
$pdf->SetFont('Arial-BoldItalicMT', '', 12);
// Устанавливаем цвет текста (зеленый)
$pdf->SetTextColor(0, 200, 0);
$pdf->MultiCell(0, 5, 'Надо заметить, что автомобиль тоже был изобретен пешеходами. Но автомобилисты об этом как-то сразу забыли. Кротких и умных пешеходов стали давить. Улицы, созданные пешеходами, перешли во власть автомобилистов. Мостовые стали вдвое шире, тротуары сузились до размера табачной бандероли. И пешеходы стали испуганно жаться к стенам домов.', 0, 'J', 0);
// Выводим созданный документ в браузер
$pdf->Output('example.pdf', 'I');
?>

Конструктор FPDF принимает следующие параметры:

  • Ориентация страницы: P — книжная, L — альбомная; по умолчанию P
  • Единица измерения: pt — точка, mm — миллиметр, cm — санатиметр, in — дюйм; по умолчанию mm
  • Размер документа: A3, A4, A5, Letter, Legal или специальный формат, выраженный в виде массива из двух элементов: ширина и высота

После создания экземпляра класса необходимо указать используемые шрифты. Так как кириллический Arial не является в классе FPDF шрифтом, установленным по умолчанию, сначала надо подключить его при помощи метода AddFont().

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

Первым аргументом мы указываем наименование шрифта. Его можно посмотреть в сгенерированном РНР файле (значение переменной $name). Второй аргумент — форматирование текста (B — Bold, I — Italic и смешанный BI или IB). Если аргумент пустой, то шрифт обычный. Третий аргумент — РНР файл описания. Теперь эти шрифты можно применять в данном документе.

Размер шрифта установим методом SetFont(). Этот метод можно вызывать несколько раз в одном скрипте, в то время как добавление AddFont() делается один раз для каждого шрифта. Формат записи SetFont() следующий:

SetFont(string family [, string style [, float size]])

Как видите, у функции SetFont() три параметра: название шрифта, стиль (пустая строка — обычный шрифт, B — жирный, I — курсив, U — подчеркнутый ) и размер. Этот метод может быть вызван до создания первой страницы и заданный шрифт будет сохраняться от страницы к странице. Если нужно изменить только размер шрифта, проще будет вызвать метод SetFontSize().

Используя функцию SetTextColor(), устанавливаем цвет шрифта документа. Цвет может быть представлен в RGB или grey scale. В нашем примере мы используем RGB-значения.

Необходимо заметить, что документ сначала создается в буфере и лишь потом, при вызове метода Output(), выводится в браузер. Поэтому общая схема работы с документом следующая: создаем в буфере документ методом Open(), затем добавляем в этот документ страничку методом AddPage(), формируем содержимое документа различными методами типа Cell(), Write(), Image() и, наконец, выводим его из буфера в браузер.

Метод Cell() выводит ячейку (прямоугольная область) с заданными границами, цветом фона и строкой. Верхний левый угол ячейки соответствует текущей позиции. Текст может быть выровнен. После вызова этого метода текущая позиция перемещается вправо или на следующую строку. Возможно задать ссылку на текст.

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

Метод Write() выводит текст от текущей позиции. При достижении правой границы (или встрече символа \n) строка обрывается и текст продолжает выводиться с левого края. После выполнения текущая позиция остается в конце текста. В текст можно добавлять ссылки.

Write(float h, string txt [, mixed link])

Метод Image() выводит изображение на страницу. Поддерживаемые форматы: JPEG и PNG. Должен быть задан верхний левый угол. Размеры могут быть заданы разными вариантами:

  • прямое задание ширины и высоты изображения (выраженные в единицах, заданных пользователем);
  • один размер задается, а другой будет вычислен автоматически с сохранением пропорций оригинала;
  • ни один размер не задается, в этом случае изображение будет выведено с разрешением 72 dpi.
Image(string file, float x, float y [, float w [, float h [, string type [, mixed link]]]])

Метод Ln() выполняет разрыв строки. Текущая абсцисса возвращается к левому краю страницы, а ордината увеличивается на величину, указанную в параметре.

Ln([float h])

Meтод Output() выводит документ в строку, локальный файл или в браузер. Если нужно, то сначала будет вызван метод Close() для закрытия документа.

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

Результат работы скрипта можно посмотреть здесь, а скачать исходные коды здесь.

Поиск: PDF • PHP • Web-разработка

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.