Работа с PDF в PHP: от HTML до документа

Раздел: Разработка на PHP -> Работа с PDF

Обзор способов создания 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
?>
Результат: простой документ с логотипом и текстом. Подходит для базовых форм.

Создание PDF в PHP - comments

En
Pdf file php pdf (php)