Analizador HTML
El módulo Html (8 clases) proporciona un renderizador HTML a PDF integrado. Analiza un subconjunto de HTML/CSS y lo renderiza directamente en el PDF — sin necesidad de un navegador externo.
Clases principales
| Clase | Responsabilidad |
|---|---|
HtmlParser | Punto de entrada principal — tokeniza y renderiza HTML |
CssRule | Analiza selectores CSS y declaraciones con especificidad |
HtmlStyleState | Rastrea el contexto de estilos anidados (fuente, color, alineación) |
TableParser | Maneja el diseño de <table> — anchos de columna, spans, encabezados |
HtmlTagHandler | Despacha callbacks de apertura/cierre de etiquetas |
HtmlTokenizer | Divide HTML sin procesar en tokens de etiqueta y texto |
HtmlEntity | Decodifica entidades HTML nombradas y numéricas |
InlineStyle | Analiza cadenas 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 una celda rectangular 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): staticEtiquetas HTML soportadas
Bloque: <h1>–<h6>, <p>, <div>, <blockquote>, <pre>, <hr>En línea: <b>, <strong>, <i>, <em>, <u>, <s>, <del>, <sup>, <sub>, <span>, <code>, <a>, <br>Listas: <ul>, <ol>, <li> — anidadas hasta 4 niveles. Tablas: <table>, <tr>, <th>, <td> — ver Motor de tablas a continuación. Medios: <img src="..." width="..." height="...">
Soporte CSS
Los estilos se pueden aplicar a través de bloques <style>, atributos inline style o ambos. El analizador respeta la especificidad y el orden de cascada.
| Propiedad | Valores de ejemplo |
|---|---|
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álisis de reglas CSS (CssRule)
CssRule computa la especificidad para la resolución de cascada:
- Selectores de elemento
h1,td— especificidad (0, 0, 1) - Selectores de clase
.highlight— especificidad (0, 1, 0) - Selectores de ID
#header— especificidad (1, 0, 0) - Selectores compuestos
table td.active— las especificidades se suman
La especificidad igual se resuelve por orden de fuente (la última declaración gana).
Estado de estilos (HtmlStyleState)
HtmlStyleState mantiene una pila de contextos de estilo. Las etiquetas de apertura apilan estado; las de cierre lo desapilan. Esto asegura que los estilos anidados se resuelvan correctamente sin filtrarse a los hermanos.
Motor de tablas (TableParser)
colspan/rowspan— fusión horizontal y vertical de celdas- Ancho automático de columna — distribución proporcional basada en el contenido
- Ancho fijo de columna — a través de CSS
widthen<td>o<th> - Estilo de encabezados —
<th>recibe texto en negrita por defecto - Saltos de página — las tablas que exceden la altura de página se dividen automáticamente
Ejemplo 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>
');Consejos
- Siempre llama a
setFont()antes dewriteHtml()— el analizador usa la fuente actual como predeterminada para texto sin estilo. - Para soporte completo de CSS3 (Flexbox, Grid, web fonts), usa el paquete Artisan en su lugar.
- Las tablas HTML grandes se dividen automáticamente entre páginas cuando el salto de página automático está habilitado.