아키텍처 심층 분석
TCPDF-Next는 4개 패키지에 걸쳐 26개 모듈로 구성되어 있으며, 총 213개의 PHP 소스 파일을 포함합니다.
프로젝트 통계
| 지표 | Core | Laravel | Artisan | Pro | 합계 |
|---|---|---|---|---|---|
| PHP 소스 파일 | 148 | 4 | 17 | 47 | 213 |
| 모듈 | 16 | 1 | 2 | 7 | 26 |
| 테스트 | 908 | — | 7개 클래스 | — | 908+ |
| 어설션 | 28,881 | — | — | — | 28,881+ |
| PHPStan 레벨 | 8 | 8 | 8 | 8 | 8 |
네임스페이스 맵
Core (yeeefang/tcpdf-next)
Yeeefang\TcpdfNext\
├── Core\ # Document, ObjectRegistry, TransactionManager, CrossReferenceStream
│ └── Concerns\ # 12개 조합 가능 트레이트 (HasMetadata, HasPages, ...)
├── Contracts\ # PdfDocumentInterface, SignerInterface, HsmSignerInterface, 열거형
├── 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, 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\ # 특수 바코드
│ ├── 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를 자동 감지하여 바인딩을 적절히 설정합니다