HTML Renderer
La classe HtmlRenderer est le point d'entrée principal pour toutes les opérations HTML vers PDF. Elle fournit une API fluent pour charger du contenu, configurer la sortie et rendre des documents PDF.
Méthode factory
Créer une instance renderer avec la factory statique create().
use Yeeefang\TcpdfNext\Artisan\HtmlRenderer;
// Configuration par défaut (auto-détecte Chrome)
$renderer = HtmlRenderer::create();
// Avec chemin binaire Chrome personnalisé
$renderer = HtmlRenderer::create(
chromePath: '/usr/bin/google-chrome',
);
// Avec répertoire temporaire personnalisé
$renderer = HtmlRenderer::create(
chromePath: '/usr/bin/chromium',
tempDir: '/tmp/artisan-render',
);Chargement de contenu
Depuis une chaîne
Passer du HTML brut directement avec loadHtml(). La chaîne peut être un document HTML complet ou un fragment.
$renderer->loadHtml('<h1>Bonjour, monde !</h1>');Lorsque vous passez un fragment, Artisan l'enveloppe automatiquement dans un document <!DOCTYPE html> minimal.
Depuis un fichier local
Charger un fichier .html depuis le disque avec loadFile(). Les chemins relatifs vers feuilles de style, images et scripts dans le fichier sont résolus depuis le répertoire du fichier.
$renderer->loadFile('/templates/rapport-trimestriel.html');Depuis une URL
Récupérer et rendre une URL en direct avec loadUrl(). La page est chargée dans Chrome headless, donc JavaScript s'exécute et les appels AJAX se résolvent avant le rendu.
$renderer->loadUrl('https://reports.example.com/q4-2026');Vous pouvez définir un timeout de navigation pour éviter de bloquer sur des pages lentes :
$renderer->loadUrl('https://example.com/dashboard', timeoutMs: 30000);Méthodes de sortie
Enregistrer dans un fichier
$renderer->save('/output/rapport.pdf');Obtenir comme chaîne
Récupérer les octets PDF bruts pour traitement ultérieur (ex., stockage dans base de données, pièce jointe email).
$pdfContent = $renderer->toString();
// Exemple : stocker dans base de données
DB::table('documents')->insert([
'name' => 'rapport.pdf',
'content' => $pdfContent,
]);Envoyer au navigateur
Diffuser le PDF directement vers la réponse HTTP avec en-têtes appropriés.
// Affichage inline (lecteur PDF navigateur)
$renderer->output('rapport.pdf', 'inline');
// Forcer téléchargement
$renderer->output('rapport.pdf', 'download');Exemple complet : Facture
use Yeeefang\TcpdfNext\Artisan\HtmlRenderer;
$html = <<<'HTML'
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: 'Inter', sans-serif; margin: 20mm; }
.header { display: flex; justify-content: space-between; align-items: flex-start; }
.company { font-size: 24px; font-weight: 700; color: #1a237e; }
.meta { text-align: right; color: #666; font-size: 13px; }
.grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin: 30px 0; }
.grid section { padding: 15px; background: #f8f9fa; border-radius: 6px; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th { background: #1a237e; color: white; padding: 10px 12px; text-align: left; }
td { border-bottom: 1px solid #e0e0e0; padding: 10px 12px; }
tr:nth-child(even) { background: #fafafa; }
.total { font-weight: 700; font-size: 18px; text-align: right; margin-top: 20px; }
</style>
</head>
<body>
<div class="header">
<div class="company">Acme Corporation</div>
<div class="meta">
Facture #2026-001<br>
Date : 2026-02-16<br>
Échéance : 2026-03-16
</div>
</div>
<div class="grid">
<section>
<strong>Facturer à</strong><br>
Jeanne Dupont<br>
456 Avenue du Chêne<br>
Paris, 75001
</section>
<section>
<strong>Livrer à</strong><br>
Jeanne Dupont<br>
789 Rue de l'Orme<br>
Paris, 75001
</section>
</div>
<table>
<thead>
<tr>
<th>Article</th>
<th>Qté</th>
<th>Prix unitaire</th>
<th>Montant</th>
</tr>
</thead>
<tbody>
<tr><td>Développement Web</td><td>40 h</td><td>150,00 €</td><td>6 000,00 €</td></tr>
<tr><td>Design UI/UX</td><td>20 h</td><td>125,00 €</td><td>2 500,00 €</td></tr>
<tr><td>Hébergement annuel</td><td>1</td><td>1 200,00 €</td><td>1 200,00 €</td></tr>
</tbody>
</table>
<div class="total">Total : 9 700,00 €</div>
</body>
</html>
HTML;
HtmlRenderer::create()
->loadHtml($html)
->save('/factures/2026-001.pdf');Chaînage de méthodes
Chaque setter sur HtmlRenderer retourne $this, permettant un pattern builder fluent.
use Yeeefang\TcpdfNext\Artisan\HtmlRenderer;
use Yeeefang\TcpdfNext\Artisan\RenderOptions;
use Yeeefang\TcpdfNext\Artisan\StyleInjector;
HtmlRenderer::create()
->loadFile('/templates/rapport.html')
->withOptions(
RenderOptions::create()
->setPageSize('A4')
->setLandscape(false)
->setMargins(top: 15, right: 10, bottom: 15, left: 10)
->setPrintBackground(true)
)
->withStyleInjector(
StyleInjector::create()
->addCss('body { font-size: 12pt; }')
)
->save('/output/rapport-stylise.pdf');Gestion des erreurs
use Yeeefang\TcpdfNext\Artisan\HtmlRenderer;
use Yeeefang\TcpdfNext\Artisan\Exceptions\RenderException;
use Yeeefang\TcpdfNext\Artisan\Exceptions\ChromeNotFoundException;
use Yeeefang\TcpdfNext\Artisan\Exceptions\TimeoutException;
try {
HtmlRenderer::create()
->loadUrl('https://example.com/rapport-lent')
->save('/output/rapport.pdf');
} catch (ChromeNotFoundException $e) {
// Binaire Chrome non trouvé -- vérifier CHROME_PATH
logger()->error('Chrome non installé : ' . $e->getMessage());
} catch (TimeoutException $e) {
// Page trop longue à charger ou rendre
logger()->warning('Rendu timeout : ' . $e->getMessage());
} catch (RenderException $e) {
// Tout autre échec de rendu
logger()->error('Rendu échoué : ' . $e->getMessage());
}Prochaines étapes
- Render Options -- Affiner taille page, marges, en-têtes et pieds de page.
- Fonctionnalités avancées -- Fusion PDF, injection CSS, captures d'écran.