跳轉到

CJK 字型支援

中文(Traditional/Simplified)、日文、韓文(統稱 CJK)具有特殊的排版需求:字型檔案龐大、字符數量龐大(20,000+ 字符)、有直排與橫排兩種模式,以及複雜的標點禁則規則。CjkFontValidator 確保載入的字型符合 CJK 排版的最低需求。

CJK 字型驗證

use NextPDF\Typography\Cjk\CjkFontValidator;

$validator = CjkFontValidator::create();
$result = $validator->validate(
    fontPath: '/path/to/NotoSansCJKtc-Regular.otf',
);

if (!$result->isValid()) {
    foreach ($result->getErrors() as $error) {
        // 處理驗證錯誤
    }
}

// 驗證項目包括:
// - 包含 CJK Unified Ideographs(U+4E00–U+9FFF)
// - 具備正確的 cmap 格式 4 或格式 12
// - 直排字形(vert GSUB feature)是否存在(可選)

推薦的 CJK 字型

字型 語言 授權 備註
Noto Sans CJK TC 繁體中文 SIL OFL Google 推薦
Noto Sans CJK SC 簡體中文 SIL OFL Google 推薦
Noto Sans CJK JP 日文 SIL OFL Google 推薦
Noto Sans CJK KR 韓文 SIL OFL Google 推薦
Source Han Sans 多語言 CJK SIL OFL Adobe 發布

字型子集化策略

CJK 字型通常體積龐大(10–20 MB),子集化尤為重要:

// NextPDF 自動偵測 CJK 字型並啟用最佳化子集策略
$registry->loadFromFile(
    path: '/path/to/NotoSansCJKtc-Regular.otf',
    alias: 'NotoSansCJK-TC',
    // CJK 字型自動使用 CFF CID-keyed 子集化
);

禁則處理

日文與中文排版需要處理「禁則」(行首行尾不允許出現的字符):

use NextPDF\Typography\Cjk\KinsokuRule;

// 啟用禁則規則
$config = Configuration::create(
    cjkSettings: CjkSettings::create(
        kinsokuRule: KinsokuRule::JIS_X4051,  // JIS X 4051 標準
    ),
);
規則 說明
JIS_X4051 日文 JIS X 4051 禁則標準
GB_T15834 中文 GB/T 15834 標點標準
Custom 自訂禁則字符集

直排(Vertical Text)

use NextPDF\Typography\Cjk\WritingMode;

// 直排文字(上至下,右至左)
$document->text()->write(
    text: '這是直排文字示範',
    position: Position::at(x: 180.0, y: 30.0),
    writingMode: WritingMode::VerticalRL,  // 右至左直排
);

字距調整(字間距)

// CJK 特有的字間距設定
$document->text()->write(
    text: '文字排版示範',
    position: Position::at(x: 20.0, y: 50.0),
    letterSpacing: 2.0,  // 毫米,每字符增加 2mm 間距
);

參見