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
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 --> LoopInitialisation 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.
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.
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 automatiquementFlux 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 :
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 :
$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éfaut | Impact |
|---|---|---|
| Subset de polices | Activé | Polices plus petites (Ko vs Mo) |
| Compression FlateDecode | Activé | Flux 60-80% plus petits |
| Flux de références croisées | Activé | Données xref plus petites |
| Initialisation paresseuse | Activé | Mémoire proportionnelle aux fonctionnalités utilisées |
| Output streaming | Automatique | Mémoire constante pour les documents volumineux |
| Linéarisation | Désactivé | Activer pour les PDF livrés sur le web |