设计理念
TCPDF-Next 受 TCPDF 启发,但完全从零重写,专为现代 PHP 时代打造。它不是 fork,也不是渐进式升级——而是一套基于次世代架构的全新库。
原版 TCPDF 为 PHP 社区服务了超过十年,贡献卓越。然而,其单文件、三万行的架构已无法应对现代 PDF 生成的需求:PDF 2.0 规范、PAdES 数字签名、PDF/A-4 归档,或是与 Laravel 等框架的深度集成。
TCPDF-Next 保留了 PHP 开发者熟悉的概念——addPage()、cell()、setFont()——但底层全部重新打造,以符合 2026 年的标准。
总览
| 原版 TCPDF | TCPDF-Next | |
|---|---|---|
| PHP 版本 | 5.x – 8.x | 仅限 8.5+ |
| PDF 规范 | 1.4 – 1.7 | 2.0 (ISO 32000-2:2020) |
| 架构 | 单一 ~30K 行的类 | 213 个文件、26 个模块、12 个可组合 Trait |
| 类型安全 | 无 | PHPStan level 8,backed enum,readonly 类 |
| 数字签名 | 基本 PKCS#7 | PAdES B-B (Core) → B-LTA (Pro) |
| 归档 | PDF/A-1b(部分) | PDF/A-4 (ISO 19005-4:2020) |
| HTML 渲染 | 内建(有限 CSS) | 内建 + Chrome CDP(完整 CSS3) |
| 测试 | ~50 个测试 | 908+ 个测试、28,881+ 个断言 |
| 可扩展性 | 继承单体类 | 模块化生态系 + 扩展 API |
生态系架构
TCPDF-Next 并非单体应用。它是一个由四个包组成的模块化生态系,每个包各司其职:
TCPDF-Next
Core
Core
Artisan
Chrome CDP
Chrome CDP
Laravel
Framework
Framework
Pro
Enterprise
Enterprise
- Core(148 个文件)— PDF 引擎。涵盖文档生成、排版、条码、加密及 PAdES B-B 数字签名所需的一切。
- Artisan(17 个文件)— Chrome CDP 集成,实现像素级的 HTML/CSS3 渲染。通过 Form XObject 输出可选取文字的 PDF,而非光栅化图像。
- Laravel(4 个文件)— 零配置的框架集成。Facade、HTTP 响应、队列任务、Octane 安全的绑定。
- Pro(47 个文件)— 企业级功能。PAdES B-T 到 B-LTA、PDF/A-4、HSM 签名、特殊条码。
扩展 API 是开放的:第三方开发者可以打造自己的扩展包,通过公开的接口(PdfDocumentInterface、SignerInterface、FontManagerInterface、HsmSignerInterface)接入 Core。
12 个可组合 Trait
Document 类是唯一的入口点。它的功能并非来自一个巨大的单体类,而是由 12 个专责的 Trait 组合而成:
| Trait | 职责 |
|---|---|
HasMetadata | 标题、作者、主题、关键字、语言 |
HasPages | 页面管理、尺寸、边距、页面组 |
HasTypography | 字体加载、大小、文字装饰、RTL、BiDi |
HasColors | RGB、CMYK、专色、透明度、混合模式 |
HasTextOutput | cell()、multiCell()、text()、write()、writeHtml() |
HasDrawing | 形状、渐变、图案、SVG、EPS、图像 |
HasTransforms | 缩放、旋转、平移、倾斜、镜像 |
HasLayout | 页眉页脚、栏位排版、骑马钉排版 |
HasNavigation | 书签、链接、目录、注解、文件附件 |
HasInteractive | 表单字段、图层、模板、JavaScript |
HasSecurity | 加密、数字签名、标记式 PDF、BiDi、线性化 |
HasOutput | output()、save()、getPdfData()、流式 |
所有公开方法都返回 static,支持链式 API:
php
$pdf = Document::create()
->setTitle('Invoice') // HasMetadata
->addPage() // HasPages
->setFont('Helvetica', '', 12) // HasTypography
->setFillColor(240, 240, 240) // HasColors
->cell(0, 10, 'Hello') // HasTextOutput
->save('invoice.pdf'); // HasOutput接下来
- 架构深入解析 — 命名空间对照、模块边界、延迟初始化
- 打造扩展包 — 如何构建第三方扩展包
- 为什么选择 PHP 8.5+? — 刻意的选择与 Docker 指引