Skip to content

Performance

TCPDF-Next est conçu pour la génération de documents à haut débit. Cette page couvre les optimisations intégrées et les bonnes pratiques pour tirer le meilleur parti de la bibliothèque.

Cycle de vie du worker

mermaid
graph TB
    Boot["Boot: DocumentFactory"] --> Lock["Verrouiller les registres"]
    Lock --> Loop{"Requête HTTP"}
    Loop --> Create["factory.create()"]
    Create --> Gen["Générer PDF"]
    Gen --> Dispose["Disposer Document"]
    Dispose --> Loop

Initialisation paresseuse des sous-moteurs

La classe Document contient des références à plus de 20 sous-moteurs (Graphics, Typography, Barcode, Forms, Layers, etc.), mais la plupart sont initialisés paresseusement — ils ne sont créés que lors du premier accès.

Un PDF simple en texte seul ne va jamais instancier le parseur SVG, le moteur de codes-barres ou le gestionnaire de champs de formulaire. Cela maintient l'utilisation mémoire proportionnelle aux fonctionnalités réellement utilisées.

Subset de polices

Par défaut, TCPDF-Next intègre uniquement les glyphes réellement utilisés dans le document. Le FontSubsetter analyse tout le contenu textuel et retire les glyphes inutilisés des polices TrueType/OpenType avant l'intégration.

Cela peut réduire les données de police de plusieurs mégaoctets à quelques kilooctets pour les documents utilisant un jeu de caractères restreint.

php
use Yeeefang\TcpdfNext\Core\Document;

// Le subset de polices est activé par défaut — rien à activer
$pdf = Document::create()
    ->addPage()
    ->setFont('DejaVuSans', '', 12)
    ->cell(0, 10, 'Seuls ces glyphes sont intégrés.');

Compression FlateDecode

Tous les flux de contenu sont compressés avec zlib (FlateDecode). C'est activé par défaut et nécessite l'extension PHP ext-zlib. La compression réduit généralement la taille du fichier PDF de 60-80%.

Output streaming (PdfWriterChunked)

Pour les documents très volumineux, le writer fragmenté vide les données de page finalisées de manière incrémentale au lieu de garder le PDF entier en mémoire. C'est transparent — les mêmes méthodes save() et output() fonctionnent quelle que soit la taille du document.

php
use Yeeefang\TcpdfNext\Core\Document;

// Output streaming pour un document volumineux
$pdf = Document::create();
$pdf->addPage()->setFont('Helvetica', '', 10);

for ($i = 0; $i < 5000; $i++) {
    $pdf->cell(0, 5, "Ligne {$i}: contenu de données ici", newLine: true);
}

$pdf->save('document-volumineux.pdf');
// Le subset de polices et la compression FlateDecode se produisent automatiquement

Flux de références croisées

TCPDF-Next utilise des flux de références croisées (PDF 1.5+) au lieu des tables xref traditionnelles. Les flux de références croisées sont eux-mêmes compressés, résultant en des tailles de fichier plus petites — surtout pour les documents avec de nombreux objets.

Linéarisation (Fast Web View)

La linéarisation réordonne les objets PDF pour que la première page puisse être affichée avant le téléchargement complet du fichier. Activez-la pour tout PDF servi via HTTP :

php
use Yeeefang\TcpdfNext\Core\Document;

$pdf = Document::create()
    ->setLinearization(true)
    ->addPage()
    ->cell(0, 10, 'Rendu progressif dans le navigateur')
    ->save('web-optimized.pdf');

Le Linearizer insère des flux d'indices qui indiquent aux lecteurs comment récupérer les pages à la demande.

Limite de pages

La constante Document::MAX_PAGES par défaut est 10 000 pages. C'est une garde de sécurité contre les boucles infinies durant la génération. Vous pouvez la remplacer en étendant la classe si votre cas d'usage nécessite plus.

Bonnes pratiques

Réutiliser les instances de police entre les pages

Définissez la police une fois et laissez-la se propager entre les pages. Évitez d'appeler setFont() sur chaque page sauf si la police change réellement :

php
$pdf = Document::create()
    ->setFont('Helvetica', '', 10);

for ($i = 0; $i < 100; $i++) {
    $pdf->addPage()
        ->cell(0, 5, "Page {$i} contenu");
}

Utiliser les templates (XObjects) pour le contenu répété

Si chaque page a le même en-tête, pied de page ou filigrane, créez-le une fois comme template et tamponnez-le sur chaque page. Cela stocke le contenu comme un objet PDF unique référencé plusieurs fois, plutôt que de le dupliquer.

Activer la compression

La compression est activée par défaut. Ne la désactivez pas sauf si vous devez inspecter les flux PDF bruts pour le débogage.

Utiliser l'output streaming pour les documents volumineux

Pour les documents dépassant quelques centaines de pages, l'output streaming maintient l'utilisation mémoire constante quelle que soit le nombre de pages.

Subset de polices

Le subset de polices est activé par défaut. Assurez-vous de ne pas le désactiver en production — l'intégration complète de polices peut ajouter des mégaoctets à la taille du fichier.

Minimiser la portée des transactions

Les transactions stockent un snapshot complet du document. Gardez-les éphémères pour éviter de doubler l'utilisation mémoire. Voir Transactions pour les détails.

Résumé

FonctionnalitéDéfautImpact
Subset de policesActivéPolices plus petites (Ko vs Mo)
Compression FlateDecodeActivéFlux 60-80% plus petits
Flux de références croiséesActivéDonnées xref plus petites
Initialisation paresseuseActivéMémoire proportionnelle aux fonctionnalités utilisées
Output streamingAutomatiqueMémoire constante pour les documents volumineux
LinéarisationDésactivéActiver pour les PDF livrés sur le web

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