Skip to content

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

ClaseResponsabilidad
HtmlParserPunto de entrada principal — tokeniza y renderiza HTML
CssRuleAnaliza selectores CSS y declaraciones con especificidad
HtmlStyleStateRastrea el contexto de estilos anidados (fuente, color, alineación)
TableParserManeja el diseño de <table> — anchos de columna, spans, encabezados
HtmlTagHandlerDespacha callbacks de apertura/cierre de etiquetas
HtmlTokenizerDivide HTML sin procesar en tokens de etiqueta y texto
HtmlEntityDecodifica entidades HTML nombradas y numéricas
InlineStyleAnaliza cadenas 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 una celda rectangular 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

Etiquetas 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.

PropiedadValores de ejemplo
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á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 width en <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

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

Consejos

  • Siempre llama a setFont() antes de writeHtml() — 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.

Distribuido bajo la licencia LGPL-3.0-or-later.