Skip to content

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().

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

php
$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.

php
$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.

php
$renderer->loadUrl('https://reports.example.com/q4-2026');

Vous pouvez définir un timeout de navigation pour éviter de bloquer sur des pages lentes :

php
$renderer->loadUrl('https://example.com/dashboard', timeoutMs: 30000);

Méthodes de sortie

Enregistrer dans un fichier

php
$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).

php
$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.

php
// Affichage inline (lecteur PDF navigateur)
$renderer->output('rapport.pdf', 'inline');

// Forcer téléchargement
$renderer->output('rapport.pdf', 'download');

Exemple complet : Facture

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

php
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

php
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

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