Работа с PDF в PHP: от HTML до документа
Обзор способов создания PDF в PHP
Как создать PDF из HTML с сохранением стилей с помощью mPDF?
Наиболее эффективное решение для генерации PDF из HTML-разметки — библиотека mPDF. Она поддерживает CSS, встраивание шрифтов, колонтитулы, таблицы и многое другое. Установка через Composer: composer require mpdf/mpdf.
<?php
require_once __DIR__ . '/vendor/autoload.php';
$mpdf = new \Mpdf\Mpdf();
$html = '<h1 style="color: blue;">Привет, мир!</h1><p>Это PDF из HTML.</p>';
$mpdf->WriteHTML($html);
$mpdf->Output('document.pdf', \Mpdf\Output\Destination::FILE);
?>Пояснение: создаётся экземпляр класса Mpdf, в метод WriteHTML передаётся строка с HTML, после чего документ сохраняется в файл. Для вывода в браузер используйте константу Destination::INLINE.
Типичные ошибки: слишком большой объём HTML (решается увеличением memory_limit), отсутствие поддержки кириллицы (необходимо подключить шрифты, например, DejaVu Sans). Ошибка Could not find a suitable font означает, что шрифт не установлен в системе или не добавлен в конфигурацию mPDF. Решение — скопировать ttf-файл в папку ttfonts библиотеки или указать путь через $mpdf->AddFont().
Как создать PDF с низкоуровневым контролем через TCPDF?
Библиотека TCPDF предоставляет полный контроль над каждым элементом страницы: позиционирование, рисование линий, вставка изображений. Установка: composer require tecnickcom/tcpdf.
<?php
require_once 'vendor/autoload.php';
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Автор');
$pdf->AddPage();
$pdf->SetFont('dejavusans', '', 14);
$pdf->Cell(40, 10, 'Привет, TCPDF!', 0, 1);
$pdf->Output('tcpdf_example.pdf', 'I');
?>Пояснение: задаются ориентация, единицы измерения, формат страницы; добавляется страница; устанавливается шрифт; рисуется ячейка с текстом. Результат выводится прямо в браузер.
Частая проблема: неверная кодировка символов. Решение — при создании объекта указать true для параметра unicode и явно задать кодировку 'UTF-8'. Также возможна ошибка из-за отсутствия директории cache — необходимо создать её с правами на запись.
Как создать PDF из HTML с помощью Dompdf?
Библиотека Dompdf преобразует HTML+CSS в PDF, используя движок, похожий на браузерный. Установка: composer require dompdf/dompdf.
<?php
use Dompdf\Dompdf;
require_once 'vendor/autoload.php';
$dompdf = new Dompdf();
$dompdf->loadHtml('<h1>Заголовок</h1><p>Текст документа.</p>');
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
$dompdf->stream('dompdf_output.pdf', array('Attachment' => 0));
?>Метод loadHtml принимает HTML, setPaper задаёт формат и ориентацию, render генерирует PDF, а stream выводит его в браузер.
Проблемы: Dompdf не поддерживает все CSS-свойства (например, Flexbox). Решение — использовать табличную вёрстку. Ошибка Unsupported font исправляется подключением шрифтов через @font-face в HTML.
Как создать простой PDF без внешних зависимостей с FPDF?
Библиотека FPDF не требует внешних расширений (кроме GD для изображений) и идеальна для простых документов. Скачивается с fpdf.org или устанавливается через Composer: composer require setasign/fpdf.
<?php
require_once 'vendor/autoload.php';
$pdf = new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial', 'B', 16);
$pdf->Cell(40, 10, 'Hello World!');
$pdf->Output();
?>Пояснение: FPDF не поддерживает HTML — всё рисуется вручную через ячейки, строки и изображения. Это даёт лёгкость и быстроту.
Ошибки: отсутствие шрифта Arial в системе (можно подключить другой шрифт через AddFont). Проблема с кириллицей решается использованием UTF-8 через отдельную модификацию (например, tfpdf).
Как создать PDF с помощью внешнего конвертера wkhtmltopdf?
Внешний инструмент wkhtmltopdf использует движок WebKit для конвертации HTML в PDF. Вызов из PHP через exec() или shell_exec().
exec('wkhtmltopdf input.html output.pdf 2>&1', $output, $return_var);Требуется установленный wkhtmltopdf на сервере. Поддерживает сложные CSS и JavaScript.
Проблемы: безопасность (использование exec), зависимость от версии установленного пакета, возможные ошибки при нехватке памяти. Решение — ограничить размер входного HTML и применять опцию --no-stop-slow-scripts.
Расширенные примеры создания PDF в PHP
Пример 1. Сложный документ с mPDF: таблицы, изображения, колонтитулы
<?php
require_once __DIR__ . '/vendor/autoload.php';
$mpdf = new \Mpdf\Mpdf([
'mode' => 'utf-8',
'format' => 'A4',
'margin_top' => 20,
'margin_bottom' => 25,
'margin_left' => 15,
'margin_right' => 15
]);
// Нижний колонтитул
$mpdf->SetFooter('{PAGENO} из {nb}');
// HTML с таблицей и изображением
$html = '
<h1>Отчёт о продажах</h1>
<table border="1" cellpadding="5">
<thead>
<tr><th>Товар</th><th>Количество</th><th>Цена</th></tr>
</thead>
<tbody>
<tr><td>Ноутбук</td><td>10</td><td>50000</td></tr>
<tr><td>Мышь</td><td>50</td><td>1500</td></tr>
</tbody>
</table>
<p><img src="logo.png" width="100" /></p>
<p>Итоговая сумма: <strong>575000 руб.</strong></p>
';
$mpdf->WriteHTML($html);
$mpdf->Output('report.pdf', \Mpdf\Output\Destination::FILE);
?>Результат: файл report.pdf с корректным отображением таблицы, изображения встроены, нумерация страниц внизу. mPDF автоматически обработал шрифты и переносы.
Пример 2. Использование TCPDF с разметкой в стиле отчёта
<?php
require_once 'vendor/autoload.php';
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
$pdf->SetCreator('My App');
$pdf->SetAuthor('Developer');
$pdf->SetTitle('Отчёт');
$pdf->AddPage();
$pdf->SetFont('dejavusans', '', 12);
$pdf->Cell(0, 10, 'Список сотрудников', 0, 1, 'C');
$pdf->Ln(5);
// Таблица
$header = array('Имя', 'Должность', 'Оклад');
$data = array(
array('Иван', 'Менеджер', '50000'),
array('Пётр', 'Разработчик', '70000'),
array('Анна', 'Аналитик', '60000')
);
// Шапка
foreach ($header as $col) {
$pdf->Cell(40, 7, $col, 1);
}
$pdf->Ln();
// Данные
foreach ($data as $row) {
foreach ($row as $cell) {
$pdf->Cell(40, 6, $cell, 1);
}
$pdf->Ln();
}
$pdf->Output('tcpdf_table.pdf', 'I');
?>Результат: PDF с таблицей, центрированным заголовком. TCPDF даёт точный контроль над позиционированием.
Пример 3. Dompdf с использованием CSS-стилей
<?php
use Dompdf\Dompdf;
require_once 'vendor/autoload.php';
$dompdf = new Dompdf();
$html = '
<style>
body { font-family: DejaVu Sans; }
h1 { color: #2c3e50; }
.price { font-weight: bold; color: #e74c3c; }
</style>
<h1>Счёт</h1>
<p class="price">Итого: 1 500 руб.</p>
<p>Дата: 2025-01-15</p>
';
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
$dompdf->stream('invoice.pdf', array('Attachment' => 0));
?>Результат: PDF с применением CSS: заголовок тёмно-синий, цена красная. Dompdf поддерживает основные свойства.
Пример 4. FPDF: создание PDF с изображением и ячейками
<?php
require_once 'vendor/autoload.php';
$pdf = new FPDF();
$pdf->AddPage();
$pdf->Image('logo.png', 10, 10, 30);
$pdf->Ln(40);
$pdf->SetFont('Arial', 'B', 16);
$pdf->Cell(80, 10, 'Название компании', 0, 0);
$pdf->Cell(40, 10, 'Адрес', 0, 1);
$pdf->Output('F'); // возвращает строку с PDF
?>Результат: простой документ с логотипом и текстом. Подходит для базовых форм.