使用 PHPPowerPoint 生成 PPTX 文件,設置中文字體(如「楷體_GB2312」),導出後打開發現中文仍顯示為默認字體 Arial,而英文數字字體設置生效。對比 Word 另存為 PPTX 的 XML 結構發現差異。
<a:rPr>
<a:ea typeface="楷體_GB2312" pitchFamily="49" charset="-122"/>
</a:rPr>
<a:t>中文內容</a:t>
<a:rPr>
<a:latin typeface="楷體_GB2312" />
</a:rPr>
<a:t>中文內容</a:t>
ea vs latinOffice Open XML (ECMA-376) 規範中,<a:rPr>(運行屬性)下的字體屬性按**文字腳本類型**分類:
latin (Latin):拉丁文/西文字符(英文、數字、標點)。ea (East Asian):東亞文字(中文、日文、韓文漢字/假名)。cs (Complex Script):複雜腳本(阿拉伯文、希伯來文、印地文等)。**PHPPowerPoint 僅設置了 latin**,導致渲染引擎在遇到中文字符時,找不到對應的 ea 字體定義,回退到默認字體(Arial)。Word 正確同時寫入 ea(含 pitchFamily、charset 等屬性)。
在 PHPPowerPoint/Style/Font.php 的 getStyleArray() 或導出 XML 的相關方法中,找到生成 <a:latin> 的邏輯。
ea (和 cs) 節點// 伪代碼示例
$fontArray = [
'latin' => ['typeface' => $this->getName()],
'ea' => ['typeface' => $this->getName(), 'pitchFamily' => 49, 'charset' => -122], // 東亞字體屬性
'cs' => ['typeface' => $this->getName()], // 複雜腳本兜底
];
// 導出 XML 時遍歷生成對應節點
pitchFamily="49":字體家族標識(49 通常表示 TrueType 字體)。charset="-122":字符集標識(-122 對應 GB2312/GBK 中文字符集)。具體值可參考 ECMA-376 Part 1 §17.8.2.10。ppt/slides/slide1.xml 中 <a:rPr> 是否包含 <a:ea typeface="楷體_GB2312" pitchFamily="49" charset="-122"/>。PHPPowerPoint 字體設置缺失 East Asian (ea) 字體定義,導致中文回退默認字體。補全 ea 節點並設置正確的 pitchFamily、charset 即可解決。建議向上游提交 PR 修復此長期缺陷。