Skip to content

Parseur HTML

Le module Html (8 classes) fournit un rendu HTML-to-PDF intégré. Il parse un sous-ensemble de HTML/CSS et le rend directement dans le PDF — aucun navigateur externe requis.

Classes clés

ClasseResponsabilité
HtmlParserPoint d'entrée principal — tokenise et rend le HTML
CssRuleParse les sélecteurs et déclarations CSS avec spécificité
HtmlStyleStateSuit le contexte de style imbriqué (police, couleur, alignement)
TableParserGère la mise en page <table> — largeurs de colonnes, spans, en-têtes
HtmlTagHandlerDispatche les callbacks d'ouverture/fermeture de balise
HtmlTokenizerDivise le HTML brut en tokens de balise et texte
HtmlEntityDécode les entités HTML nommées et numériques
InlineStyleParse les chaînes d'attribut 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()

Rendre le HTML à l'intérieur d'une cellule rectangulaire positionnée :

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

Balises HTML supportées

Bloc : <h1><h6>, <p>, <div>, <blockquote>, <pre>, <hr>Inline : <b>, <strong>, <i>, <em>, <u>, <s>, <del>, <sup>, <sub>, <span>, <code>, <a>, <br>Listes : <ul>, <ol>, <li> — imbriquées jusqu'à 4 niveaux. Tableaux : <table>, <tr>, <th>, <td> — voir Moteur de table ci-dessous. Média : <img src="..." width="..." height="...">

Support CSS

Les styles peuvent être appliqués via des blocs <style>, des attributs style inline ou les deux. Le parseur respecte la spécificité et l'ordre de cascade.

PropriétéValeurs exemples
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

Parsing de règles CSS (CssRule)

CssRule calcule la spécificité pour résolution de cascade :

  • Sélecteurs d'élément h1, td — spécificité (0, 0, 1)
  • Sélecteurs de classe .highlight — spécificité (0, 1, 0)
  • Sélecteurs ID #header — spécificité (1, 0, 0)
  • Sélecteurs composés table td.active — les spécificités sont sommées

La spécificité égale est résolue par ordre de source (dernière déclaration gagne).

État de style (HtmlStyleState)

HtmlStyleState maintient une pile de contextes de style. Les balises ouvrantes poussent l'état ; les balises fermantes le dépilent. Cela assure que les styles imbriqués se résolvent correctement sans fuir vers les voisins.

Moteur de table (TableParser)

  • colspan / rowspan — fusion de cellules horizontale et verticale
  • Largeur de colonne auto — distribution proportionnelle basée sur le contenu
  • Largeur de colonne fixe — via CSS width sur <td> ou <th>
  • Style d'en-tête<th> reçoit du texte gras par défaut
  • Sauts de page — les tableaux dépassant la hauteur de page cassent automatiquement

Exemple complet

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

Conseils

  • Appelez toujours setFont() avant writeHtml() — le parseur utilise la police actuelle comme défaut pour le texte non stylé.
  • Pour un support CSS3 complet (Flexbox, Grid, web fonts), utilisez plutôt le package Artisan.
  • Les grands tableaux HTML cassent automatiquement à travers les pages quand le saut de page auto est activé.

Distribué sous licence LGPL-3.0-or-later.