Архив за Декабрь 2008

Создание PDF средствами PHP. Часть 3

Необходимо заметить, что документ сначала создается в буфере и лишь потом, при вызове метода 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. Часть 2

А теперь попробуем создать 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->AddPage();
// Задаем режим отображения
$pdf->SetDisplayMode('real','default');
// Устанавливаем шрифт и его размер
$pdf-> SetFont('Arial-BoldMT','',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('elephpant.jpg',10,35,0,0,'JPG','http://www.php.net/');
// Устанавливаем шрифт для текста
$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-значения.

Продолжение следует…

Создание PDF средствами PHP. Часть 1

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

Основная проблема при использовании класса — файлы кириллических шрифтов. Одним из основных форматов шрифтов является TTF (True Type Font). Но для правильной работы FPDF необходим и еще один формат — AFM (файл метрики шрифта). В этом нам поможет утилита ttf2pt1, которая позволяет создать файл метрики для True Type.

Запускаем утилиту из командной строки (Пуск->Выполнить->cmd):

C:\ttf2pt1 -A C:\fonts\arial.ttf arial

где ключ -A указывает на необходимость сформировать файл AFM, C:\fonts\arial.ttf — адрес файла True Type шрифта и, наконец, arial — это имя файла метрики.

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

<?php
require('font/makefont/makefont.php');
MakeFont('arial.ttf','arial.afm','cp1251');
MakeFont('arialbd.ttf','arialbd.afm','cp1251');
MakeFont('ariali.ttf','ariali.afm','cp1251');
MakeFont('arialbi.ttf','arialbi.afm','cp1251');
?>

Функция MakeFont имеет следующий формат:

MakeFont(string fontfile, string afmfile [, string enc [, array patch [, string type]]])

где fontfile — путь к TTF или PFB файлу, afmfile — путь к AFM файлу, enc — имя используемой кодировки (по умолчанию это cp1252), patch — опциональное изменение кодировки и type — тип шрифта (по умолчанию True Type).

Запустив скрипт mf.php в браузере, получим файлы arial.php, arialbd.php, ariali.php, arialbi.php и arial.z, arialbd.z, ariali.z, arialbi.z. Все эти файлы вместе с файлами arial.ttf, arialbd.ttf, ariali.ttf, arialbi.ttf надо поместить в директорию font класса. Впрочем, можно самому указать директорию, которая будет хранить шрифты. Для этого нужно определить константу FPDF_FONTPATH:

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

Продолжение следует…