Skip to content

架构深入解析

TCPDF-Next 由 4 个包中的 26 个模块组成,共有 213 个 PHP 源码文件

项目统计

指标CoreLaravelArtisanPro合计
PHP 源码文件14841747213
模块1612726
测试9087 classes908+
断言28,88128,881+
PHPStan level88888

命名空间对照

Core (yeeefang/tcpdf-next)

Yeeefang\TcpdfNext\
├── Core\               # Document, ObjectRegistry, TransactionManager, CrossReferenceStream
│   └── Concerns\       # 12 composable traits (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-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\            # Specialty barcodes
│   ├── 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

延迟初始化

Document 类在构造函数中只会实例化必要的子引擎:

总是初始化: DocumentData、PdfWriter、FontManager、DrawingEngine、TransformEngine、TextRenderer、HeaderFooter、ColumnLayout、BookmarkManager、LinkManager、TocBuilder、AnnotationManager、PageManager、FontMetrics

延迟加载(首次使用时才创建): FormFieldManager、LayerManager、TemplateManager、TransactionManager、BookletLayout、FileAttachment、JavaScriptManager、SvgParser、EpsParser、StructureTree、SpotColorManager、ImageLoader、BiDiResolver

这样的设计让简单文档的基础内存占用保持在最小值,同时在需要时提供完整功能。

扩展包集成

Core 包通过 class_exists() 在运行时检测扩展包:

php
// Artisan detection
$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 许可证发布。