Skip to content

HTML-парсер

Модуль Html (8 классов) предоставляет встроенный рендерер HTML в PDF. Он парсит подмножество HTML/CSS и рендерит его напрямую в PDF — без внешнего браузера.

Ключевые классы

КлассНазначение
HtmlParserОсновная точка входа — токенизирует и рендерит HTML
CssRuleПарсит CSS-селекторы и объявления со специфичностью
HtmlStyleStateОтслеживает вложенный контекст стилей (шрифт, цвет, выравнивание)
TableParserОбрабатывает <table> — ширина колонок, объединение ячеек, заголовки
HtmlTagHandlerДиспатчит колбэки открытия/закрытия тегов
HtmlTokenizerРазбивает сырой HTML на токены тегов и текста
HtmlEntityДекодирует именованные и числовые HTML-сущности
InlineStyleПарсит строки атрибутов style="..."

writeHtml()

php
use Yeeefang\TcpdfNext\Core\Document;

$pdf = Document::create()
    ->addPage()
    ->setFont('DejaVuSans', '', 10)
    ->writeHtml('<h1>Hello World</h1><p>This is a paragraph.</p>');
php
writeHtml(string $html, bool $ln = true, bool $fill = false, bool $reseth = false, bool $cell = false, string $align = ''): static

writeHtmlCell()

Рендеринг HTML внутри позиционированной прямоугольной ячейки:

php
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-familyDejaVuSans, Helvetica, serif
font-size12pt, 16px, 1.2em
font-weight / font-stylebold, italic, normal
color / background-color#ff6600, rgb(255,102,0), red
text-alignleft, center, right, justify
text-decorationunderline, line-through, none
line-height1.5, 18pt
margin / padding5px, 10px 20px
border1px solid #ddd
width / height100%, 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> получает жирный текст по умолчанию
  • Разрывы страниц — таблицы, превышающие высоту страницы, автоматически разбиваются

Полный пример

php
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-таблицы автоматически разбиваются по страницам, когда включён автоматический разрыв страницы.

Распространяется по лицензии LGPL-3.0-or-later.