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
| Classe | Responsabilidade |
|---|---|
HtmlParser | Ponto de entrada principal — tokeniza e renderiza HTML |
CssRule | Analisa seletores e declarações CSS com especificidade |
HtmlStyleState | Rastreia contexto de estilo aninhado (fonte, cor, alinhamento) |
TableParser | Trata layout de <table> — larguras de coluna, spans, cabeçalhos |
HtmlTagHandler | Despacha callbacks de abertura/fechamento de tags |
HtmlTokenizer | Divide HTML bruto em tokens de tag e texto |
HtmlEntity | Decodifica entidades HTML nomeadas e numéricas |
InlineStyle | Analisa strings de atributo 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()
Renderiza HTML dentro de uma célula retangular posicionada:
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): staticTags 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.
| Propriedade | Valores de Exemplo |
|---|---|
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 |
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
widthem<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
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 dewriteHtml()— 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.