架构深入解析
TCPDF-Next 由 4 个包中的 26 个模块组成,共有 213 个 PHP 源码文件。
项目统计
| 指标 | Core | Laravel | Artisan | Pro | 合计 |
|---|---|---|---|---|---|
| PHP 源码文件 | 148 | 4 | 17 | 47 | 213 |
| 模块 | 16 | 1 | 2 | 7 | 26 |
| 测试 | 908 | — | 7 classes | — | 908+ |
| 断言 | 28,881 | — | — | — | 28,881+ |
| PHPStan level | 8 | 8 | 8 | 8 | 8 |
命名空间对照
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 classesArtisan (yeeefang/tcpdf-nextartisan)
Yeeefang\TcpdfNext\
├── Artisan\ # ChromeHtmlRenderer, BrowserPool, ChromeRendererConfig
│ └── Exception\ # ChromeNotAvailableException, ChromeRenderException, PdfParseException
└── Parser\ # PdfTokenizer, CrossRefParser, PdfReader, StreamDecoder, ResourceCollectorLaravel (yeeefang/tcpdf-nextlaravel)
Yeeefang\TcpdfNext\Laravel\
├── TcpdfServiceProvider
├── Facades\Pdf
├── Http\PdfResponse
└── Jobs\GeneratePdfJobPro (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,并据此配置对应的绑定