設計理念
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 指引