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
| Classe | Responsabilité |
|---|---|
HtmlParser | Point d'entrée principal — tokenise et rend le HTML |
CssRule | Parse les sélecteurs et déclarations CSS avec spécificité |
HtmlStyleState | Suit le contexte de style imbriqué (police, couleur, alignement) |
TableParser | Gère la mise en page <table> — largeurs de colonnes, spans, en-têtes |
HtmlTagHandler | Dispatche les callbacks d'ouverture/fermeture de balise |
HtmlTokenizer | Divise le HTML brut en tokens de balise et texte |
HtmlEntity | Décode les entités HTML nommées et numériques |
InlineStyle | Parse les chaînes d'attribut 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()
Rendre le HTML à l'intérieur d'une cellule rectangulaire positionnée :
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): staticBalises 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-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 |
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
widthsur<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
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()avantwriteHtml()— 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é.