FPDF 原生不支持中文,歷經 CID 字體限制(僅華文仿宋)、TrueType 轉 Type1 繁瑕流程,現代最佳實踐是直接使用 TCPDF 或 FPDF 的 Unicode 擴展版(如 FPDF-Chinese、tFPDF)。本文梳理歷史方案演進,給出生產級選型建議。
原文提供的 PDF_Chinese 類繼承 FPDF,通過 Adobe CID 字體(STSongStd-Light-Acro、MSungStd-Light-Acro)實現中文:
// 核心邏輯:註冊 Type0 CID 字體
function AddGBFont($family='GB') {
$cw = $GLOBALS['GB_widths']; // 硬編碼寬度表
$name = 'STSongStd-Light-Acro';
$CMap = 'GBKp-EUC-H';
$registry = ['ordering'=>'GB1', 'supplement'=>2];
$this->AddCIDFont($family, '', $name, $cw, $CMap, $registry);
// Bold/Italic/BI 同理
}
支持直接加載 .ttf/.otf 字體,UTF-8 原生支持,無需轉換:
composer require setasign/fpdf # 或下載 tFPDF
<?php
require 'tfpdf.php';
$pdf = new tFPDF();
$pdf->AddPage();
// 添加中文字體(僅需一次)
$pdf->AddFont('NotoSansSC', '', 'NotoSansSC-Regular.ttf', true); // true=Unicode
$pdf->AddFont('NotoSansSC', 'B', 'NotoSansSC-Bold.ttf', true);
$pdf->SetFont('NotoSansSC', '', 14);
$pdf->Write(8, '你好,世界!PHP 生成中文 PDF 如此簡單。');
$pdf->Output('demo.pdf', 'D');
?>
Noto Sans SC、Noto Serif SC)開源免費、字符全、多字重font/unifont/ 目錄或項目自定義路徑composer require tecnickcom/tcpdf
<?php
require 'vendor/autoload.php';
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
$pdf->SetCreator('MyApp');
$pdf->AddPage();
$pdf->SetFont('stsongstdlight', '', 12); // 內置中文字體
$pdf->Write(0, 'TCPDF 內置中文支持,無需額外字體文件。');
$pdf->Output('tcpdf_demo.pdf', 'I');
?>
TCPDF 內置 stsongstdlight(華文宋體)、msungstdlight(華文仿宋)等 CID 字體,零配置即用,但字體較舊、體積大。
| 需求 | 推薦方案 | 理由 |
|---|---|---|
| 簡單項目、需自定義字體、輕量 | tFPDF / FPDF-Unicode | 代碼量小、TTF直載、UTF-8原生、無依賴 |
| 複雜排版、HTML轉PDF、條碼、簽名 | TCPDF | 功能最全、內置中文、HTML支持好 |
| 高性能、大批量生成 | wkhtmltopdf / Headless Chrome | 渲染引擎級、CSS/JS全支持、可併發 |
| 遺留系統維護、已用FPDF-CID | 續用原方案 | 避免重構風險,新模塊遷移新方案 |
ttf2pt1 工具鏈老舊、易出錯、法律風險)SetAutoPageBreak(true, 20) 避免內容溢出ob_clean() 防止輸出緩衝區污染 PDF 流拋棄十年前的 CID 字體方案,擁抱 Unicode 時代。幾行代碼、一個 TTF 文件,中文 PDF 生成從未如此輕鬆。