Analyse approfondie de l'architecture
TCPDF-Next est organisé en 26 modules répartis sur 4 packages, avec 213 fichiers source PHP au total.
Aperçu de l'architecture
graph TB
subgraph Core["Core (yeeefang/tcpdf-next)"]
Doc[Document] --> Font[FontRegistry]
Doc --> Img[ImageRegistry]
Doc --> Sec[SecurityEngine]
Doc --> Bar[BarcodeEngine]
end
subgraph Extensions["Extensions"]
Art["Artisan<br/>Chrome CDP"] -->|HTML→PDF| Doc
Pro["Pro<br/>PAdES B-LTA"] -->|Signing| Sec
end
subgraph Frameworks["Frameworks"]
Lara["Laravel 12"] -->|Facade| Doc
Sym["Symfony 7"] -->|Bundle| Doc
CI["CodeIgniter 4"] -->|Service| Doc
end
Adapt["Adaptation<br/>Legacy API"] -.->|Compat Layer| DocStatistiques du projet
| Métrique | Core | Laravel | Artisan | Pro | Total |
|---|---|---|---|---|---|
| Fichiers source PHP | 148 | 4 | 17 | 47 | 213 |
| Modules | 16 | 1 | 2 | 7 | 26 |
| Tests | 908 | — | 7 classes | — | 908+ |
| Assertions | 28 881 | — | — | — | 28 881+ |
| Niveau PHPStan | 10 | 10 | 10 | 10 | 10 |
Carte des espaces de noms
Core (yeeefang/tcpdf-next)
Yeeefang\TcpdfNext\
├── Core\ # Document, ObjectRegistry, TransactionManager, CrossReferenceStream
│ └── Concerns\ # 12 traits composables (HasMetadata, HasPages, ...)
├── Contracts\ # PdfDocumentInterface, SignerInterface, HsmSignerInterface, enums
├── ValueObjects\ # PageSize, Dimension, Margin, Position, Unit
├── Support\ # BinaryBuffer
├── Content\ # TextRenderer, JavaScriptManager, Hyphenator
│ └── Hyphenation\ # HyphenationPatterns
├── Typography\ # FontManager, TrueTypeParser, Type1Parser, FontSubsetter, BiDiResolver
├── Graphics\ # DrawingEngine, TransformEngine, Color, ImageLoader, SvgParser
├── Layout\ # HeaderFooter, ColumnLayout, BookletLayout, PageManager
├── Html\ # HtmlParser, TableParser, CssRule
├── Form\ # FormFieldManager, FormFlattener
├── Barcode\ # Barcode1D, Barcode2D, BarcodeRenderer
│ ├── QrCode\ # QrEncoder
│ ├── DataMatrix\ # DataMatrixEncoder
│ └── Pdf417\ # Pdf417Encoder
├── Navigation\ # BookmarkManager, LinkManager, TocBuilder, AnnotationManager
├── Accessibility\ # StructureTree, RoleMap, StructureElement
├── Security\ # Encryption + Signatures
│ ├── Encryption\ # Aes256Encryptor, SaslPrep
│ ├── Signature\ # DigitalSigner, PadesOrchestrator, CertificateInfo, SignatureAppearance
│ └── Timestamp\ # TsaClient
└── Writer\ # PdfWriter, Linearizer, ViewerPreferences, data classesArtisan (yeeefang/tcpdf-next-artisan)
Yeeefang\TcpdfNext\
├── Artisan\ # ChromeHtmlRenderer, BrowserPool, ChromeRendererConfig
│ └── Exception\ # ChromeNotAvailableException, ChromeRenderException, PdfParseException
└── Parser\ # PdfTokenizer, CrossRefParser, PdfReader, StreamDecoder, ResourceCollectorLaravel (yeeefang/tcpdf-next-laravel)
Yeeefang\TcpdfNext\Laravel\
├── TcpdfServiceProvider
├── Facades\Pdf
├── Http\PdfResponse
└── Jobs\GeneratePdfJobPro (yeeefang/tcpdf-next-pro)
Yeeefang\TcpdfNext\
├── Archive\ # PdfAManager, PdfAVersion, XmpMetadata, OutputIntent
├── Barcode\ # Codes-barres spécialisés
│ ├── MicroQr\ # MicroQrEncoder
│ ├── DotCode\ # DotCodeEncoder
│ ├── HanXin\ # HanXinEncoder
│ ├── JabCode\ # JabCodeEncoder (LDPC, interleaver, matrix)
│ ├── Gs1\ # Gs1DataParser
│ └── Imb\ # ImbEncoder
├── Security\
│ ├── Ltv\ # LtvManager, DssBuilder, OcspClient, CrlFetcher, CertificateChainValidator
│ ├── Signature\Hsm\ # Pkcs11Signer, OpenSslEngineSigner
│ ├── Timestamp\ # DocumentTimestamp
│ ├── Asn1\ # CertificateParser, AlgorithmIdentifier
│ └── CertificateTransparency\ # CtValidationResult
└── Writer\ # IncrementalUpdateWriterInitialisation lazy
La classe Document instancie uniquement les sous-moteurs essentiels dans le constructeur :
Toujours initialisés : DocumentData, PdfWriter, FontManager, DrawingEngine, TransformEngine, TextRenderer, HeaderFooter, ColumnLayout, BookmarkManager, LinkManager, TocBuilder, AnnotationManager, PageManager, FontMetrics
Lazy (null jusqu'à première utilisation) : FormFieldManager, LayerManager, TemplateManager, TransactionManager, BookletLayout, FileAttachment, JavaScriptManager, SvgParser, EpsParser, StructureTree, SpotColorManager, ImageLoader, BiDiResolver
Cela maintient une empreinte mémoire de base petite pour les documents simples tout en fournissant une fonctionnalité complète quand nécessaire.
Intégration d'extensions
Le package Core détecte les extensions à l'exécution via class_exists() :
// Détection Artisan
$rendererClass = 'Yeeefang\\TcpdfNext\\Artisan\\ChromeHtmlRenderer';
if (!class_exists($rendererClass)) {
throw new \RuntimeException(
'Chrome renderer requires yeeefang/tcpdf-next-artisan.'
);
}Cela signifie :
- Core a zéro dépendance dure sur Artisan, Laravel ou Pro
- Les extensions sont auto-chargées par Composer — juste
composer requireet elles fonctionnent - Le ServiceProvider Laravel détecte automatiquement Artisan et Pro, configurant les bindings en conséquence