Skip to content

アーキテクチャ詳細

TCPDF-Next は 4 つのパッケージにわたる 26 のモジュールに整理されており、合計 213 の PHP ソースファイルで構成されています。

プロジェクト統計

指標CoreLaravelArtisanPro合計
PHP ソースファイル14841747213
モジュール1612726
テスト9087 クラス908+
アサーション28,88128,881+
PHPStan レベル88888

名前空間マップ

Core (yeeefang/tcpdf-next)

Yeeefang\TcpdfNext\
├── Core\               # Document, ObjectRegistry, TransactionManager, CrossReferenceStream
│   └── Concerns\       # 12 コンポーザブルトレイト (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\     # Aes256Encryptor, SaslPrep
│   ├── Signature\      # DigitalSigner, PadesOrchestrator, CertificateInfo, SignatureAppearance
│   └── Timestamp\      # TsaClient
└── Writer\             # PdfWriter, Linearizer, ViewerPreferences, データクラス

Artisan (yeeefang/tcpdf-nextartisan)

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

Laravel (yeeefang/tcpdf-nextlaravel)

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

Pro (yeeefang/tcpdf-nextpro)

Yeeefang\TcpdfNext\
├── Archive\            # PdfAManager, PdfAVersion, XmpMetadata, OutputIntent
├── Barcode\            # 特殊バーコード
│   ├── MicroQr\        # MicroQrEncoder
│   ├── DotCode\        # DotCodeEncoder
│   ├── HanXin\         # HanXinEncoder
│   ├── JabCode\        # JabCodeEncoder (LDPC, インターリーバー, マトリクス)
│   ├── Gs1\            # Gs1DataParser
│   └── Imb\            # ImbEncoder
├── Security\
│   ├── Ltv\            # LtvManager, DssBuilder, OcspClient, CrlFetcher, CertificateChainValidator
│   ├── Signature\Hsm\  # Pkcs11Signer, OpenSslEngineSigner
│   ├── Timestamp\      # DocumentTimestamp
│   ├── Asn1\           # CertificateParser, AlgorithmIdentifier
│   └── CertificateTransparency\  # CtValidationResult
└── Writer\             # IncrementalUpdateWriter

遅延初期化

Document クラスはコンストラクタで必須のサブエンジンのみをインスタンス化します:

常に初期化: DocumentData, PdfWriter, FontManager, DrawingEngine, TransformEngine, TextRenderer, HeaderFooter, ColumnLayout, BookmarkManager, LinkManager, TocBuilder, AnnotationManager, PageManager, FontMetrics

遅延(初回使用時まで null): FormFieldManager, LayerManager, TemplateManager, TransactionManager, BookletLayout, FileAttachment, JavaScriptManager, SvgParser, EpsParser, StructureTree, SpotColorManager, ImageLoader, BiDiResolver

これにより、シンプルなドキュメントのベースメモリフットプリントを小さく保ちながら、必要に応じて完全な機能を提供できます。

拡張機能の統合

Core パッケージは class_exists() を通じてランタイムに拡張機能を検出します:

php
// Artisan の検出
$rendererClass = 'Yeeefang\\TcpdfNext\\Artisan\\ChromeHtmlRenderer';
if (!class_exists($rendererClass)) {
    throw new \RuntimeException(
        'Chrome renderer requires yeeefang/tcpdf-nextartisan.'
    );
}

これは以下を意味します:

  • Core は Artisan、Laravel、Pro に対するハード依存がゼロです
  • 拡張機能は Composer によって自動ロードされます — composer require するだけで動作します
  • Laravel ServiceProvider は Artisan と Pro を自動検出し、バインディングを適切に設定します

LGPL-3.0-or-later ライセンスの下で公開されています。