Создание документов в PHP: практические примеры и инструкции

Раздел: PHP -> Генерация и обработка документов

Основные способы генерации документов в PHP

Как преобразовать HTML в PDF с помощью Dompdf?

Библиотека Dompdf позволяет создавать PDF‑документы на основе HTML и CSS. Это наиболее удобный способ, если структура документа задаётся шаблоном на HTML.

Установка выполняется через Composer:

composer require dompdf/dompdf

документ php (создание документов в php)

Пример минимального скрипта:


require 'vendor/autoload.php';
use Dompdf\Dompdf;

$dompdf = new Dompdf();
$html = '<h1>Привет, документ!</h1><p>Содержимое PDF.</p>';
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
$dompdf->stream('документ.pdf');
    

Пояснения шагов:

  • Подключение автозагрузчика Composer.
  • Создание экземпляра Dompdf.
  • Загрузка HTML‑строки с содержимым.
  • Установка формата и ориентации страницы.
  • Рендеринг (преобразование в PDF).
  • Вывод файла в браузер или сохранение (вместо stream можно использовать $output = $dompdf->output(); file_put_contents(...)).

Типичные ошибки и их решения:

  • Проблема с кириллицей – необходимо подключить шрифт, поддерживающий кириллицу (например, DejaVu Sans). В Dompdf шрифты подключаются через CSS: @font-face { font-family: 'DejaVu Sans'; src: url('...'); } или использовать встроенный шрифт dejavu sans.
  • CSS не применяется – Dompdf не поддерживает все CSS‑свойства. Рекомендуется использовать простые стили: float, table, position.
  • Изображения не отображаются – пути должны быть абсолютными или файлы должны быть доступны по URL.

Как создать PDF без внешних зависимостей (FPDF)?

FPDF – классическая библиотека для построения PDF напрямую, без использования HTML. Подходит для документов с точным позиционированием.


require 'fpdf.php';

$pdf = new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial', 'B', 16);
$pdf->Cell(40,10,'Привет, FPDF!');
$pdf->Output();
    

Пояснение: создаётся страница, устанавливается шрифт (Arial жирный 16pt), выводится ячейка с текстом. Недостаток – необходимо вручную рассчитывать координаты.

Типичные ошибки: неправильная кодировка – FPDF не поддерживает UTF‑8 по умолчанию. Требуется подключить UTF‑8 шрифт (например, dejavu через AddFont).

Как создать многостраничный PDF с водяными знаками (TCPDF)?

TCPDF предоставляет широкие возможности: колонтитулы, водяные знаки, графика. Установка: composer require tecnickcom/tcpdf.


require 'vendor/autoload.php';

$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
$pdf->AddPage();
$pdf->SetFont('dejavusans', '', 14);
$pdf->Cell(0,10,'Страница 1',0,1);
$pdf->AddPage();
$pdf->Cell(0,10,'Страница 2',0,1);
$pdf->Output('многостраничный.pdf', 'I');
    

Дополнительные возможности: добавление водяного знака через $pdf->SetAlpha(0.2); $pdf->Image(...); $pdf->SetAlpha(1);.

Типичные ошибки: большой размер выходного файла из‑за встроенных шрифтов. Оптимизация – использовать $pdf->setPrintHeader(false) для отключения стандартных колонтитулов.

Как создать документ Word (DOCX) в PHP?

Библиотека PHPWord позволяет генерировать файлы формата Office Open XML. Установка: composer require phpoffice/phpword.


require 'vendor/autoload.php';

$phpWord = new \PhpOffice\PhpWord\PhpWord();
$section = $phpWord->addSection();
$section->addText('Заголовок', array('bold'=>true, 'size'=>16));
$section->addText('Обычный текст.');

$objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007');
$objWriter->save('документ.docx');
    

Пояснение: создаётся документ, добавляется раздел, в него добавляются элементы (текст, таблицы, изображения).

Типичные ошибки: при открытии в Word могут отсутствовать поля – нужно явно задавать отступы и интервалы. Также проблемы с изображениями (пути должны быть абсолютными).

Как создать Excel‑файл с формулами и стилями?

PhpSpreadsheet (наследник PHPExcel) – мощная библиотека для работы с электронными таблицами. Установка: composer require phpoffice/phpspreadsheet.


require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Значение');
$sheet->setCellValue('B1', '=A1*2');
$sheet->getStyle('A1')->getFont()->setBold(true);

$writer = new Xlsx($spreadsheet);
$writer->save('таблица.xlsx');
    

Пояснение: создаётся документ, заполняются ячейки, добавляется формула, применяется стиль (жирный шрифт).

Типичные ошибки: при большом количестве строк (более 100 000) возможна нехватка памяти. Решение – использовать итераторы и очистку кэша.

Расширенные примеры создания документов

Пример 1: PDF с таблицей и изображением (Dompdf).

Пример

require 'vendor/autoload.php';
use Dompdf\Dompdf;

$html = '
<html>
<head><style>
table { border-collapse: collapse; width: 100%; }
td, th { border: 1px solid black; padding: 5px; }
</style></head>
<body>
<h2>Отчёт за месяц</h2>
<img src="logo.png" width="100">
<table>
<tr><th>Дата</th><th>Сумма</th></tr>
<tr><td>01.01.2025</td><td>1500</td></tr>
<tr><td>02.01.2025</td><td>2300</td></tr>
</table>
</body>
</html>
';

$dompdf = new Dompdf();
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
$dompdf->stream('отчёт.pdf', array('Attachment' => 0));
  

Результат: сгенерированный PDF с таблицей и логотипом. Изображение должно быть в той же директории или указан абсолютный путь.

(файл отчёт.pdf открывается в браузере)

Пример 2: Сложный документ Word с таблицей и разрывами страниц (PHPWord).

Пример

require 'vendor/autoload.php';

$phpWord = new \PhpOffice\PhpWord\PhpWord();
$section = $phpWord->addSection();

// Добавление текста с различным форматированием
$section->addText('Контракт №123', array('bold' => true, 'size' => 18, 'color' => 'red'));
$section->addPageBreak();

// Таблица
$table = $section->addTable();
$table->addRow();
$table->addCell(2000)->addText('Наименование');
$table->addCell(2000)->addText('Количество');
$table->addRow();
$table->addCell(2000)->addText('Товар 1');
$table->addCell(2000)->addText('10');

$objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007');
$objWriter->save('контракт.docx');
  

Результат: DOCX файл с первой страницей (заголовок), затем разрыв страницы и таблица.

(контракт.docx – корректно открывается в Microsoft Word)

Пример 3: Excel с несколькими листами, условным форматированием и диаграммой (PhpSpreadsheet).

Пример

require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Conditional;

$spreadsheet = new Spreadsheet();

// Лист 1 – данные
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Продажи');
$sheet->setCellValue('A1', 'Месяц');
$sheet->setCellValue('B1', 'Выручка');
$sheet->setCellValue('A2', 'Январь');
$sheet->setCellValue('B2', 10000);
$sheet->setCellValue('A3', 'Февраль');
$sheet->setCellValue('B3', 12000);

// Условное форматирование (выделение ячеек >11000)
$condStyle = new Conditional();
$condStyle->setConditionType(Conditional::CONDITION_CELLIS);
$condStyle->setOperatorType(Conditional::OPERATOR_GREATERTHAN);
$condStyle->addCondition(11000);
$condStyle->getStyle()->getFont()->setBold(true)->setColor(new \PhpOffice\PhpSpreadsheet\Style\Color('007700'));
$sheet->getStyle('B2:B3')->setConditionalStyles([$condStyle]);

// Добавление второго листа
$newSheet = $spreadsheet->createSheet();
$newSheet->setTitle('Итоги');
$newSheet->setCellValue('A1', 'Общая выручка');
$newSheet->setCellValue('B1', '=SUM(Продажи!B2:B3)');

$writer = new Xlsx($spreadsheet);
$writer->save('отчёт.xlsx');
  

Результат: XLSX файл с двумя листами, на первом условное форматирование, на втором формула с суммой.

(отчёт.xlsx – открывается в Excel, ячейки >11000 выделены жирным зелёным, на втором листе сумма 22000)

Пример 4: Генерация PDF из шаблона Twig с последующим рендерингом через Dompdf.

Пример

require 'vendor/autoload.php';

use Dompdf\Dompdf;
use Twig\Environment;
use Twig\Loader\FilesystemLoader;

$loader = new FilesystemLoader('templates');
$twig = new Environment($loader);

$html = $twig->render('invoice.html.twig', [
    'number' => 'INV-001',
    'date' => '01.01.2025',
    'items' => [
        ['name' => 'Услуга 1', 'price' => 500],
        ['name' => 'Услуга 2', 'price' => 1200]
    ]
]);

$dompdf = new Dompdf();
$dompdf->loadHtml($html);
$dompdf->render();
$dompdf->stream('invoice.pdf');
  

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

(invoice.pdf – счёт с данными из шаблона)

Создание документов в PHP - comments

En
документ php (php)