О web-разработке
и даже немного больше...

Создание PDF файлов в PHP

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

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

Ссылка на библиотеку FPDF:
http://www.fpdf.org/en/download.php

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

<?php
define('FPDF_FONTPATH', '/local/myproject/font/');
 
require( 'fpdf.php' );
 
$pdf = new FPDF();
$pdf->SetFont('Arial','',72);
$pdf->AddPage();

$pdf->Cell(40,10,"Hello World!",15);

$pdf->Output();

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

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

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

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

<?php
define('FPDF_FONTPATH','/local/myproject/font/');
 
require( 'fpdf.php' );
require( 'data-result.php' );
 
class PDF extends FPDF {
	function EventTable($event) {
		$this->SetFont('','B','24');
		$this->Cell(40,10,$event['name'],15);
		$this->Ln();
	
		$this->SetXY( 10, 45 );
	
		$this->SetFont('','B','10');
		$this->SetFillColor(128,128,128);
		$this->SetTextColor(255);
		$this->SetDrawColor(92,92,92);
		$this->SetLineWidth(.3);
	
		$this->Cell(70,7,"Team 1",1,0,'C',true);
		$this->Cell(20,7,"Score 1",1,0,'C',true);
		$this->Cell(70,7,"Team 2",1,0,'C',true);
		$this->Cell(20,7,"Score 2",1,0,'C',true);
		$this->Ln();
	}
}
 
$pdf = new PDF();
$pdf->SetFont('Arial','',10);

foreach( getResult() as $event ) {
	$pdf->AddPage();
	$pdf->EventTable($event);  
}

$pdf->Output();

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

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

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

<?php
define('FPDF_FONTPATH','/local/myproject/font/');
 
require( 'fpdf.php' );
require( 'data-result.php' );
 
class PDF extends FPDF {

function EventTable($event) {
    $this->SetFont('','B','24');
    $this->Cell(40,10,$event['name'],15);
    $this->Ln();
 
    $this->SetFont('','B','10');
    $this->SetFillColor(128,128,128);
    $this->SetTextColor(255);
    $this->SetDrawColor(92,92,92);
    $this->SetLineWidth(.3);
 
    $this->Cell(70,7,"Team 1",1,0,'C',true);
    $this->Cell(20,7,"Score 1",1,0,'C',true);
    $this->Cell(70,7,"Team 2",1,0,'C',true);
    $this->Cell(20,7,"Score 2",1,0,'C',true);
    $this->Ln();
 
    $this->SetFillColor(224,235,255);
    $this->SetTextColor(0);
    $this->SetFont('');
 
    $fill = false;
 
    foreach($event['games'] as $game){
        $this->SetFont('Times',((int)$game['score1']>(int)$game['score2'])?'BI':'');
        $this->Cell(70,6,$game['team1'],'LR',0,'L',$fill);
        $this->Cell(20,6,$game['score1'],'LR',0,'R',$fill);
        $this->SetFont('Times',((int)$game['score1']<(int)$game['score2'])?'BI':'');
        $this->Cell(70,6,$game['team2'],'LR',0,'L',$fill);
        $this->Cell(20,6,$game['score2'],'LR',0,'R',$fill);
        $this->Ln();
        $fill =! $fill;
    }
    $this->Cell(180,0,'','T');
}
}
 
$pdf = new PDF();
$pdf->SetFont('Arial','',10);
foreach( getResult() as $event ) {
  $pdf->AddPage();
  $pdf->EventTable($event);  
}
$pdf->Output();

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

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

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

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

$pdf->Image('logo.png',5,5,33);

$pdf – это есть объект класса FDPF, logo.php – файл который следует разместить в документе, далее идёт положение по x, y координатам, и ширина в DPI. Переданы данному методу могут 7 параметров, более детально о всех параметрах и методах вы можете ознакомиться на сайте проекта FPDF (ссылка была указана выше). У меня на этом всё, надеюсь примеры были не такими сложными, всего доброго!

Опубликован: 28.03.2020 г.

См. также:

Редакторы кода для PHP
Как просмотреть время загрузки страницы в PHP?
Генерация QR-кода в PHP
Загрузка файлов на сервер посредством Ajax
Импорт записей из Excel в WordPress
Парсинг XML в PHP
Установка IonCube на XAMPP
Как сделать мобильную версию сайта на Битрикс?

Комментарии

  1. Антон пишет:

    как быть в случае многострочного текста в ячейке?

    1. htmaker пишет:

      Вариант 1 - Использовать функцию Text:

      Text(float x, float y, string txt)

      http://www.fpdf.org/en/doc/text.htm

      Вариант 2 - Использовать функцию MultiCell:

      MultiCell(float w, float h, string txt [, mixed border [, string align [, boolean fill]]])

      http://www.fpdf.org/en/doc/multicell.htm

  2. виталий пишет:

    ошибка FPDF: не удалось включить файл определения шрифта

    Как это лечится?

    1. htmaker пишет:
      define('FPDF_FONTPATH','/local/myproject/font/');
      

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Комментарии
  • Загрузка...
Друзья сайта