Avatar ·

Как добавить 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 = '

Счет-фактура №123

Товар Количество Цена Сумма
Хостинг Premium 1 5000 руб. 5000 руб.
SSL-сертификат 2 1500 руб. 3000 руб.
Итого: 8000 руб.
'; $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 = '

Заголовок с тенью

Блок 1
Блок 2
'; $mpdf->WriteHTML($html); $mpdf->Output('document.pdf', \Mpdf\Output\Destination::DOWNLOAD); ?> ``` **Когда выбирать Mpdf вместо Dompdf:** - Если нужна поддержка современных CSS-свойств (Flexbox, Grid, border-radius с градиентами) - Если PDF содержит много страниц (Mpdf оптимизирован для больших документов) - Если важна точность отображения шрифтов (встроенные шрифты DejaVu, FreeSerif) **Минусы Mpdf:** большой размер библиотеки, более медленная загрузка, сложнее настройка для новичков. Для простых счетов и квитанций лучше остаться на Dompdf.