Как добавить HTML и CSS в PDF на PHP: полное руководство по генерации PDF из HTML
Всем привет! Я новичок в PHP и пытаюсь создать PDF-файл с красивым оформлением для вывода счетов на моём сайте. Мне нужно, чтобы в PDF были таблицы, цвета, шрифты и картинки — в общем, полноценный HTML с CSS.
Я пробовал использовать FPDF, но там всё рисуется через методы типа `Cell()`, `Rect()` и `MultiCell()`, что дико неудобно для сложной вёрстки. Например, чтобы сделать таблицу с градиентом и закруглёнными углами, приходится писать кучу кода. А если нужно добавить CSS-стили, как в обычном HTML, то вообще непонятно.
Вот мой текущий код на FPDF, который выводит только "Hello World":
```php
AddPage();
$pdf->SetFont('Arial', 'B', 16);
$pdf->Cell(40, 10, 'Hello World!');
$pdf->Output();
?>
```
Я хочу сделать что-то вроде:
```php
$html = '
Заголовок
Текст с жирным шрифтом
';
// и чтобы это сразу превратилось в PDF
```
Подскажите, как правильно конвертировать HTML+CSS в PDF на PHP? Какие библиотеки лучше использовать? Нужно, чтобы поддерживались:
- CSS-стили (цвета, шрифты, отступы)
- Таблицы с объединёнными ячейками
- Изображения (JPG, PNG)
- Русские символы (UTF-8)
- Номера страниц
Заранее спасибо за помощь!
<<>>
### Используйте Dompdf — самую популярную библиотеку для конвертации HTML+CSS в PDF на PHP
Dompdf позволяет использовать обычный HTML и CSS точно так же, как в браузере. Она поддерживает большинство CSS-свойств, таблицы, изображения и UTF-8 (включая русский язык).
#### Установка через Composer
```bash
composer require dompdf/dompdf
```
#### Простой пример
```php
Счёт №123
Товар
Количество
Цена
Сумма
Ноутбук
2
50 000 ₽
100 000 ₽
Мышь
5
1 500 ₽
7 500 ₽
🍪
Сначала примите условия
Чтобы войти на сайт, необходимо принять соглашение об использовании файлов cookie.
Мы используем их для авторизации и улучшения работы сайта.
🍪 Мы используем файлы cookie для авторизации, аналитики и улучшения работы сайта.
Продолжая пользоваться сайтом, вы соглашаетесь с нашей
политикой конфиденциальности.
';
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
// Вывод в браузер
$dompdf->stream("invoice.pdf", array("Attachment" => false));
?>
```
#### Поддержка русского языка и UTF-8
Для корректного отображения кириллицы нужно указать шрифт, поддерживающий Unicode:
```php
$html = 'Привет, мир!
🍪
Сначала примите условия
Чтобы войти на сайт, необходимо принять соглашение об использовании файлов cookie.
Мы используем их для авторизации и улучшения работы сайта.
🍪 Мы используем файлы cookie для авторизации, аналитики и улучшения работы сайта.
Продолжая пользоваться сайтом, вы соглашаетесь с нашей
политикой конфиденциальности.
';
```
#### Добавление номеров страниц
Dompdf поддерживает CSS для нумерации страниц:
```php
$html = '
Страница
🍪
Сначала примите условия
Чтобы войти на сайт, необходимо принять соглашение об использовании файлов cookie.
Мы используем их для авторизации и улучшения работы сайта.
🍪 Мы используем файлы cookie для авторизации, аналитики и улучшения работы сайта.
Продолжая пользоваться сайтом, вы соглашаетесь с нашей
политикой конфиденциальности.
';
```
#### Работа с изображениями
Изображения можно вставлять как через URL, так и через base64:
```php
// Через URL
$html .= '';
// Через base64 (для локальных файлов)
$imageData = base64_encode(file_get_contents('logo.png'));
$html .= '';
```
#### Продвинутые настройки
```php
$dompdf = new Dompdf();
$dompdf->set_option('isHtml5ParserEnabled', true);
$dompdf->set_option('isRemoteEnabled', true); // для загрузки внешних ресурсов
$dompdf->set_option('defaultFont', 'DejaVu Sans');
$dompdf->set_option('dpi', 150); // качество изображений
$dompdf->loadHtml($html);
$dompdf->render();
// Сохранить в файл
file_put_contents('output.pdf', $dompdf->output());
// Или отправить на скачивание
$dompdf->stream("document.pdf", array("Attachment" => true));
```
#### Возможные проблемы и их решения
**Проблема:** Не отображаются кириллические символы.
**Решение:** Убедитесь, что HTML содержит `` и используйте шрифт `DejaVu Sans`.
**Проблема:** Изображения не загружаются.
**Решение:** Включите опцию `isRemoteEnabled` и проверьте, что пути к файлам корректны.
**Проблема:** Сложные CSS-стили (flexbox, grid) не работают.
**Решение:** Dompdf не поддерживает современные CSS-макеты. Используйте таблицы и позиционирование.
**Проблема:** PDF получается слишком большим.
**Решение:** Оптимизируйте изображения (сжимайте их перед вставкой) и уменьшите DPI.
#### Сравнение с другими библиотеками
| Библиотека | Поддержка CSS | UTF-8 | Сложность | Скорость |
|------------|---------------|-------|-----------|----------|
| Dompdf | Отличная | Да | Низкая | Средняя |
| TCPDF | Средняя | Да | Высокая | Быстрая |
| mPDF | Хорошая | Да | Средняя | Средняя |
| FPDF | Нет (ручное рисование) | Требует настройки | Высокая | Быстрая |
Dompdf — лучший выбор для 90% задач, если вам нужна конвертация HTML+CSS в PDF на PHP без лишней головной боли.
<<>>
### Альтернатива: TCPDF — быстрый и мощный, но требует больше кода
Если Dompdf не справляется с вашими CSS-стилями или вам нужна максимальная производительность, попробуйте TCPDF. Он быстрее Dompdf, но для стилизации придётся писать больше кода.
#### Пример с TCPDF
```php
SetCreator('My App');
$pdf->SetAuthor('Developer');
$pdf->SetTitle('Invoice');
// Добавляем шрифт для кириллицы
$pdf->AddFont('dejavusans', '', 'dejavusans.php', true);
$pdf->SetFont('dejavusans', '', 12);
$pdf->AddPage();
// HTML-контент
$html = '
Счёт-фактура
Товар
Цена
Услуга 1
5000 ₽
';
$pdf->writeHTML($html, true, false, true, false, '');
$pdf->Output('invoice.pdf', 'I');
?>
```
#### Плюсы TCPDF
- Высокая скорость генерации
- Поддержка сложных PDF-функций (аннотации, закладки, формы)
- Хорошая работа с UTF-8
#### Минусы
- CSS поддерживается хуже, чем в Dompdf (нет flexbox, grid)
- Код получается более громоздким
- Нужно вручную подключать шрифты
#### Когда выбирать TCPDF вместо Dompdf
- Если генерируете сотни PDF в минуту (высокая нагрузка)
- Если нужны сложные PDF-функции (цифровые подписи, формы)
- Если CSS-стили очень простые (только цвета и шрифты)
Для большинства веб-проектов Dompdf будет удобнее. TCPDF стоит использовать, когда производительность критична.
🍪 Мы используем файлы cookie для авторизации, аналитики и улучшения работы сайта.
Продолжая пользоваться сайтом, вы соглашаетесь с нашей
политикой конфиденциальности.