Php как сделать pdf файл

Обновлено: 02.07.2024

Основная проблема при использовании класса — файлы кириллических шрифтов. Возьмем в папке 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):

Запустив скрипт 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:

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

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

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

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

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

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

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

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

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

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

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

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

  • прямое задание ширины и высоты изображения (выраженные в единицах, заданных пользователем);
  • один размер задается, а другой будет вычислен автоматически с сохранением пропорций оригинала;
  • ни один размер не задается, в этом случае изображение будет выведено с разрешением 72 dpi.

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

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

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

В данном уроке показано, как использовать бесплатную библиотеку FPDF для генерации PDF документа из PHP скрипта.

Формат PDF может быть очень удобным средством для распространения документов среди посетителей вашего сайта. Документ PDF является самодостаточным, выглядит одинаково в любой программе для просмотра PDF файлов, и его легко распечатать. Такой формат очень часто используется для отчетов, руководств, счетов, описаний продуктов и так далее.

Удобно иметь возможность создавать PDF документ из скрипта PHP. Например, вы можете сделать пользовательский отчет в формате PDF на основе установок посетителя и включить в него актуальные данные.

В данном уроке мы создадим прекрасный 2-х страничный документ PDF с помощью PHP. Мы будем использовать библиотеку FPDF.

Вот что должно в конечном итоге получиться:

PDF документ
PDF документ

Установка 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 браузеру

Для этого используется метод FPDF Output() . Он принимает два аргумента: предполагаемое имя для PDF файла и флаг назначения. Данный флаг может принимать следующие значения:

I : Выводить PDF на экран, если такая функция поддерживается браузером, иначе загружать.

D : Загружать PDF.

F : Сохранять файл в папке на сервере.

S : Возвращать данные PDF как строку.

Для нашего примера используется опция I для вывода PDF на экран, если возможно:

Output() автоматически посылает заголовок HTTP "Content-type: application/pdf" , который сигнализирует браузеру о том, что следует ожидать документ PDF.

Для создания PDF документа нужен только PHP и FPDF.

Заключение

В данном уроке вы узнали как использовать PHP с библиотекой FPDF для генерации отчета в формате PDF. Были продемонстрированы методы библиотеки FPDF для создания текста, таблиц и графиков.

Однако библиотека FPDF может много чего еще, например, создавать верхний и нижний колонтитулы для страниц, использовать автоматический переход на новую страницу и так далее. Просмотрите документацию по библиотеке на сайте FPDF.

5 последних уроков рубрики "PHP"

Фильтрация данных с помощью zend-filter

Когда речь идёт о безопасности веб-сайта, то фраза "фильтруйте всё, экранируйте всё" всегда будет актуальна. Сегодня поговорим о фильтрации данных.

Контекстное экранирование с помощью zend-escaper

Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

Подключение Zend модулей к Expressive

Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

Совет: отправка информации в Google Analytics через API

Подборка PHP песочниц

Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

PDF-файлы вполне могут быть лучшим форматом для распространения документов в Интернете. В сегодняшнем учебнике я покажу вам, как вы можете создавать PDF-файлы с помощью PHP. Давай сделаем это!

Начнем

Существует несколько методов, которые вы можете использовать для создания PDF-файлов с помощью PHP. Вы можете использовать библиотеку PDFlib, но это довольно дорого, по крайней мере, для коммерческой работы. Сегодня мы будем работать с библиотекой FPDF, которая бесплатна как для личного, так и для коммерческого использования, и совсем не сложная в работе.

Для начала перейдите на сайт FPDF и нажмите загрузки слева. Под всеми руководствами получите zip-архив версии 1.6 (хотя с момента последнего обновления прошло некоторое время, форумы на сайте все еще довольно активны). Разархивируйте файлы; все, что вам нужно из этой папки, это файл fpdf.php и каталог шрифтов.

Давайте сделаем например «Hello, World!». чтобы ускорить процесс. Конечно, первое, что вам нужно сделать, - подключить библиотеку; затем мы создаем новый экземпляр класса FPDF.

hello_world.php

Обратите внимание, что мы передали три значения конструктору FPDF; первое - ориентация нашей страницы; в нашем случае это портрет (вы также можете сделать «L'andscape»). Следующий параметр - тип единиц, который мы хотим использовать; мы выбираем точки, потому что это то, что будут измерять шрифты; мы могли бы выбрать mm, cm или in. Наконец, у нас есть формат бумаги, который мы, очевидно, обозначили буквой; мы могли бы установить его Legal, A3, A4 или A5. Все три из этих параметров являются опциональными, их значения по умолчанию ('P', 'mm', 'A4') .

Прежде чем мы начнем добавлять текст к вашему документу, нам нужно сделать две вещи: 1) добавить страницу в pdf и 2) установить шрифт.

Вы также можете использовать AddPage всякий раз, когда хотите вставить разрыв страницы; сначала мы устанавливаем тип шрифта; это может быть один из встроенных семейств шрифтов (Courier, Helvetica/Arial, Times, Symbol или ZapfDingbats) или любой добавленный с помощью метода AddFont . Далее следует формат шрифта; мы установили наш как обычный, но мы могли бы сделать «B'old», «Italic», «U'nderline» или любую комбинацию из них («BUI»). Наконец, мы устанавливаем размер шрифта в точках.

Теперь мы готовы добавить текст. Весь текст, который вы пишете в PDF-файле, будет записан в ячейки.

Так что же это делает? Первый параметр - ширина ячейки; вторая - высота. Конечно, третий - это текст для ячейки. Есть еще немало других параметров, но сначала посмотрим, как это выглядит. Чтобы закончить PDF, давайте используем метод output.

Мы могли бы передать этому методу два параметра, но на данный момент мы их просто оставим. Теперь, когда это произойдет, PDF-файл будет отображаться при посещении страницы. Итак, давайте сделаем это прямо сейчас! Вот что я получаю:





Отличная работа! Вы создали свой первый PDF-файл. Вернемся к строке, которая создала текстовую ячейку и внесем изменения:

Мы добавили четвертый параметр; это граница. В нашем случае мы поставили границу вокруг. Вы можете сделать частичную границу со строкой: «LB» добавит границы слева и внизу; «TLBR» - это то же самое, что и 1.

Если вы перезагрузите страницу сейчас и обнаружите, что ничего не произошло, просто добавьте случайную строку запроса в URL-адрес, чтобы принудительно обновить содержимое.

В скором времени мы создадим небольшой скрипт для создания новых файлов, но давайте посмотрим, как сначала установить несколько дополнительных параметров.

Полный скринкаст


SetFillColor / SetTextColor

Вы можете заполнять текстовые ячейки цветом фона; мы увидим, как это сделать в нашем приложении, но сначала вы должны установить цвет заливки. Просто передайте этой функции значения красного, зеленого и синего (от 0 до 255). Вы можете установить цвет текста таким же образом.

Если вы хотите установить все три цвета в одно и то же значение, просто используйте один параметр.

SetLineWidth

При рисовании границы на ячейках нетрудно настроить ширину границы. Просто назовите этот метод, передав число с плавающей точкой; помните, что вы установили единицы измерения, когда вы создали экземпляр FPDF. Когда вы начинаете, границы имеют ширину 0,2 мм.

SetAuthor / SetTitle / SetSubject / SetCreator / SetKeywords

Эти методы предназначены для установки свойств PDF, метаданных. Каждый из них берет строку с соответствующим контентом. Они также могут взять необязательное логическое значение, которое определяет кодировку: true - это UTF-8, а false - ISO-8859-1.

SetMargins / SetTopMargin / SetLeftMargin / SetRightMargin

По умолчанию поля вашей страницы составляют 1 см. Вы можете установить верхнее, левое и правое поля отдельно с их соответствующими функциями или установить их все сразу.

Но как насчет нижней границы? Я рад, что вы спросили, о чем позаботилась другая функция.

SetAutoPageBreak

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

Создание чека

Прежде всего, небольшая оболочка HTML:

Вы можете видеть, что мы создали форму, которая будет отправляться в файл create_reciept.php , который мы сделаем в ближайшее время. Давайте добавим набор полей и заполним его элементом для личной информации нашего клиента.

index.html

Обратите внимание на две вещи: мы увидим стиль для .col , когда мы перейдем к CSS; это позволит нам упорядочить эти поля в двух столбцах. Во-вторых, я дал все значения инпутам, просто чтобы сэкономить потом время.

Мы добавим еще один набор полей для продуктов, которые покупает пользователь:

Я думаю, что информация, которую мы показываем здесь, подходит для таблицы, так что это то, что мы используем. Кроме того, я поставил набор квадратных скобок в конце имен инпутов; обратите внимание, что у нас есть набор инпутом с именем product[] и набор с именем price[] . Они будут размещены как массивы.

Конечно, наша форма заканчивается кнопкой отправки.

Теперь мы можем перейти к CSS. Мы не будем подробно останавливаться на этом, но здесь совсем не сложно. Вы можете поместить его в style.css , который мы используем в HTML.

style.css

Как вы можете видеть, мы придаем большинству элементов некоторый минималистский стиль. Вот как выглядит наша форма:





Таким образом, когда ваш клиент заполняет форму и нажимает кнопку отправки, данные формы будут отправлены на файл create_receipt.php . Итак, давайте создадим файл прямо сейчас!

Генератор чеков

Сейчас мы снова вернулись к PHP. Прежде всего: подключить библиотеку:

Затем вместо создания экземпляра класса FPDF мы собираемся наследовать его на собственный класс. Это позволит нам сделать некоторые изящные вещи. Смотрите внимательно сейчас:

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

Теперь мы подключаемся к двум специальным функциям: Верхний и нижний колонтитулы.

Эта функция будет вызываться в начале каждой страницы нашего PDF-файла. Сначала мы устанавливаем шрифт, цвет заливки и цвет текста. Затем мы выводим нашу ячейку. Обратите внимание, что мы установили ширину в 0. Это специальное значение; ячейка будет занимать все пространство справа от начальной точки (пока она не встретится с правым краем). Поскольку мы начинаем с левого поля, мы получим ячейку по всей ширине страницы (минус поля).

Теперь для функции нижнего колонтитула:

Опять же, мы начинаем с установки цвета шрифта и текста; мы не можем быть уверены в том, какими будут эти значения, когда мы перейдем к заголовку, поэтому мы поставим их для уверенности. Затем мы устанавливаем координаты X и Y. Это устанавливает верхнюю левую угловую позицию нашей следующей ячейки. Мы устанавливаем X равным 0, просто чтобы убедиться, что находимся в начале строки. Устанавливаем Y в -60; отрицательное число относится к нижней части страницы, поэтому это устанавливает наш курсор на 60 пикселей выше нижней границы страницы.

Затем мы создаем ячейку; опять же, мы используем трюк 0-ширины; мы установили высоту 20pts. Мы устанавливаем текст, придаем ему верхнюю границу и центрируем. Готово!

Мы снова вернемся к нашему классу, но пока давайте начнем создавать квитанцию. Создав экземпляр нашего класса, добавив страницу и установив шрифт, мы можем перейти к делу.

Первое, что мы сделаем, это перемещаем наш курсор; мы можем сделать это, используя метод SetY .

Это не перенесет нас вниз на 100 точек; это устанавливает 100 точек от верхней части страницы. Это не включает поля, поэтому мы на 30 пунктов ниже от нашего заголовка.

Начнем с создания ячейки шириной 100pt и 13pt с текстом «Ordered By». Затем мы удаляем шрифт, чтобы удалить полужирный шрифт. Затем мы создаем другую ячейку и передаем ей имя, которое мы получили от нашей формы. Конечно, в реальном проекте вы будете проверять эти значения перед их использованием.

Двигаясь дальше, мы добавим дату покупки:

Опять же, мы устанавливаем шрифт жирным шрифтом; после записи «Дата» мы удаляем полужирный шрифт и печатаем текущую дату, используя функцию date PHP. Указанный формат даст нам название месяца, число дней, за которым следует запятая, и четырехзначный год. Мы помещаем границу как 0 (по умолчанию), чтобы мы могли перейти к параметру линии. Мы устанавливаем его как 1, что поместит нашу позицию в начало следующей строки; это эквивалент использованию «enter» в текстовом процессоре.

Функция SetX выполняет ту же функцию, что и функция SetY , за исключением того, что она передвигает нас справа. Мы ставим нашу позицию на 100 пунктов справа от левого края. Затем мы выделяем курсив и начинаем выводить адрес. Все три строки адреса имеют ширину 200pt и высоту 15 футов. Важно отметить, что наш параметр линии равен 2. Это означает, что после каждой ячейки мы перейдем к следующей строке и «вкладке», чтобы соответствовать предыдущей ячейке. Наконец, мы вызываем метод Ln , который добавляет разрыв строки. Без параметра он будет перемещать нашу позицию вниз по высоте последней отпечатанной ячейки. Мы передали ему параметр, поэтому мы движемся вниз на 100 точек.

Вот как это выглядит сейчас:

image: adress / date

Теперь давайте распечатаем таблицу продуктов, приобретенных нашим клиентом.

Мы передали их в двух массивах, которые мы получили из нашего HTML-файла. Но откуда этот метод PriceTable ? Мы собираемся сделать это прямо сейчас, в рамках нашего класса PDF_receipt . Это еще одно преимущество расширения класса: мы можем уместить потенциально трудоемкую функциональность в методе.

Вот функция. Начнем с установки шрифта, цвета текста, цвета заливки и ширины линии. Затем мы настраиваем ячейки заголовка. Каждая из них имеет границу слева, сверху и справа, текст по центру и заполнение.

Затем мы удалим «bold» с шрифта и сбросим цвет заливки и ширину линии. Мы также создаем переменную $fill , заданную как false. Мы будем использовать это, чтобы добавить чередование зебры к нашей таблице.

Цикл for-loop проходит через массив продуктов и цен (они должны иметь одинаковое количество элементов, основанное на таблице в нашем HTML-файле). Мы создаем ячейку для каждой записи, помещая имя продукта под заголовком «Описание элемента» и ценой в заголовке «Цена». У них обоих есть граница. Продукт выравнивается по левому краю, цена выравнивается по правому краю. Наконец, они оба используют $fill , который в настоящее время содержит false. После каждой строки мы переключаем значение $fill на противоположное логическое значение, поэтому в следующей строке будет серый фон.

После того, как мы выведем все покупки, мы хотим отобразить общую цену. Мы удалим наш курсор на 367pt с левого края страницы. Затем мы создаем ячейку «Total», и, наконец, мы используем функцию php array_sum для добавления всех цен в $price . И это цена таблицы!

Возвращаясь к тексту нашего PDF-документа, мы теперь пропустим 50 точек.

До сих пор мы использовали функцию Cell для печати на нашей странице. Есть еще два метода, которые мы можем использовать: MultiCell и Write . Обе эти функции предназначены для строк текста, которые слишком длинные для одной ячейки полной ширины. Давайте сначала рассмотрим MultiCell .

MultiCell довольно похож на Cell , за исключением того, что когда он достигает ширины, указанной вами для ячейки, она создаст еще одну под ней и продолжит вывод. Он также сделает разрыв, когда достигнет "\n". Из-за этого ему не нужен параметр свойства линии. Он также не имеет параметра ссылки в отличие от Cell . Что? Мы еще не упоминали параметр ссылки? Итак, Cell может принять еще один параметр после параметра fill: это либо строка ссылки, либо объект ссылки, указывающий на другое место в PDF, созданное с помощью функции AddLink .

Текст не слишком важен, но слишком длинный для одной линии; плюс, в нем есть несколько разрывов строк. Хотя мы не используем их здесь, MultiCell также принимает параметры границ, выравнивания и заполнения.

Метод Write принимает только три параметра: высоту, текст и необязательную ссылку. Нет параметра ширины, потому что он перейдет на правый край, прежде чем будет разрыв линии. Хотя это не лучшее его использование, мы будем использовать его для добавления ссылки:

Обратите внимание, что перед записью мы устанавливаем цвет шрифта и текста, чтобы он выглядел как ссылка.

На этом с PHP все. Давайте добавим еще одну функцию: мы отправим нашу форму с помощью Ajax. Перед тем, как вернуться к index.html, внесите эти изменения для вызова Output :

Первый параметр - это имя нашего файла; второй - это то, что мы хотим сделать с файлом, в этом случае сохраним его на сервере. Вы также можете принудительно загрузить с помощью «D», вернуть его как строку с «S». Значение по умолчанию, выводимое в браузер, - «I» (для встроенного).

Вернемся в HTML, давайте импортируем jQuery и добавим наш обработчик клика в кнопку отправки:

Когда кнопка нажата, мы отправим форму. При успешном возврате мы прячем второй div, очищаем его содержимое и перезагружаем его с помощью функции HTML. У этого нового HTML есть ссылка для получения чека. Затем мы снова отображаем div. Не забудьте вернуть false, чтобы форма не отправлялась сама.

Вот что мы получаем





И вот наш готовый PDF.





И это все, ребята! Используйте комментарии для замечаний или предложений!

Файлы PDF довольно широко используются для представления электронных документов в различных системах. Данный формат файлов весьма стал популярным в виду его независимости от операционных систем. Документ при необходимости можно распечатать, либо передать по почте другому человеку. В PDF формате в интернете можно найти учебники, различные мануалы, а также другие материалы в электронном виде. Кроме того, различные сервисы которым необходимо выдавать различного рода документы своим пользователям, могут генерировать PDF-документы в режиме реального времени. В общем и целом, использование PDF может покрыть потребность выдачи различного рода документов в сети.

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

Разместить файлы библиотеки следует в рабочей директории проекта. Расположена библиотека может в разных директориях, в этом случае следует задать местоположение посредством переменной PHP library path. Давайте рассмотрим пример вывода строки «Hello world» в PDF файл. Для этого следует создать PHP файл, и прописать в нём следующее.

В результате будет создан PDF-документ следующего вида:


В самом начале мы задали константу FPDF_FONTPATH, эта константа указывает папку в которой находятся шрифты, используемые для генерации документа. Затем подключается сам файл библиотеки fpdf.php. После подключения файла библиотеки создаётся экземпляр класса FPDF(), далее вся работа происходит с объектом этого класса. Метод SetFont() устанавливает параметры шрифта для текста. Метод AddPage() указывает на создание новой страницы в PDF-документе. Добавить текст в документ можно посредством добавления ячейки. Добавляется ячейка посредством метода Cell(), для которой задаются размеры, а так же их содержимое. Ячеек в самом деле может быть целое множество, с их помощью можно формировать структуру документа. Непосредственное формирование документа выполняется через метод Output(). Как вы уже заметили, все названия методов интуитивно понятные.

Формирование таблицы в FPDF

Пример указанный выше довольно простой, и для лучшего понимания стоит сделать уже что-то по сложнее. Давайте выведем некоторые динамические данные в цикле, и сформируем таблицу в PDF-документе. Этот пример показывает работу с библиотекой, в случае с некоторыми динамическими данными. Для начала сделаем вывод заголовков таблицы. В связи с тем, что в PDF файлах нет табличной структуры как в HTML, построение табличных данных там происходит посредством набора ячеек, каждая из которых получает параметры ширины, шрифта, фоновой заливки, и цвета рамки.


В результате был сформирован PDF-документ такого вида:

Первое, на что стоит обратить внимание в данном примере, это файл data-result.php который подключается после библиотеки FPDF. В данном файле формируется массив данных, который мы в дальнейшем будем использовать для генерации документа. Далее объявляется класс PDF, который является наследником класса FPDF. Класс содержит метод EventTable($event), в качестве входного параметра получает массив с данными. Метод создаёт строку в документе, с набором ячеек, с установленными параметрами шрифтов, и т.д. Вызывается метод в цикле, в котором передаются данные из функции getResult(). Функция getResult() возвращает массив, по сути, вместо функции может быть и обычная переменная с массивом данных.

По аналогии с формированием заголовков таблицы, можно заполнить таблицу уже готовыми данными. Для заполнения таблицы мы допишем код таким образом:


Результат формирования таблицы в PDF:

Как вы можете заметить, в дополнения к выводу заголовков таблицы в методе EventTable() появился цикл foreach, который дополнительно выводит данные по результатам «матчей». Для наглядности каждая стока таблицы меняет цвет, сделано это посредством переменной $fill. Жирным курсивом выделены названия команд победителей. Так же происходит смена шрифтов.

Добавление изображения в FPDF

Добавляется изображения в документ довольно просто. Сделать это можно посредством метода Image().

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

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

В этой статье мы покажем 5 наиболее впечатляющих библиотек для создания PDF-файлов, которые помогут вам в достижении этих сложных и расширенных PDF-файлов.

Эта вершина основана на различных аспектах, таких как простота их реализации, варианты использования, пользователи библиотеки, функции и состояние разработки.

5. FPDF

У FPDF есть и другие преимущества: функции высокого уровня, основными его функциями являются:

  • Выбор единицы измерения, формата страницы и полей.
  • Управление колонтитулами и страницами.
  • Автоматический разрыв страницы.
  • Автоматический разрыв строки и выравнивание текста.
  • Поддержка изображений (JPEG, PNG и GIF).
  • Цвета.
  • Ссылки.
  • TrueType, Type1 и поддержка кодировки.
  • Сжатие страниц.

FPDF не требует расширения (кроме Zlib для включения сжатия и GD для поддержки GIF). Последняя версия требует как минимум PHP 5.1.

В следующем фрагменте показан базовый PDF-файл, созданный с помощью FPDF:

4. МПДФ

В следующем фрагменте показан базовый файл PDF после установки композитора с помощью mPDF:

3. DOMPDF

Характеристики

Требования

  • PHP версии 5.3.0 или выше
  • Расширение DOM
  • Расширение GD
  • Расширение MBString
  • PHP-купели Пб
  • PHP-SVG Пб

рекомендации

  • OPcache (OPcache, XCache, APC и т. Д.): Повышает производительность
  • Расширение IMagick или GMagick: улучшает производительность обработки изображений

В следующем фрагменте показано, как создать простой PDF-файл и создать прямую загрузку с помощью Dompdf:

2. Снаппи (wkhtmltopdf)

Вы даже можете загрузить дистрибутив wkhtmltopdf как зависимость от композитора и динамически ссылаться на двоичный файл в своем проекте.

В следующем фрагменте показан базовый PDF-файл из HTML с использованием wkhtmltopdf в Windows с домашней страницей Github:

1. TCPDF

Эта библиотека поддерживает шрифты Unicode и активно поддерживается Никола Асуни в хранилище Github.

Следующий пример, как отобразить HTML как PDF с TCPDF:

TCPDF в первую очередь, почему? Теоретически, первое место должно занимать wkhtmltopdf, так как он использует webkit для визуализации вашего HTML и, вероятно, будет более полезным для визуализации таких вещей, как canvas, SVG и т. Д. Однако вы должны знать, что не каждый разработчик может включить двоичные файлы (приложение или исполняемые файлы) на своих проектах или наслаждайтесь привилегиями делать с сервером все, что он хочет, именно тогда TCPDF становится первым вариантом для большинства разработчиков.

TCPDF стоит на первом месте, так как он наиболее прост в использовании библиотеки PHP для создания PDF-файлов и, тем не менее, является наиболее полным и обширным, поскольку не требует исполняемых файлов, поскольку все работает с простым PHP. Он охватывает основные требования всех проектов, для которых требуется функция создания PDF.

Если вам известна еще одна замечательная PHP-библиотека для создания PDF, поделитесь ею с сообществом в поле для комментариев внизу, получайте удовольствие!

Читайте также: