首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP FPDF 中文 PDF 生成完全指南:從 CID 字體到 TrueType 轉換實戰

     編輯:PHP 綜合知識

FPDF 原生不支持中文,歷經 CID 字體限制(僅華文仿宋)、TrueType 轉 Type1 繁瑕流程,現代最佳實踐是直接使用 TCPDF 或 FPDF 的 Unicode 擴展版(如 FPDF-Chinese、tFPDF)。本文梳理歷史方案演進,給出生產級選型建議。

歷史方案回顧:CID 字體模式(已淘汰)

原文提供的 PDF_Chinese 類繼承 FPDF,通過 Adobe CID 字體(STSongStd-Light-Acro、MSungStd-Light-Acro)實現中文:

  • 需預裝 Adobe 亞洲字體包(客戶端也需)
  • 僅支持 GBK/Big5 編碼,字體不可定制
  • 字符寬度數組硬編碼維護極其痛苦
  • PDF 體積大、兼容性差
// 核心邏輯:註冊 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 同理
}

現代最佳實踐:tFPDF / FPDF-Unicode

支持直接加載 .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');
?>

字體獲取建議

  • Google Noto 系列(Noto Sans SC、Noto Serif SC)開源免費、字符全、多字重
  • 思源黑體/宋體 開源版
  • 將 .ttf 放入 font/unifont/ 目錄或項目自定義路徑

TCPDF:功能更豐富的替代方案

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續用原方案避免重構風險,新模塊遷移新方案

核心避坑指南

  • ❌ 不要 手動轉換 TTF 到 Type1(ttf2pt1 工具鏈老舊、易出錯、法律風險)
  • ❌ 不要 硬編碼字符寬度數組(維護地獄)
  • ✅ 使用 支持 Unicode 的現代庫 + 開源 TTF 字體
  • ✅ 設置 SetAutoPageBreak(true, 20) 避免內容溢出
  • ✅ 輸出 前 ob_clean() 防止輸出緩衝區污染 PDF 流

拋棄十年前的 CID 字體方案,擁抱 Unicode 時代。幾行代碼、一個 TTF 文件,中文 PDF 生成從未如此輕鬆。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved