Создание PDF средствами PHP
18.12.2011
Теги: PHP • Web-разработка
Класс 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
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]])
Результат работы скрипта можно посмотреть здесь, а скачать исходные коды здесь.
- Блог на Laravel 7, часть 17. Временная зона для пользователей, деплой на хостинг TimeWeb
- Блог на Laravel 7, часть 16. Роль нового пользователя, сообщение админу о новом посте
- Блог на Laravel 7, часть 15. Восстановление постов, slug для категории, поста и страницы
- Блог на Laravel 7, часть 14. Валидация данных и права доступа при загрузке изображений
- Блог на Laravel 7, часть 13. Загрузка и ресайз изображений для категорий и постов блога
- Блог на Laravel 7, часть 12. Доп.страницы сайта в панели управления и в публичной части
- Блог на Laravel 7, часть 11. Панель управления — назначение ролей и прав для пользователей
Поиск: PDF • PHP • Web-разработка