Skip to content

Analisador HTML

O módulo Html (8 classes) fornece um renderizador HTML-para-PDF embutido. Ele analisa um subconjunto de HTML/CSS e renderiza diretamente no PDF — sem navegador externo necessário.

Classes Principais

ClasseResponsabilidade
HtmlParserPonto de entrada principal — tokeniza e renderiza HTML
CssRuleAnalisa seletores e declarações CSS com especificidade
HtmlStyleStateRastreia contexto de estilo aninhado (fonte, cor, alinhamento)
TableParserTrata layout de <table> — larguras de coluna, spans, cabeçalhos
HtmlTagHandlerDespacha callbacks de abertura/fechamento de tags
HtmlTokenizerDivide HTML bruto em tokens de tag e texto
HtmlEntityDecodifica entidades HTML nomeadas e numéricas
InlineStyleAnalisa strings de atributo 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()

Renderiza HTML dentro de uma célula retangular posicionada:

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

Tags HTML Suportadas

Bloco: <h1>-<h6>, <p>, <div>, <blockquote>, <pre>, <hr>Inline: <b>, <strong>, <i>, <em>, <u>, <s>, <del>, <sup>, <sub>, <span>, <code>, <a>, <br>Listas: <ul>, <ol>, <li> — aninhamento de até 4 níveis. Tabelas: <table>, <tr>, <th>, <td> — veja Motor de Tabelas abaixo. Mídia: <img src="..." width="..." height="...">

Suporte CSS

Estilos podem ser aplicados via blocos <style>, atributos style inline, ou ambos. O analisador respeita especificidade e ordem de cascata.

PropriedadeValores de Exemplo
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

Análise de Regras CSS (CssRule)

CssRule calcula especificidade para resolução de cascata:

  • Seletores de elemento h1, td — especificidade (0, 0, 1)
  • Seletores de classe .highlight — especificidade (0, 1, 0)
  • Seletores de ID #header — especificidade (1, 0, 0)
  • Seletores compostos table td.active — especificidades são somadas

Especificidade igual é resolvida pela ordem do código (última declaração vence).

Estado de Estilo (HtmlStyleState)

HtmlStyleState mantém uma pilha de contextos de estilo. Tags de abertura empilham estado; tags de fechamento desempilham. Isso garante que estilos aninhados sejam resolvidos corretamente sem vazar para irmãos.

Motor de Tabelas (TableParser)

  • colspan / rowspan — mesclagem horizontal e vertical de células
  • Largura automática de coluna — distribuição proporcional baseada no conteúdo
  • Largura fixa de coluna — via CSS width em <td> ou <th>
  • Estilização de cabeçalho<th> recebe texto em negrito por padrão
  • Quebras de página — tabelas que excedem a altura da página quebram automaticamente

Exemplo Completo

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>
    ');

Dicas

  • Sempre chame setFont() antes de writeHtml() — o analisador usa a fonte atual como padrão para texto sem estilo.
  • Para suporte CSS3 completo (Flexbox, Grid, web fonts), use o pacote Artisan.
  • Tabelas HTML grandes quebram automaticamente entre páginas quando a quebra automática está habilitada.

Distribuído sob a licença LGPL-3.0-or-later.