Avatar ·

Как добавить 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 ₽
'; $dompdf->loadHtml($html); $dompdf->setPaper('A4', 'portrait'); $dompdf->render(); // Вывод в браузер $dompdf->stream("invoice.pdf", array("Attachment" => false)); ?> ``` #### Поддержка русского языка и UTF-8 Для корректного отображения кириллицы нужно указать шрифт, поддерживающий Unicode: ```php $html = 'Привет, мир! '; ``` #### Добавление номеров страниц Dompdf поддерживает CSS для нумерации страниц: ```php $html = '
Страница
'; ``` #### Работа с изображениями Изображения можно вставлять как через 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 стоит использовать, когда производительность критична.