在 .NET 中管理腳本特定的主題字型
概覽
簡報主題可以為不同的書寫系統選擇不同的字型族。這讓仍使用主題字型的多語言文字,能在使用適合西里爾文、阿拉伯文、日文、格魯吉亞文、塔安那文等腳本的同時,遵循一致的字型配色。
主題的IFontScheme包含一個主要字型集合(通常用於標題)與一個次要字型集合(通常用於內文)。除了它們的拉丁與東亞字型屬性外,兩個集合皆透過IFonts介面暴露從書寫系統標籤到字型族名稱的對應關係。
本文說明如何檢查與修改簡報母片主題中的這些對應,並驗證變更在儲存與重新載入後仍會保留。
了解腳本標籤
腳本字型方法使用四字母 BCP 47 腳本子標籤來識別書寫系統。常見值包括:
| 腳本標籤 | 書寫系統 |
|---|---|
Cyrl |
西里爾字母 |
Arab |
阿拉伯文 |
Hans |
簡體中文 |
Jpan |
日文 |
Geor |
格魯吉亞文 |
Thaa |
塔安那文 |
這些對應屬於主題字型方案,而非個別文字片段。簡報可為主要與次要集合定義不同的對應,亦可對某些腳本省略對應。
存取與檢查腳本字型對應
使用Presentation.MasterTheme可取得簡報層級的主題。FontScheme.Major與FontScheme.Minor屬性回傳兩個IFonts集合。
呼叫IFonts.GetScriptFontMap可取得集合中的全部對應。若要查詢單一書寫系統,傳入其腳本標籤呼叫IFonts.GetScriptFont即可。若該集合未定義請求的對應,GetScriptFont 會傳回 null。
修改對應並驗證持久性
使用IFonts.SetScriptFont可建立對應或取代現有字型族。使用IFonts.RemoveScriptFont可移除對應。
以下端對端範例會讀取全部既有的主要與次要對應,查詢日文主要字型,變更西里爾主要字型,移除塔安那次要對應,儲存簡報,並重新開啟驗證兩項變更。為使移除步驟不受初始主題影響,範例會在尚未定義塔安那對應時先建立一筆。
using System;
using Aspose.Slides;
using Aspose.Slides.Export;
static void PrintScriptFontMap(string label, IFonts fonts)
{
Console.WriteLine(label);
foreach (var mapping in fonts.GetScriptFontMap())
{
Console.WriteLine($" {mapping.Key}: {mapping.Value}");
}
}
using var presentation = new Presentation();
var fontScheme = presentation.MasterTheme.FontScheme;
var majorFonts = fontScheme.Major;
var minorFonts = fontScheme.Minor;
PrintScriptFontMap("Existing major mappings:", majorFonts);
PrintScriptFontMap("Existing minor mappings:", minorFonts);
var japaneseFont = majorFonts.GetScriptFont("Jpan");
if (japaneseFont is null)
{
Console.WriteLine("No major Japanese font is defined.");
}
else
{
Console.WriteLine($"Major Japanese font: {japaneseFont}");
}
majorFonts.SetScriptFont("Cyrl", "Arial");
if (minorFonts.GetScriptFont("Thaa") is null)
{
minorFonts.SetScriptFont("Thaa", "Arial");
}
minorFonts.RemoveScriptFont("Thaa");
presentation.Save("script-font-mappings.pptx", SaveFormat.Pptx);
using var savedPresentation = new Presentation("script-font-mappings.pptx");
var savedMajorFonts = savedPresentation.MasterTheme.FontScheme.Major;
var savedMinorFonts = savedPresentation.MasterTheme.FontScheme.Minor;
var savedCyrillicFont = savedMajorFonts.GetScriptFont("Cyrl");
var savedThaanaFont = savedMinorFonts.GetScriptFont("Thaa");
if (savedCyrillicFont == "Arial")
{
Console.WriteLine("The Cyrillic mapping was preserved.");
}
else
{
Console.WriteLine("The Cyrillic mapping was not preserved.");
}
if (savedThaanaFont is null)
{
Console.WriteLine("The Thaana mapping removal was preserved.");
}
else
{
Console.WriteLine("The Thaana mapping still exists.");
}
驗證的行為與普通查詢相同:移除後儲存,GetScriptFont("Thaa") 於次要集合會傳回 null。
將主題對應與其他字型設定區分開來
腳本特定的主題對應會參與字型選取,但它解決的問題與直接的文字格式設定、字型替換與備援字型不同:
| 機制 | 目的 | 變更主題映射的影響 |
|---|---|---|
| 腳本特定主題字型映射 | 為特定書寫系統選取主要或次要主題字型。 | 仍使用對應主題字型的文字會解析為新映射的字型族。 |
| 明確指派給文字片段的字型 | 在該片段上固定請求的字型族,而非依賴主題。 | 直接格式會覆蓋主題選擇,文字可能保持不變。 |
| 字型替換 | 當請求的字型不存在或符合替換規則時,取代之。 | 替換發生在字型已被請求之後,並不會重新定義主題的腳本對應。 |
| 備援字型 | 為選取的字型未涵蓋的特定 Unicode 範圍提供字形。 | 只填補缺少的字形,並不會更改已儲存的主題對應。 |
在Presentation.MasterTheme中變更對應,只會影響仍依賴該主題的內容。文字也可能從母片、版面配置或投影片繼承主題覆寫,或使用明確指派的字型。當可見結果未遵循簡報層級對應時,請檢查這些層級。
確保映射字型可用並驗證結果
腳本映射僅儲存字型族名稱,並不會安裝或載入相對應的字型檔案。為了在渲染與匯出時保持一致,每一個映射字型必須已安裝於執行環境,或透過自訂來源(例如FontsLoader.LoadExternalFonts或LoadOptions.DocumentLevelFontSources)提供給 Aspose.Slides。請參閱自訂字型了解可用的載入選項。
驗證已儲存的映射僅能確認主題定義已保留,無法證明字型是否可用、是否包含所有必要字形,或是否會產生預期的版面配置。建議把每個必需書寫系統的代表文字渲染成影像或 PDF,然後檢查輸出。這可在簡報分發前捕捉缺字、字形覆蓋不足、備援行為與版面變更等問題。請參閱轉換 PowerPoint 簡報了解渲染與匯出範例。
常見問題
當腳本未映射時,GetScriptFont 會回傳什麼?
IFonts.GetScriptFont 在請求的腳本對應未在該主要或次要字型集合中定義時,會傳回 null。
SetScriptFont 在腳本已存在時會新增第二筆對應嗎?
不會。IFonts.SetScriptFont 只會在缺少對應時建立,若相同腳本標籤已存在則會取代該映射的字型族。
為什麼變更主題映射後部份文字沒有變化?
該文字可能已明確指派字型、繼承自其他主題覆寫,或在渲染時受到字型替換或備援的影響。簡報層級的腳本映射僅控制仍以該主題字型集合為有效格式的文字。
僅儲存並重新開啟就能驗證多語言輸出嗎?
不能。重新開啟只能驗證主題資料的持久性。還需要渲染每個必需書寫系統的代表文字,確認映射字型已安裝且包含必要字形。