HTML-парсер
Модуль Html (8 классов) предоставляет встроенный рендерер HTML в PDF. Он парсит подмножество HTML/CSS и рендерит его напрямую в PDF — без внешнего браузера.
Ключевые классы
| Класс | Назначение |
|---|---|
HtmlParser | Основная точка входа — токенизирует и рендерит HTML |
CssRule | Парсит CSS-селекторы и объявления со специфичностью |
HtmlStyleState | Отслеживает вложенный контекст стилей (шрифт, цвет, выравнивание) |
TableParser | Обрабатывает <table> — ширина колонок, объединение ячеек, заголовки |
HtmlTagHandler | Диспатчит колбэки открытия/закрытия тегов |
HtmlTokenizer | Разбивает сырой HTML на токены тегов и текста |
HtmlEntity | Декодирует именованные и числовые HTML-сущности |
InlineStyle | Парсит строки атрибутов style="..." |
writeHtml()
use Yeeefang\TcpdfNext\Core\Document;
$pdf = Document::create()
->addPage()
->setFont('DejaVuSans', '', 10)
->writeHtml('<h1>Hello World</h1><p>This is a paragraph.</p>');writeHtml(string $html, bool $ln = true, bool $fill = false, bool $reseth = false, bool $cell = false, string $align = ''): staticwriteHtmlCell()
Рендеринг HTML внутри позиционированной прямоугольной ячейки:
writeHtmlCell(float $w, float $h, float $x, float $y, string $html, mixed $border = 0, int $ln = 0, bool $fill = false, bool $reseth = true, string $align = '', bool $autopadding = true): staticПоддерживаемые HTML-теги
Блочные: <h1>–<h6>, <p>, <div>, <blockquote>, <pre>, <hr>Инлайн: <b>, <strong>, <i>, <em>, <u>, <s>, <del>, <sup>, <sub>, <span>, <code>, <a>, <br>Списки: <ul>, <ol>, <li> — вложенность до 4 уровней. Таблицы: <table>, <tr>, <th>, <td> — см. Движок таблиц ниже. Медиа: <img src="..." width="..." height="...">
Поддержка CSS
Стили могут применяться через блоки <style>, инлайн-атрибуты style или оба варианта. Парсер учитывает специфичность и порядок каскада.
| Свойство | Примеры значений |
|---|---|
font-family | DejaVuSans, Helvetica, serif |
font-size | 12pt, 16px, 1.2em |
font-weight / font-style | bold, italic, normal |
color / background-color | #ff6600, rgb(255,102,0), red |
text-align | left, center, right, justify |
text-decoration | underline, line-through, none |
line-height | 1.5, 18pt |
margin / padding | 5px, 10px 20px |
border | 1px solid #ddd |
width / height | 100%, 200px |
Парсинг CSS-правил (CssRule)
CssRule вычисляет специфичность для разрешения каскада:
- Селекторы элементов
h1,td— специфичность (0, 0, 1) - Селекторы классов
.highlight— специфичность (0, 1, 0) - Селекторы ID
#header— специфичность (1, 0, 0) - Составные селекторы
table td.active— специфичности суммируются
Равная специфичность разрешается порядком в исходном коде (последнее объявление выигрывает).
Состояние стилей (HtmlStyleState)
HtmlStyleState поддерживает стек контекстов стилей. Открывающие теги помещают состояние в стек; закрывающие — извлекают. Это обеспечивает корректное разрешение вложенных стилей без утечки в соседние элементы.
Движок таблиц (TableParser)
colspan/rowspan— горизонтальное и вертикальное объединение ячеек- Автоматическая ширина колонок — пропорциональное распределение на основе контента
- Фиксированная ширина колонок — через CSS
widthна<td>или<th> - Стилизация заголовков —
<th>получает жирный текст по умолчанию - Разрывы страниц — таблицы, превышающие высоту страницы, автоматически разбиваются
Полный пример
use Yeeefang\TcpdfNext\Core\Document;
$pdf = Document::create()
->addPage()
->setFont('DejaVuSans', '', 10)
->writeHtml('
<style>
h1 { color: #ff6600; font-size: 18pt; }
.highlight { background-color: #ffffcc; padding: 5px; }
table { border-collapse: collapse; width: 100%; }
th { background-color: #333; color: #fff; padding: 8px; }
td { border: 1px solid #ddd; padding: 8px; }
</style>
<h1>Invoice #2026-001</h1>
<p class="highlight">Due: 2026-03-01</p>
<table>
<tr><th>Item</th><th>Qty</th><th>Price</th></tr>
<tr><td>Widget A</td><td>10</td><td>$50.00</td></tr>
<tr><td colspan="2">Total</td><td><b>$50.00</b></td></tr>
</table>
');Советы
- Всегда вызывайте
setFont()передwriteHtml()— парсер использует текущий шрифт как значение по умолчанию для нестилизованного текста. - Для полной поддержки CSS3 (Flexbox, Grid, веб-шрифты) используйте вместо этого пакет Artisan.
- Большие HTML-таблицы автоматически разбиваются по страницам, когда включён автоматический разрыв страницы.