Создаем документ PDF из PHP скрипта с помощью библиотеки FPDF
В данном уроке показано, как использовать бесплатную библиотеку FPDF для генерации PDF документа из PHP скрипта.
Формат PDF может быть очень удобным средством для распространения документов среди посетителей вашего сайта. Документ PDF является самодостаточным, выглядит одинаково в любой программе для просмотра PDF файлов, и его легко распечатать. Такой формат очень часто используется для отчетов, руководств, счетов, описаний продуктов и так далее.
Удобно иметь возможность создавать PDF документ из скрипта PHP. Например, вы можете сделать пользовательский отчет в формате PDF на основе установок посетителя и включить в него актуальные данные.
В данном уроке мы создадим прекрасный 2-х страничный документ PDF с помощью PHP. Мы будем использовать библиотеку FPDF.
Вот что должно в конечном итоге получиться:
Установка FPDFДля использования FPDF нужно установить его на сайт. Скачайте архив FPDF и распакуйте его в папку fpdf , которую надо создать в папке вашего сайта.
Начинаем писать скрипт PHPТеперь у вас есть установленный FPDF и можно начать писать скрипт PHP для генерации отчета в формате PDF. Создаем файл report.php в той же папке, где вы создали папку fpdf и открываем его в текстовом редакторе.
Первое, что нужно сделать - включить библиотеку FPDF. Библиотека называется fpdf.php и располагается в папке fpdf :
Теперь добавим несколько переменных для конфигурации:
Данные переменные позволяют настраивать ваш отчет, и лучше всего их оставить в начале файла, чтобы быстро находить ключевые свойства для изменения конфигурации. С их помощью настраиваются:
- Различные цвета, которые используются в отчете. Каждый цвет задается как массив из трех элементов, который содержит значения для красного, зеленого и голубого цветов (в диапазоне 0-255).
- Заголовок отчета ("2009 Widget Sales Report") и его положение.
- URL и размеры изображения логотипа компании. Данное изображение используется на титульной странице отчета.
- Метки строк и столбцов для данных отчета. Используются при выводе таблицы и диаграммы в отчете.
- Конфигурация для графика. Включает положение графика, размеры, метки на осях, значения шага, которое используется для шкалы по оси Y.
- Цвета, которые используются для столбцов графика. Также как и для других цветов, они задаются массивами из трех элементов. В отчете используется 4 цвета для столбцов графика: по одному для каждого столбика.
- Данные для отчета. Это двумерный массив, который содержит 4 строки, по одной для каждого вида продукта.
Теперь можно приступить к построению PDF. Сначала создаем титульную страницу отчета. Оно содержит логотип компании и название отчета, расположенные по центру страницы.
Создаем объект FPDFСначала нужно создать новый объект FPDF, который будет содержать данные PDF. Конструктор FPDF принимает 3 аргумента:
- Ориентация страницы. Используйте 'P' для книжной ориентации страницы, или 'L' для альбомного расположения листа. По умолчанию используется 'P' .
- Единицы, которые используются для измерений на странице. Используйте 'pt' , 'mm' , 'cm' , или 'in' . По умолчанию используется 'mm' .
- Формат страницы. Возможные значения: 'A3' , 'A4' , 'A5' , 'Letter' , и 'Legal' . Или вы можете задать пользовательские значения для ширины и высоты в двумерном массиве. По умолчанию используется 'A4' .
Например, устанавливаем книжную ориентацию страницы, миллиметры в качестве единиц измерения и формат A4:
Устанавливаем цвет текстаТеперь установим цвет текста на странице. Делаем это с помощью метода FPDF SetTextColor() , передавая ему значения для красного, зеленого и синего цветов (каждое значение лежит в диапазоне 0-255). Используем значения цветов в массиве $textColour, который был создан в разделе конфигурации:
Создаем страницуТеперь мы готовы создать новую пустую страницу в документе PDF с помощью вызова метода FPDF AddPage() :
Добавляем изображение логотипаFPDF позволяет просто вставлять изображения на страницу. Нужно вызвать метод Image() со следующими аргументами:
- Путь к файлу с изображением. Это может быть абсолютный путь, или относительный к скрипту PHP script. Также можно использовать URL.
- Положение X и Y левого верхнего угла изображения на странице документа PDF. Если опустить данные аргументы, то будет использована текущая позиция.
- Ширина и высота изображения в документе PDF. Если опустить оба значения, то будут использовать оригинальные размеры изображения (при 72 DPI). Если опустить одно значение, то другое будет вычисляться автоматически.
- Тип изображения. Допустимые значения включают: ' JPEG' , 'PNG' и 'GIF' (в верхнем или нижнем регистре при написании). Если опустить данное значение, то FPDF будет распознавать формат по расширению имени файла.
- URL ссылки для изображения. Указывается опционально - если указан URL, то изображение становится ссылкой, которая воспринимает нажатия кнопки мыши.
Все величины, такие позиция X и Y, высота и ширина, используют единицы измерения, указанные при создании документа PDF (в данном случае миллиметры).
Вы можете создать ваше собственное изображение логотипа (нужно использовать разрешение 300 DPI) или использовать изображение из исходников. Сохраните изображение в той же папке, что и скрипт PHP, а затеем вставьте изображение в документ PDF с помощью следующей команды:
Устанавливаем шрифтFPDF позволяет установить шрифт, стиль и размер для текста в документе PDF. Для этого используется метод SetFont() со следующими аргументами:
- Семейство шрифтов. Вы можете использовать следующие стандартные имена для семейств шрифтов: 'Courier' , 'Helvetica' , 'Arial' , 'Times' , 'Symbol' , или 'ZapfDingbats' .
- Стиль шрифта. Можно использовать: '' (обычный), 'B' (полужирный), 'I' (курсив), и 'U' (подчеркнутый). Можно использовать комбинации опций — например, 'BU' для полужирного подчеркнутого текста.
- Размер шрифта. Указывается в пунктах (по умолчанию используется значение 12 пунктов).
Для названия отчета на титульной странице используем шрифт Arial Bold размером 24 пункта:
Можно импортировать любой шрифт TrueType или Type 1 с помощью метода AddFont() . Для более подробных сведений надо почитать руководство по FPDF .
Добавляем текстТеперь можно добавить название отчета. Объект FPDF использует концепцию "текущая позиция", куда вставляется следующая часть текста или другой элемент. Так как нужно, чтобы название отчета располагалось в середине страницы, необходимо передвинуть текущую позицию вниз к данной точке, которая располагается на расстоянии 160мм от верха страницы (значение хранится в конфигурационной переменной $reportNameYPos ). Для этого используется метод FPDF Ln() , который добавляет перевод строки на указанное расстояние:
Если не указать высоту перевода строки, то будет использоваться высота последней выведенной ячейки.
Теперь добавим название отчета. Существует несколько различных способов добавить текст с помощью FPDF. В нашем случае используем метод Cell() , который, помимо всего прочего, позволяет легко центрировать текст.
Cell() принимает следующие аргументы (все являются опциональными):
- Высота и ширина ячейки. По умолчанию ширина растягивается до правого поля, а высота устанавливается в 0.
- Строка текста для вывода. По умолчанию '' .
- Указание для отображения рамки вокруг ячейки. Это может быть либо число ( 0 =нет рамки, 1 =рисуем рамку), или строка с одним или несколькими параметрами из следующего списка: 'L' (слева), 'T' (сверху), 'R' (справа), и 'B' (внизу). Значение по умолчанию: 0 .
- Куда помещать текущую позицию после вывода ячейки. Значение может быть 0 (справа от ячейки), 1 (начало следующей строки), или 2 (ниже). Значение по умолчанию: 0 .
- Выравнивание текста. Возможные значения: 'L' (выравнивание по левому краю), 'C' (выравнивание по центру), или 'R' (выравнивание по правому краю). Значение по умолчанию: 'L' .
- Нужно ли заливать фон ячейки цветом. true = заливаем цветом, false = оставляем фон прозрачным. Значение по умолчанию: false .
- URL ссылки. Если задан, то ячейка с текстом становится рабочей ссылкой на другой ресурс.
Теперь с помощью метода Cell() вставим название отчета и выровняем его по центру:
Создаем колонтитул страницы и вводный текстИтак, титульная страница готова. Теперь надо создать страницу, на которой есть колонтитул, заголовок и некоторый вводный текст, за которым следует таблица и график.
Сделаем колонтитул страницы. Добавим новую страницу, затем выведем текст колонтитула, который содержит название отчета, выровнен по центру страницы и использует шрифт Arial размером 17. Используем переменную конфигурации $headerColour для установки цвета текста:
Теперь перейдем к тексту. Сначала выведем заголовок в обычном цвете и шрифтом Arial размером 20. Так как нам не нужно центрировать текст, можно использовать простой метод Write() , передав ему высоту строки и текст для вывода (в качестве опции можно также передать адрес URL для формирования ссылки):
Теперь можно вывести текст введения шрифтом Arial размером 12. Здесь есть пропуски 16 мм от первого абзаца и 12 мм между параграфами. Задаем для каждой строки высоту в 6 мм:
Метод Write() автоматически переводит текст на следующую строку, когда он достигает правой стороны страницы.
Добавляем данныеТеперь нужно добавить таблицу с данными ниже текста. сначала установим цвет рамки таблицы. Метод SetDrawColor() устанавливает цвет, который используется для рамок и других линий, так что мы можем использовать его для установки цвета для рамок ячеек таблицы. Затем текущую позицию опускаем вниз на 15мм для создания пробела между текстом и таблицей:
Создаем строку заголовков таблицыТаблица имеет строку, которая содержит в ячейках заголовки столбцов "PRODUCT", "Q1, "Q2", "Q3", и "Q4". Ячейка "PRODUCT" использует отличный от других заголовков цвет текста и фона.
Мы уже пользовались методом SetTextColor() для установки цвета текста. Для установки цвета фона надо использовать метод SetFillColor() , который имеет такие же аргументы как SetTextColor() .
Чтобы создать ячейки таблицы используется метод Cell() , которому задаются ширина и высота ячейки, содержание и выравнивание. Также передается 1 в качестве 4-го аргумента для установки рамки, и true в качестве 7-го аргумента для заполнения фона установленным цветом.
Ниже приведен код для создания строки заголовков. Сначала устанавливается полужирный шрифт. Затем создается ячейка "PRODUCT" с соответствующим текстом и фоном. Затем устанавливается цвет для оставшихся 4 ячеек заголовков, и выполняется цикл по элементам массива $columnLabels для вывода ячеек с выравниванием текста в них по центру:
Пробел в начале содержимого ячейки "PRODUCT" помогает сформировать отступ в ячейке таблицы от левой границы. Такой же трюк будет использоваться для наименований продуктов в крайнем левом столбце (к сожалению, пока нет способа контролировать отступ в ячейках с помощью FPDF).
Создаем строки с даннымиОстальная таблица состоит из 4 строк с данными продаж (по одной строке на продукт) для 4-х кварталов. Сначала определим пару переменных:
Переменные служат для:
$fill : Заполнять фон ячейки цветом или нет. Мы будем переключать данное значение после вывода каждой строки для получения эффекта зебры в таблице.
$row : Текущий номер строки. Она позволяет выводить соответствующий номер для каждой строки при перемещении по таблице.
Теперь можно организовать цикл по элементам массива $data с помощью foreach для вывода строк Для каждой строки создаем левую ячейку, которая содержит название продукта, и четыре ячейки с данными. Устанавливаем соответствующие цвета для тескта и фона для каждой ячейки.
Для вывода ячеек данных используется цикл for для прохода по четырех элементному массиву с данными, а для вывода данных в формате с разделением тысяч вызываем функцию PHP number_format() .
После вывода строки увеличиваем переменную $row , переключаем переменную $fill , и используем Ln() для перехода к началу следующей строки.
Вот код всего цикла:
Создаем графикПоследним элементом в нашем отчете является столбиковый график, отображающий сводную информацию по четырем продуктам за весь год.
Вычисление масштаба и ширины столбикаСначала надо вычислить масштаб для осей X и Y. Для масштаба по оси X вычисления заключаются в простом делении количества продуктов на желаемую ширину графика (нужно учесть небольшие отступы слева и справа для лучшего вида):
Для вычисления масштаба по оси Y нужно найти общее значение по каждому продукту и затем определить среди них максимальное значение. Затем максимум можно будет разделить на желаемую высоту графика для получения значения масштаба по оси Y:
Теперь, зная масштаб по оси X, можно вычислить ширину (в мм) каждого столбца графика. Это инверсированное значение масштаба по оси X, уменьшенное в полтора раза для организации расстояния между столбцами:
Добавляем линии осей и метки на нихТеперь можно добавить линии осей X и Y, метки данных и метки осей. Используем шрифт Arial с размером 10 для меток данных.
Для вывода линии в FDPF используется метод Line() , которые принимает четыре аргумента: координаты X и Y начала линии, и координаты X и Y конца линии.
Для оси X выводим горизонтальную линию вдоль низа графика, оставляя 30 мм для меток по оси Y слева. Затем выводим каждое имя продукта в массиве $rowLabels как текстовую ячейку в соответствующую точку:
Метод SetXY() позволяет устанавливать текущую позицию в нужное место на странице.
Для оси Y выводим вертикальную линию слева от графика, оставляя 30 мм для меток данных по оси Y. Линию оси делаем на 8 мм больше желаемой высоты графике для того, чтобы было место для вывода метки оси. Затем организуем цикл от нуля до максимального значения данных $maxTotal , которое было определено ранее. Размер шага установлен в переменной $chartYStep (20,000). На каждом шаге выводим текущее значение выровненной вправо и короткую метку:
Теперь можно добавить метки осей. Используем шрифт Arial полужирный с размером 12. Размещаем метку оси X ниже меток данных, а метку оси Y - наверху оси Y:
Выводим столбцы графикаЗавершающей стадией является создание самого графика. Для вывода столбцов используется метод FPDF Rect() , который выводит прямоугольник. Метод использует следующие аргументы:
- Координаты X и Y верхнего левого угла прямоугольника.
- Ширина и высота прямоугольника.
- Стиль прямоугольника. Может иметь значения 'D' или '' (выводим обводку), 'F' (заполняем текущим цветом фона), или 'DF' / 'FD' (обводка и заполнение).
Теперь выводим столбцы. Установим переменную $xPos , которая служит для отслеживания текущей позиции по X. Зададим ей значение 40 мм с учетом расстояния для меток по оси Y и отступа для первого столбца. Теперь создадим переменную $bar , которая будет содержать номер текущего столбца. Она будет использоваться для установки цвета для столбца:
Теперь проходим циклом по массиву $data , вычисляем суммарное значение для каждой строки и выводим столбец от оси X до этого значения, масштабированного с помощью $yScale . Цвет для каждого столбца изменяется с помощью счетчика $bar , который является индексом в массиве $chartColours . После вывода текущего столбца перемещаем позицию X к началу следующего, увеличиваем счетчик $bar и продолжаем цикл:
В коде используется оператор PHP деление по модулю ( % ) для повтора цвета столбца, если количество столбцов превышает количество элементов в массиве $chartColours .
Отправляем документ PDF браузеруДокумент PDF готов! Осталось только отправить его браузеру, чтобы пользователь мог просмотреть его или загрузить.
Для этого используется метод FPDF Output() . Он принимает два аргумента: предполагаемое имя для PDF файла и флаг назначения. Данный флаг может принимать следующие значения:
I : Выводить PDF на экран, если такая функция поддерживается браузером, иначе загружать.
D : Загружать PDF.
F : Сохранять файл в папке на сервере.
S : Возвращать данные PDF как строку.
Для нашего примера используется опция I для вывода PDF на экран, если возможно:
Output() автоматически посылает заголовок HTTP "Content-type: application/pdf" , который сигнализирует браузеру о том, что следует ожидать документ PDF.
Теперь вы готовы протестировать скрипт. Открывайте браузер и переходите на URL, где расположен скрипт, например , www.example.com/report.php . Вы должны увидеть PDF в окне браузера. Или будет выведено диалоговое окно, в котором вам будет предложено сохранить документ PDF на вашем жестком диске. Вы можете потом открыть PDF файл в программе для просмотра PDF, например, в Acrobat Reader или Preview.
Для создания PDF документа нужен только PHP и FPDF.
ЗаключениеВ данном уроке вы узнали как использовать PHP с библиотекой FPDF для генерации отчета в формате PDF. Были продемонстрированы методы библиотеки FPDF для создания текста, таблиц и графиков.
Однако библиотека FPDF может много чего еще, например, создавать верхний и нижний колонтитулы для страниц, использовать автоматический переход на новую страницу и так далее. Просмотрите документацию по библиотеке на сайте FPDF.
Данный урок подготовлен для вас командой сайта ruseller.com Источник урока: www.elated.com/articles/create-nice-looking-pdfs-php-fpdf/ Перевел: Сергей Фастунов Урок создан: 15 Сентября 2010 Просмотров: 147275 Правила перепечатки
5 последних уроков рубрики "PHP"
Фильтрация данных с помощью zend-filterКогда речь идёт о безопасности веб-сайта, то фраза "фильтруйте всё, экранируйте всё" всегда будет актуальна. Сегодня поговорим о фильтрации данных.
Контекстное экранирование с помощью zend-escaperОбеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
Подключение Zend модулей к ExpressiveExpressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
Совет: отправка информации в Google Analytics через APIПредположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.
Подборка PHP песочницПодборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.