Skip to content

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

mermaid
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| Doc

Statistiques du projet

MétriqueCoreLaravelArtisanProTotal
Fichiers source PHP14841747213
Modules1612726
Tests9087 classes908+
Assertions28 88128 881+
Niveau PHPStan1010101010

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 classes

Artisan (yeeefang/tcpdf-next-artisan)

Yeeefang\TcpdfNext\
├── Artisan\            # ChromeHtmlRenderer, BrowserPool, ChromeRendererConfig
│   └── Exception\      # ChromeNotAvailableException, ChromeRenderException, PdfParseException
└── Parser\             # PdfTokenizer, CrossRefParser, PdfReader, StreamDecoder, ResourceCollector

Laravel (yeeefang/tcpdf-next-laravel)

Yeeefang\TcpdfNext\Laravel\
├── TcpdfServiceProvider
├── Facades\Pdf
├── Http\PdfResponse
└── Jobs\GeneratePdfJob

Pro (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\             # IncrementalUpdateWriter

Initialisation 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() :

php
// 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 require et elles fonctionnent
  • Le ServiceProvider Laravel détecte automatiquement Artisan et Pro, configurant les bindings en conséquence

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