Как добавить HTML и CSS в PDF с помощью PHP? Подробное руководство
Всем привет! Я начинающий PHP-разработчик и столкнулся с проблемой: нужно генерировать PDF-файлы, в которых будет не просто текст, а полноценная HTML-верстка с CSS-стилями. Например, я хочу сделать счет-фактуру с таблицами, цветами, шрифтами и логотипом.
Пробовал использовать FPDF, но там, как я понял, нужно позиционировать каждый элемент вручную через координаты. Это очень неудобно для сложных макетов. Мой текущий код выглядит так:
```php
AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(40,10,'Hello World!');
$pdf->Output();
?>
```
Но когда я пытаюсь вставить HTML-таблицу или стилизованный div, FPDF просто выдает ошибку. Я слышал про библиотеки вроде Dompdf и TCPDF, но не понимаю, какая из них лучше подходит для моей задачи. Мне нужно, чтобы PDF выглядел точно так же, как HTML-страница в браузере: с отступами, границами, фоновыми цветами и т.д.
Подскажите, пожалуйста, как правильно конвертировать HTML+CSS в PDF на PHP? Желательно с рабочим примером кода. Заранее спасибо!
<<>>
### Используйте Dompdf — самую популярную библиотеку для конвертации HTML+CSS в PDF
Привет! Ты на правильном пути. Для генерации PDF из HTML+CSS лучше всего использовать библиотеку **Dompdf**. Она понимает CSS 2.1 и частично CSS 3, поддерживает таблицы, изображения, шрифты и даже псевдоэлементы. Вот как решить твою задачу шаг за шагом.
#### 1. Установка через Composer
```bash
composer require dompdf/dompdf
```
#### 2. Базовый пример с HTML и CSS
```php
set('defaultFont', 'DejaVu Sans'); // Поддержка кириллицы
$options->set('isHtml5ParserEnabled', true); // Включаем HTML5 парсер
$dompdf = new Dompdf($options);
// Твой HTML с CSS (можно прямо внутри, можно загрузить из файла)
$html = '
';
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait'); // Формат и ориентация
$dompdf->render();
// Вывод в браузер
$dompdf->stream("invoice.pdf", array("Attachment" => false));
?>
```
#### 3. Важные моменты для корректной работы
- **Кириллица**: обязательно используй шрифты с кириллической поддержкой (`DejaVu Sans`, `DejaVu Serif`). Без этого русские буквы превратятся в кракозябры.
- **Изображения**: используй абсолютные пути к файлам на сервере или base64-кодировку. Относительные пути (`../images/logo.png`) не работают.
- **Сложные CSS-свойства**: Dompdf не поддерживает Flexbox и Grid. Для сложных макетов используй таблицы или абсолютное позиционирование.
- **Разрывы страниц**: можно управлять через CSS: `page-break-before: always;` или `page-break-inside: avoid;`.
#### 4. Дополнительный пример с загрузкой внешнего CSS
```php
// Если стили в отдельном файле
$html = file_get_contents('template.html');
$dompdf->loadHtml($html);
$dompdf->render();
// Сохраняем на сервер
file_put_contents('output.pdf', $dompdf->output());
```
#### 5. Альтернативы и их недостатки
- **TCPDF**: мощнее Dompdf по функционалу, но требует больше памяти и медленнее работает. Для простых счетов — оверкилл.
- **MPDF**: отлично работает с кириллицей, но тяжелый (60+ МБ). Хорош для книг и больших документов.
- **FPDF**: как ты уже понял, не умеет парсить HTML. Только ручное рисование.
**Резюме**: для 95% задач по генерации PDF из HTML+CSS на PHP используй Dompdf. Он стабилен, легок (около 5 МБ) и имеет отличную документацию. Если возникнут проблемы с отображением — проверь валидность HTML (закрытые теги, правильные кавычки) и используй inline-стили вместо внешних CSS-файлов.
<<>>
### Альтернативный подход: используйте библиотеку Mpdf для сложных макетов
Если Dompdf не справляется с твоими CSS-стилями (например, не поддерживает Flexbox или сложные таблицы), попробуй **Mpdf**. Эта библиотека тяжелее (около 60 МБ), но зато умеет:
- Поддерживать CSS 3 (включая Flexbox, Grid, трансформации)
- Работать с внешними CSS-файлами
- Иметь встроенную поддержку кириллицы (шрифты уже включены)
- Создавать водяные знаки, колонтитулы, нумерацию страниц
Пример использования:
```php
'dejavusans',
'format' => 'A4',
'margin_left' => 15,
'margin_right' => 15,
'margin_top' => 20,
'margin_bottom' => 20
]);
$html = '
';
$mpdf->WriteHTML($html);
$mpdf->Output('document.pdf', \Mpdf\Output\Destination::DOWNLOAD);
?>
```
**Когда выбирать Mpdf вместо Dompdf:**
- Если нужна поддержка современных CSS-свойств (Flexbox, Grid, border-radius с градиентами)
- Если PDF содержит много страниц (Mpdf оптимизирован для больших документов)
- Если важна точность отображения шрифтов (встроенные шрифты DejaVu, FreeSerif)
**Минусы Mpdf:** большой размер библиотеки, более медленная загрузка, сложнее настройка для новичков. Для простых счетов и квитанций лучше остаться на Dompdf.
Счет-фактура №123
| Товар | Количество | Цена | Сумма |
|---|---|---|---|
| Хостинг Premium | 1 | 5000 руб. | 5000 руб. |
| SSL-сертификат | 2 | 1500 руб. | 3000 руб. |
Итого: 8000 руб.
Заголовок с тенью
Блок 1
Блок 2
Ответов пока нет.
Войдите чтобы оставить ответ
Блоги