Php создать pdf файл. Функции PDF

  • Перевод

Большинство web-сервисов экспортируют данные в разных форматах для дальнейшего использования. Данная статья о том, как экспортировать данные в pdf-формате.
Хотя многие знают как это делать, я опишу кратко для тех кто не знает.

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

PDFlib
PHP API содержит большое количество функций для работы с PDF, реализованных на базе PDFlib . Несмотря на это, данная библиотека не является бесплатной для коммерческого использования. Бесплатная версия называется PDFlib Lite и бесплатная для персонального использования, однако она ограничена в функциональности. Для того чтобы использовать полную библиотеку PDFlib необходимо купить лицензию.

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

Создание документов PDF
Для того чтобы начать, необходимо скачать код FPDF с сайта FPDF Web site и включить в программу. Например, вот так


Ниже пример использования библиотеки для генерации простого PDF.
Мы создадим новый объект FPDF:

Конструктор FPDF принимает следующие параметры
  • Ориентация страницы (P or L) книжная или альбомная
  • Размерность (pt,mm,cm или in)
  • Размер документа (A3, A4, A5, Letter and Legal)
Далее мы установим некоторые свойства документа
$pdf->SetAuthor("Lana Kovacevic");
$pdf->SetTitle("FPDF tutorial");

Так как в данном примере мы используем одинаковый шрифт для всего документа, мы устанавливаем его до создания страницы
$pdf->SetFont("Helvetica","B",20);
$pdf->SetTextColor(50,60,100);

У функции SetFont 3 параметра; название шрифта, стиль и размер. Мы используем Helvetica, жирный и 20 пунктов, мы будем использовать его для заголовка документа.
Вы можете использовать любой другой шрифт, используя функцию AddFont.
Используя функцию SetTextColor, мы устанавливаем цвет шрифта для всего документа. Цвет может быть представлен в RGB или grey scale. В данном примере мы используем RGB-значения.
Теперь когда главное сделано, приступим к созданию страниц.
$pdf->AddPage("P");
$pdf->SetDisplayMode("real","default");

В функцию AddPage () можно передать параметры «P» или «L» для указания ориентации страницы. Функция SetDisplayMode определяет как будет отображена страница. Вы можете определить параметры увеличения и разметки. В примере мы используем 100% увеличение и разметку по умолчанию, определенную в программе, используемой для просмотра.

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

$pdf->Image("/logo.svg",10,20,33,0," ","http://www.fpdf.org/");

Для того чтобы добавить ссылку воспользуемся следующей командой
$pdf->Link(10, 20, 33,33, "http://www.fpdf.org/");

Сейчас созададим заголовок с рамкой
$pdf->SetXY(50,20);
$pdf->SetDrawColor(50,60,100);
$pdf->Cell(100,10,"FPDF Tutorial",1,0,"C",0);

Функция SetXY устанавливает x и y координаты точки, в которой мы хотим вывести заголовок. SetDrawColor устанавливает цвет границы, используя значения RGB. После этого мы вызываем функцию Cell для вывода прямоугольника с текстом нашего заголовка. Мы передаем в функцию следующие параметры: ширина, высота, текст, граница, ln, выравнивание и заполнение. Значение границы 0 - отсутствие границы или 1 для наличия границы. Для ln мы используем значение по умолчанию 0, «C» - выравнивание текста по цуентру и 0 для параметра заполнение. Если мы бы установили последний паараметр в 1 наш прямоугольник был бы закрашен, значение 0 оставит его прозрачным.
Теперь мы хотим написать маленький текст в наш документ
$pdf->SetXY(10,50);
$pdf->SetFontSize(10);
$pdf->Write(5,"Congratulations! You have generated a PDF. ");

Итак снова мы устанавливаем координаты вывода текста x и y, но теперь мы уменьшим размер шрифта, используя SetFontSize. Функция Write напечатает текст в наш документ. Параметр 5 устанавливает высоту, он имеет смысл только тогда когда у нас есть много строк в нашем тексте.
В конце мы выведен наш результат, используя функцию Output.
$pdf->Output("example1.pdf","I");

Здесь мы указали имя файла и параметры вывода, в данном случае «I». «I»-параметр выведет результат в браузер.

Итак полный текст:

require("fpdf.php");
//create a FPDF object
$pdf=new FPDF();
//set document properties
$pdf->SetAuthor("Lana Kovacevic");
$pdf->SetTitle("FPDF tutorial");
//set font for the entire document
$pdf->SetFont("Helvetica","B",20);
$pdf->SetTextColor(50,60,100);
//set up a page
$pdf->AddPage("P");
$pdf->SetDisplayMode(real,"default");
//insert an image and make it a link
$pdf->Image("/logo.svg",10,20,33,0," ","http://www.fpdf.org/");
//display the title with a border around it
$pdf->SetXY(50,20);
$pdf->SetDrawColor(50,60,100);
$pdf->Cell(100,10,"FPDF Tutorial",1,0,"C",0);
//Set x and y position for the main text, reduce font size and write content
$pdf->SetXY (10,50);
$pdf->SetFontSize(10);
$pdf->Write(5,"Congratulations! You have generated a PDF.");
//Output the document
$pdf->Output("example1.pdf","I");

Сейчас когда мы научились создавать документы, посмотрим что еще можно сделать, используя FPDF. Пример ниже показывает нам как создать верх и низ (хедер и футер:-)) нашего документа.

require("fpdf.php");
class PDF extends FPDF
{
function Header()
{
$this->Image("/logo.svg",10,8,33);
$this->SetFont("Helvetica","B",15);
$this->SetXY(50, 10);
$this->Cell(0,10,"This is a header",1,0,"C");
}
function Footer()
{
$this->SetXY(100,-15);
$this->SetFont("Helvetica","I",10);
$this->Write (5, "This is a footer");
}
}
$pdf=new PDF();
$pdf->AddPage();
$pdf->Output("example2.pdf","D");

Как вы видите мы создали дочерний класс, используя наследование и создания функций Header и Footer. Затем мы создали новый объект и добавили страницу в документ. Функция AddPage автоматически вызовет функции Header и Footer. В конце мы вывели полученную информацию в файл с названием example2.pdf, используя значение «D». В этом случае браузер предложит сохранить данный файл.

Итак, мы изучили основы создания PDF-документов, для более подробной информации используйте

Теперь можно добавить название отчета. Объект FPDF использует концепцию "текущая позиция", куда вставляется следующая часть текста или другой элемент. Так как нужно, чтобы название отчета располагалось в середине страницы, необходимо передвинуть текущую позицию вниз к данной точке, которая располагается на расстоянии 160мм от верха страницы (значение хранится в конфигурационной переменной $reportNameYPos). Для этого используется метод FPDF Ln() , который добавляет перевод строки на указанное расстояние:

$pdf->Ln($reportNameYPos);

Если не указать высоту перевода строки, то будет использоваться высота последней выведенной ячейки.

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

Cell() принимает следующие аргументы (все являются опциональными):

  • Высота и ширина ячейки. По умолчанию ширина растягивается до правого поля, а высота устанавливается в 0.
  • Строка текста для вывода. По умолчанию "" .
  • Указание для отображения рамки вокруг ячейки. Это может быть либо число (0 =нет рамки, 1 =рисуем рамку), или строка с одним или несколькими параметрами из следующего списка: "L" (слева), "T" (сверху), "R" (справа), и "B" (внизу). Значение по умолчанию: 0 .
  • Куда помещать текущую позицию после вывода ячейки. Значение может быть 0 (справа от ячейки), 1 (начало следующей строки), или 2 (ниже). Значение по умолчанию: 0 .
  • Выравнивание текста . Возможные значения: "L" (выравнивание по левому краю), "C" (выравнивание по центру), или "R" (выравнивание по правому краю). Значение по умолчанию: "L" .
  • Нужно ли заливать фон ячейки цветом. true = заливаем цветом, false = оставляем фон прозрачным. Значение по умолчанию: false .
  • URL ссылки. Если задан, то ячейка с текстом становится рабочей ссылкой на другой ресурс.

Теперь с помощью метода Cell() вставим название отчета и выровняем его по центру:

$pdf->

Создаем колонтитул страницы и вводный текст

Итак, титульная страница готова. Теперь надо создать страницу, на которой есть колонтитул, заголовок и некоторый вводный текст, за которым следует таблица и график.

Сделаем колонтитул страницы. Добавим новую страницу, затем выведем текст колонтитула, который содержит название отчета, выровнен по центру страницы и использует шрифт Arial размером 17. Используем переменную конфигурации $headerColour для установки цвета текста:

$pdf->AddPage(); $pdf->SetTextColor($headerColour, $headerColour, $headerColour); $pdf->SetFont("Arial", "", 17); $pdf->Cell(0, 15, $reportName, 0, 0, "C");

Теперь перейдем к тексту. Сначала выведем заголовок в обычном цвете и шрифтом Arial размером 20. Так как нам не нужно центрировать текст, можно использовать простой метод Write() , передав ему высоту строки и текст для вывода (в качестве опции можно также передать адрес URL для формирования ссылки):

$pdf->SetTextColor($textColour, $textColour, $textColour); $pdf->SetFont("Arial", "", 20); $pdf->Write(19, "2009 Was A Good Year");

Теперь можно вывести текст введения шрифтом Arial размером 12. Здесь есть пропуски 16 мм от первого абзаца и 12 мм между параграфами. Задаем для каждой строки высоту в 6 мм:

$pdf->Ln(16); $pdf->SetFont("Arial", "", 12); $pdf->Write(6, "Despite the economic downturn, WidgetCo had a strong year. Sales of the HyperWidget in particular exceeded expectations. The fourth quarter was generally the best performing; this was most likely due to our increased ad spend in Q3."); $pdf->Ln(12); $pdf->Write(6, "2010 is expected to see increased sales growth as we expand into other countries.");

Метод Write() автоматически переводит текст на следующую строку, когда он достигает правой стороны страницы.

Добавляем данные

Теперь нужно добавить таблицу с данными ниже текста. сначала установим цвет рамки таблицы. Метод SetDrawColor() устанавливает цвет, который используется для рамок и других линий, так что мы можем использовать его для установки цвета для рамок ячеек таблицы. Затем текущую позицию опускаем вниз на 15мм для создания пробела между текстом и таблицей:

$pdf->SetDrawColor($tableBorderColour, $tableBorderColour, $tableBorderColour); $pdf->Ln(15);

Создаем строку заголовков таблицы

Таблица имеет строку, которая содержит в ячейках заголовки столбцов "PRODUCT", "Q1, "Q2", "Q3", и "Q4". Ячейка "PRODUCT" использует отличный от других заголовков цвет текста и фона.

Мы уже пользовались методом SetTextColor() для установки цвета текста. Для установки цвета фона надо использовать метод SetFillColor() , который имеет такие же аргументы как SetTextColor() .

Чтобы создать ячейки таблицы используется метод Cell() , которому задаются ширина и высота ячейки, содержание и выравнивание. Также передается 1 в качестве 4-го аргумента для установки рамки, и true в качестве 7-го аргумента для заполнения фона установленным цветом.

Ниже приведен код для создания строки заголовков. Сначала устанавливается полужирный шрифт. Затем создается ячейка "PRODUCT" с соответствующим текстом и фоном. Затем устанавливается цвет для оставшихся 4 ячеек заголовков, и выполняется цикл по элементам массива $columnLabels для вывода ячеек с выравниванием текста в них по центру:

// Создаем строку заголовков таблицы $pdf->SetFont("Arial", "B", 15); // Ячейка "PRODUCT" $pdf->SetTextColor($tableHeaderTopProductTextColour, $tableHeaderTopProductTextColour, $tableHeaderTopProductText Colour); $pdf->SetFillColor($tableHeaderTopProductFillColour, $tableHeaderTopProductFillColour, $tableHeaderTopProductFill Colour); $pdf->Cell(46, 12, " PRODUCT", 1, 0, "L", true); // Остальные ячейки заголовков $pdf->SetTextColor($tableHeaderTopTextColour, $tableHeaderTopTextColour, $tableHeaderTopTextColour); $pdf->SetFillColor($tableHeaderTopFillColour, $tableHeaderTopFillColour, $tableHeaderTopFillColour); for ($i=0; $iCell(36, 12, $columnLabels[$i], 1, 0, "C", true); } $pdf->Ln(12);

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

Создаем строки с данными

Остальная таблица состоит из 4 строк с данными продаж (по одной строке на продукт) для 4-х кварталов. Сначала определим пару переменных:

// Создаем строки с данными $fill = false; $row = 0;

Переменные служат для:

    $fill: Заполнять фон ячейки цветом или нет. Мы будем переключать данное значение после вывода каждой строки для получения эффекта зебры в таблице.

    $row: Текущий номер строки. Она позволяет выводить соответствующий номер для каждой строки при перемещении по таблице.

Теперь можно организовать цикл по элементам массива $data с помощью foreach для вывода строк Для каждой строки создаем левую ячейку, которая содержит название продукта, и четыре ячейки с данными. Устанавливаем соответствующие цвета для тескта и фона для каждой ячейки.

Для вывода ячеек данных используется цикл for для прохода по четырех элементному массиву с данными, а для вывода данных в формате с разделением тысяч вызываем функцию PHP number_format() .

После вывода строки увеличиваем переменную $row , переключаем переменную $fill , и используем Ln() для перехода к началу следующей строки.

Вот код всего цикла:

Foreach ($data as $dataRow) { // Создаем левую ячейку с заголовком строки $pdf->SetFont("Arial", "B", 15); $pdf->SetTextColor($tableHeaderLeftTextColour, $tableHeaderLeftTextColour, $tableHeaderLeftTextColour); $pdf->SetFillColor($tableHeaderLeftFillColour, $tableHeaderLeftFillColour, $tableHeaderLeftFillColour); $pdf->Cell(46, 12, " " . $rowLabels[$row], 1, 0, "L", $fill); // Создаем ячейки с данными $pdf->SetTextColor($textColour, $textColour, $textColour); $pdf->SetFillColor($tableRowFillColour, $tableRowFillColour, $tableRowFillColour); $pdf->SetFont("Arial", "", 15); for ($i=0; $iCell(36, 12, ("$" . number_format($dataRow[$i])), 1, 0, "C", $fill); } $row++; $fill = !$fill; $pdf->Ln(12); }

Создаем график

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

Вычисление масштаба и ширины столбика

Сначала надо вычислить масштаб для осей X и Y. Для масштаба по оси X вычисления заключаются в простом делении количества продуктов на желаемую ширину графика (нужно учесть небольшие отступы слева и справа для лучшего вида):

/*** Создаем график ***/ // Вычисляем масштаб по оси X $xScale = count($rowLabels) / ($chartWidth - 40);

Для вычисления масштаба по оси Y нужно найти общее значение по каждому продукту и затем определить среди них максимальное значение. Затем максимум можно будет разделить на желаемую высоту графика для получения значения масштаба по оси Y:

// Вычисляем масштаб по оси Y $maxTotal = 0; foreach ($data as $dataRow) { $totalSales = 0; foreach ($dataRow as $dataCell) $totalSales += $dataCell; $maxTotal = ($totalSales > $maxTotal) ? $totalSales: $maxTotal; } $yScale = $maxTotal / $chartHeight;

Теперь, зная масштаб по оси X, можно вычислить ширину (в мм) каждого столбца графика. Это инверсированное значение масштаба по оси X, уменьшенное в полтора раза для организации расстояния между столбцами:

// Вычисляем ширину столбцов $barWidth = (1 / $xScale) / 1.5;

Добавляем линии осей и метки на них

Теперь можно добавить линии осей X и Y, метки данных и метки осей. Используем шрифт Arial с размером 10 для меток данных.

Для вывода линии в FDPF используется метод Line() , которые принимает четыре аргумента: координаты X и Y начала линии, и координаты X и Y конца линии.

Для оси X выводим горизонтальную линию вдоль низа графика, оставляя 30 мм для меток по оси Y слева. Затем выводим каждое имя продукта в массиве $rowLabels как текстовую ячейку в соответствующую точку:

// Добавляем оси: $pdf->SetFont("Arial", "", 10); // Ось X $pdf->Line($chartXPos + 30, $chartYPos, $chartXPos + $chartWidth, $chartYPos); for ($i=0; $i < count($rowLabels); $i++) { $pdf->SetXY($chartXPos + 40 + $i / $xScale, $chartYPos); $pdf->Cell($barWidth, 10, $rowLabels[$i], 0, 0, "C"); }

Метод SetXY() позволяет устанавливать текущую позицию в нужное место на странице.

Для оси Y выводим вертикальную линию слева от графика, оставляя 30 мм для меток данных по оси Y. Линию оси делаем на 8 мм больше желаемой высоты графике для того, чтобы было место для вывода метки оси. Затем организуем цикл от нуля до максимального значения данных $maxTotal , которое было определено ранее. Размер шага установлен в переменной $chartYStep (20,000). На каждом шаге выводим текущее значение выровненной вправо и короткую метку:

// Ось Y $pdf->Line($chartXPos + 30, $chartYPos, $chartXPos + 30, $chartYPos - $chartHeight - 8); for ($i=0; $i <= $maxTotal; $i += $chartYStep) { $pdf->SetXY($chartXPos + 7, $chartYPos - 5 - $i / $yScale); $pdf->Cell(20, 10, "$" . number_format($i), 0, 0, "R"); $pdf->Line($chartXPos + 28, $chartYPos - $i / $yScale, $chartXPos + 30, $chartYPos - $i / $yScale); }

Теперь можно добавить метки осей. Используем шрифт Arial полужирный с размером 12. Размещаем метку оси X ниже меток данных, а метку оси Y - наверху оси Y:

// Добавляем метки осей $pdf->SetFont("Arial", "B", 12); $pdf->SetXY($chartWidth / 2 + 20, $chartYPos + 8); $pdf->Cell(30, 10, $chartXLabel, 0, 0, "C"); $pdf->SetXY($chartXPos + 7, $chartYPos - $chartHeight - 12); $pdf->Cell(20, 10, $chartYLabel, 0, 0, "R");

Выводим столбцы графика

Завершающей стадией является создание самого графика. Для вывода столбцов используется метод FPDF Rect() , который выводит прямоугольник. Метод использует следующие аргументы:

  • Координаты X и Y верхнего левого угла прямоугольника.
  • Ширина и высота прямоугольника.
  • Стиль прямоугольника. Может иметь значения "D" или "" (выводим обводку), "F" (заполняем текущим цветом фона), или "DF" / "FD" (обводка и заполнение).

Теперь выводим столбцы. Установим переменную $xPos , которая служит для отслеживания текущей позиции по X. Зададим ей значение 40 мм с учетом расстояния для меток по оси Y и отступа для первого столбца. Теперь создадим переменную $bar , которая будет содержать номер текущего столбца. Она будет использоваться для установки цвета для столбца:

// Создаем столбецы $xPos = $chartXPos + 40; $bar = 0;

Теперь проходим циклом по массиву $data , вычисляем суммарное значение для каждой строки и выводим столбец от оси X до этого значения, масштабированного с помощью $yScale . Цвет для каждого столбца изменяется с помощью счетчика $bar , который является индексом в массиве $chartColours . После вывода текущего столбца перемещаем позицию X к началу следующего, увеличиваем счетчик $bar и продолжаем цикл:

Foreach ($data as $dataRow) { // Вычисляем суммарное значение по строке данных для продукта $totalSales = 0; foreach ($dataRow as $dataCell) $totalSales += $dataCell; // Создаем столбец $colourIndex = $bar % count($chartColours); $pdf->SetFillColor($chartColours[$colourIndex], $chartColours[$colourIndex], $chartColours[$colourIndex]); $pdf->Rect($xPos, $chartYPos - ($totalSales / $yScale), $barWidth, $totalSales / $yScale, "DF"); $xPos += (1 / $xScale); $bar++; }

В коде используется оператор PHP деление по модулю (%) для повтора цвета столбца, если количество столбцов превышает количество элементов в массиве $chartColours .

Отправляем документ PDF браузеру

Документ PDF готов! Осталось только отправить его браузеру, чтобы пользователь мог просмотреть его или загрузить.

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

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

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

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

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

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

/*** Выводим PDF ***/ $pdf->Output("report.pdf", "I"); ?>

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 .

Рано или поздно встает вопрос о генерации PDF файлов. Он удобен, а страницы можно сделать довольно красивыми. Есть много разных библиотек для PHP, у меня в данном случае стояла задача сделать на FPDF. Данная библиотека, а точнее класс распространяется бесплатно и умеет работать с разными типами кодировок, в том числе и с CP1251. Наверно минусом этой библиотеки является отсутствие поддержки UTF, но есть отдельная пропатченная библиотека UFPDF, ее рассматривать я не буду.

Вы наверно спросите почему мучение с кириллицей? Скажем так, я потратил много времени на поиски, как заставить показывать русский текст, а не каракули. Делал я все по мануалам, официальных источников.
Итак, для того что бы был русский текст нам нужны шрифты, я делал для Arial, Times New Roman, Verdana. Создайте в своем проекте папку fonts. Скиньте туда нужные шрифты. Теперь нам нужно с конвертировать их для FPDF. На многих сайтах предлагают использовать специальную утилиту ttf2pt1.

Ttf2pt1 -a arial.ttf arial Сохранив, проверим в браузере. Он создает 2 файла, потом надо создать php файл и сделать следующее, а точнее он создаст php файл который содержит информацию о шрифте. Не забудьте поставить права на папку, где будете генерировать шрифты.

Все это я делал ни один раз. И никак скрипт не хотел работать. После чего я нашел более простой способ конвертирования шрифтов.
Идем http://fpdf.fruit-lab.de/index.php?id=3 на этот сайт. Выбираем кодировку cp1251, далее прикрепляем нужный нам шрифт и жмем Convert. Там нас будет интересовать php, afm, z. Скачивайте эти файлы в созданную нами папку fonts. Далее нужно переименовать файл.php.txt в.php.
После чего откроем этот php файл (с сайта мы скачиваем его в.php.txt и потом переименовываем). В данном случае нас будет интересовать имя шрифта ($name="ArialMT";). Теперь у нас есть шрифт и имя шрифта. Можно приступить к созданию самого генератора PDF. Создаем нужный нам файл, подключаем нужные библиотеки.

Define("FPDF_FONTPATH", __system_directory__ ."API/font/"); // на всякий случай я прописал полный путь до библиотеки. require("/usr/share/php/fpdf/fpdf.php"); // объявляем класс и конструктор класса, в данном случае у меня альбомный лист $pdf=new FPDF("L"); //нужно подключить шрифт, указав имя шрифта и имя файла. $pdf->AddFont("ArialMT","","119379869a251bdd6a14438b3c5514f2_arial.php"); $pdf->AddPage(); // выбираем шрифт для текста. $pdf->SetFont("ArialMT","",35); $pdf->Cell(40,10,"русский текст!"); $pdf->Output();

Основное время я потратил из-за возникавшей ошибки: «FPDF error: Undefined font: arialmt B» Она наверно вызывалась неверной конвертацией шрифта, когда пользовался MakeFont или использованием неверного параметра, к примеру ошибка возникает, когда 2 параметр не совпадает с SetFont или наоборот.

// Ошибка в этом примере:
$pdf->AddFont("ArialMT","","119379869a251bdd6a14438b3c5514f2_arial.php"); $pdf->SetFont("ArialMT","B",35); //И в такой тоже: $pdf->AddFont("ArialMT","B","119379869a251bdd6a14438b3c5514f2_arial.php"); $pdf->SetFont("ArialMT","",35); //работает $pdf->AddFont("ArialMT","B","119379869a251bdd6a14438b3c5514f2_arial.php"); $pdf->SetFont("ArialMT","B",35);

Как оказалось ошибки были на пустом месте, но я рад что разобрался с ними, и буду надеяться что эта маленькая статья поможет не терять время, на поиск проблемы связанной c кодировками.


Сайт визитка: особенности хорошего старта
Надувные матрасы от Ламон
WebNames.Ru – десятилетие деятельности в Интернете
Квартира для вашего сайта.
Технологии от BoldSoft
Как добиться успеха в безнадежных проектах
Новый тип навигационной системы при постраничном выводе
Генерация PDF с помощью PHP
PHP и PostgreSQL
Оптимизируем MySQL

Генерация PDF с помощью PHP

Предисловие
Одна из причин, почему я люблю PHP - это то, что в нем постоянно появляется поддержка новых технологий. Язык легко расширяем, и разработчики легко добавляют к нему новые модули, поэтому PHP стал одним из самых функциональных Web языков с поддержкой огромного разнообразия разных технологий. Расширения, существующие сегодня, позволяют разработчикам легко работать с сервером IMAP и POP3; динамически создавать изображения и рисунки в формате Flash; выполнять операции проверки кредитных карт; шифровать секретные данные; и работать с базами XML.

И это еще не все! Одно из самый интересных расширений, добавленных на сегодня в PHP - это расширение PDFLib , которое позволяет разработчикам динамически генерировать документы в формате PDF (Adobe Portable Document Format) . На протяжении следующих нескольких страниц я кратко расскажу об этом модуле, и дам обзор используемых функций, расскажу как использовать это расширение в PHP разработках. Так что поехали!

Поехали!
Чтобы задействовать расширение PDFLib , сначала нужно установить соответсвующую библиотеку в Вашу систему. Если вы работаете на Linux , можно скачать копию с сайта http://www.pdflib.com/pdflib/index.html и скомпилировать ее для вашего сервера. Если вы работаете на Windows, все намного проще - вместе с дистрибутивом PHP уже поставляется скомпилированный модуль PDF , и все что Вам нужно сделать - это его активировать, раскомментировав соответствующую строку в конфигурационном файле.

Вдобавок, Вам потребуется копия программы Adobe Acrobat PDF reader , чтобы читать документы, созданные с помощью библиотеки PDFLib . Скачать бесплатно Adobe Acrobat Reader можно с сайта производителя: http://www.adobe.com/

Как только все установлено, время создать простой PDF документ:

Сохраните этот файл, а затем откройте его в браузере. PHP обработает данный скрипт и сгенерирует новый PDF файл, который сохранит в месте, указанном вверху скрипта. Вот что Вы увидите открыв этот PDF документ:

Все права на публикацию этой статьи принадлежат

Урок анатомии
Поглядим внимательнее на код, используемый в приведенном примере.

Создание PDF файла в PHP включает в себя 4 основных шага: создание указателя на документ, регистрация шрифтов и цветов для документа, запись или рисование в указатель с использований предопределенных функций, и сохранение документа.

Начнем с первого шага - создание указателя на PDF

// create handle for new PDF document $pdf = pdf_new();

Это достигается с помощью функции pdf_new(), которая возвращает указатель на этот документ. Затем этот указатель используется во всех последующих операциях по созданию PDF документа.

Следующим шагом следует дать PDF файлу имя - это достигается функцией pdf_open_file(), которая принимает два аргумента - указатель, возвращенный предыдущей функцией и собственно имя файла, определяемое пользователем.

// open a file pdf_open_file($pdf, "philosophy.pdf");

Как только документ был создан, в него можно вставить начало новой страницы функцией pdf_begin_page(),

// start a new page (A4) pdf_begin_page($pdf, 595, 842);

и конец страницы - да вы угадали!! - функцией pdf_end_page().

// end page pdf_end_page($pdf);

Заметьте, что функция pdf_begin_page() требует два дополнительных параметра, которые представляют собой ширину и высоту создаваемого документа в точках (точка равна 1/72 дюйма). Если у вас плохо с математикой, учебник по PHP включает в себя стандартные размеры для всех распространенных размеров страниц, в том числе и A4, который используется выше.

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

Выбор и регистрация шрифта выполняется функциями pdf_findfont() и pdf_setfont(). Функция pdf_findfont() выбирает шрифт для использования в документе, и требует ввести имя шрифта, метод кодирования и Булевый параметр, указывающий на то, следует ли внедрить шрифт в PDF документ; а возвращает она объект-шрифт, который можно потом использовать при вызове функции pdf_setfont().

$arial = pdf_findfont($pdf, "Arial", "host", 1); pdf_setfont($pdf, $arial, 10); Как только шрифт выбран, можно использовать функцию pdf_show_xy() для записи текста в определенное место на странице.
// print text pdf_show_xy($pdf, "There are more things in heaven and earth, Horatio,", 50, 750); pdf_show_xy($pdf, "than are dreamt of in your philosophy", 50, 730);

Как вы заметили, эта функция требует указатель на PDF документ, ссылку на используемый объект-шрифт, текст для записи и координаты X Y места, откуда начинать запись текста. Эти координаты указываются относительно точки (0,0), которая находится в левом нижнем углу документа.

Как только текст был записан, страница закрывается вызовом функции pdf_end_page(). Затем можно добавить еще страницы или, как я здесь сделал, просто закрыть документ с помощью pdf_close(). Эта функция сохранит документ с именем, указанным при вызове pdf_open_file(), и уничтожит указатель на документ.

Все права на публикацию этой статьи принадлежат

А вот PDF вывод:

Все волшебство здесь заключается в функциях pdf_open_image_file() и pdf_place_image(). Превая из них принимает тип изображения - GIF, JPEG, TIFF или PNG - и название файла в качестве аргументов, и возвращает указатель на рисунок, который затем можно повторно использовать в документе.

Указатель на рисунок, возвращенный выше затем можно передать функции pdf_place_image(), которая расположит рисунок в определенном месте на странице. Координаты, переданные данной функции (второй и третий аргумент) относятся к левому нижнему углу рисунка, а четвертый аргумент задает параметр масштабирования рисунка при отображении (1 - покажет рисунок в 100% масштабе, 0.5 уменьшит его в два раза.)

Все права на публикацию этой статьи принадлежат

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

Вот что вы увидите:

В данном случае процесс рисования линии включает в себя использование функций pdf_moveto(), pdf_lineto() и pdf_stroke().

В приведенном выше примере я рисую линию из точки (20,780) до точки (575, 780). Чтобы сделать это сначала мне нужно поместить курсор в начальную точку (20,780), с помощью вызова функции to pdf_moveto().

Затем необходимо задать конечную точку с помощью pdf_lineto():

Наконец, рисуем линию с помощью pdf_stroke().

Цвет линии задается функцией pdf_setcolor(), которая принимает несколько параметров: указатель на PDF документ, тип линии: "stroke", "fill" или "both", цветовая палитра (RGB или CMYK), и список цветовых значений, подходящих к выбранной палитре.

pdf_setcolor($pdf, "stroke", "rgb", 0, 0, 0);

Важно заметить, что список цветовых значений, передаваемый pdf_setcolor() должен быть задан в процентной величине интенсивности - то есть, интенсивности данного цвета, выраженной в процентах от максимально возможной. Например, если я хочу задать (RGB: 255,0,0) в качестве цвета для заливки, мой вызов функции pdf_setcolor() будет выглядеть вот так,

pdf_setcolor($pdf, "stroke", "rgb", 1, 0, 0);

А заливка желтым цветом будет выглядеть так:

pdf_setcolor($pdf, "fill", "rgb", 1, 1, 0);

Все права на публикацию этой статьи принадлежат

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

Вот вывод:

В данном случае функция the pdf_rect() используется для рисования прямоугольника с помощью заданных координат левого нижнего угла, высоты и ширины. Затем прямоугольник закрашивается и обводится двумя разными цветами с помощью функции pdf_fill_stroke().

pdf_setcolor($pdf, "fill", "rgb", 1, 1, 0); pdf_setcolor($pdf, "stroke", "rgb", 0, 0, 0); pdf_rect($pdf, 50, 500, 200, 300); pdf_fill_stroke($pdf);

Круги рисуются функцией pdf_circle(), которая принимает три аргумента: координаты X и Y центра круга и длину радиуса.

pdf_circle($pdf, 400, 600, 100);

Эта возможность рисования геометрических изображений "на лету" может пригодиться в различных ситуациях. К примеру, вот одна из них - в ней пара циклов "for" соединяются с функцией pdf_lineto() для генерации сетки из линий.

Вот вывод:

Все права на публикацию этой статьи принадлежат

А теперь, при просмотре документа в Adobe Reader , вы сможете увидеть эту информацию в Свойствах Документа.

Все права на публикацию этой статьи принадлежат

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

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

Pie Chart Generator

Enter numeric values (pie segments), separated by commas
А вот скрипт:

Данные, введенные в форму, передаются скрипту "pie.php" переменной $data; эти данные затем разделяются на отдельные компоненты функцией explode(), и каждое значение присваивается массиву $slices. Затем в цикле эти числа конвертируются в градусы для круга и для каждого куска рисуется дуга. В каждом проходе цикла также вычисляется координата конечной точки дуги и рисуется сегмент линии для того, чтобы отделить дугу от остальной окружности. Как только "кусок пирога" нарисован, используется функция the pdf_fill_stroke() для заливки его цветом; цвет берется из массива $colours.

Мы не будем рассматривать как скрипт вычисляет длинц каждой дуги и сегмента линии - в комментариях кода все объясняется.

Если вы введете 5 равных кусков данных, график будет выглядеть так,

Если введете 2, то:

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

Замечание: Все примеры в данной статье проверены на платформе Linux/i586 с Apache 1.3.12 и PHP 4.2.0. Примеры приводятся только для иллюстративных целей и не предназначены для жизненных применений.