概觀

許多文件格式與字型緊密相連。舉例來說,當使用者在 DOCX 文件中加入文字時,這段文字總是具有某種已定義的字型。某些文件格式通常會將字型資料嵌入於文件本身,例如 PDF;但其他格式,如 Office 系列,通常依賴作業系統中已安裝的字型。

字型格式也相當多樣。例如,大多數已安裝的字型以 TTF (TrueType)OTF (OpenType) 格式呈現。Office Open XML 文件同時支援 EOT (Embedded OpenType) 格式。至於網頁,最常使用的則是 WOFFWOFF2

目錄

取得所有使用的字型

在字型相關的情境中,最實用的功能就是列出並回傳字型。GroupDocs.Viewer 提供了專門的方法 GetAllFonts() —— 當文件被載入至 Viewer 類的實例時,呼叫此方法即可取得文件中使用的所有字型清單。回傳的清單中,每個字型都以實作了 IFontInfo 介面的型別呈現。此介面提供了每種可能字型的通用屬性:字型族名稱、樣式、格式以及二進位內容。

特定格式族(如 WordProcessing、Spreadsheet、Presentation 與 PDF)都有各自專屬的 IFontInfo 實作;這些實作會提供更多針對該格式族的專屬資料。例如,WordProcessingFontInfoPresentationFontInfoPdfFontInfo 型別都包含 IsEmbedded 布林屬性 —— 用以指示字型是嵌入在已載入的文件本體中,還是安裝於作業系統中。SpreadsheetFontInfo 則包含大量試算表專屬的字型資料:顏色、是否加底線或刪除線等。WordProcessingFontInfo 可能還會提供備用字型族名稱,依此類推。

下面是一個簡短範例:

using GroupDocs.Viewer;
// ...

const string filename = "sample.docx";
string inputPath = "\full\path\" + filename;

using (Viewer viewer = new Viewer(inputPath))
{
    Fonts.IFontInfo[] allFonts = viewer.GetAllFonts();
    Console.WriteLine("{0} fonts found in the '{1}' document", allFonts.Length, filename);
    foreach (Fonts.IFontInfo font in allFonts)
    {
        Console.WriteLine("Font '{0}' of '{1}' style has {2} bytes and is of '{3}' format",
            font.FamilyName,
            font.Style,
            font.Content.Length,
            font.Format);
    }
}

請注意,字型提取僅支援 WordProcessing、Spreadsheet、Presentation 與 PDF 這四大格式族;對於其他文件格式,GetAllFonts() 方法會回傳空陣列。

處理缺少的字型

當某文件於作者的機器上建立,使用了字型 “AAA”,而之後在客戶端機器上使用 GroupDocs.Viewer 進行處理時,若該機器缺少 “AAA” 字型,這種情況相當常見。此時 GroupDocs.Viewer 會嘗試 替代此字型,採用一套複雜的字型替代規則:它會分析文件的中繼資料、缺少字型的別名、文件設定、作業系統設定、已安裝於作業系統的所有可用字型清單等。最終,若因某些原因作業系統「乾淨」——根本沒有安裝任何字型,GroupDocs.Viewer 會以內嵌於 GroupDocs.Viewer 程式集 (DLL) 中的字型作為「最後備案」來替代缺少的字型。例如,對於 WordProcessing 系列格式,GroupDocs.Viewer 內部儲存了免費字型 “Fanwood”。

此時 GroupDocs.Viewer 會在文件 渲染期間(即呼叫 Viewer.View() 方法時)靜默執行字型替代動作——不會產生任何訊息或事件來說明字型替代機制被觸發、缺少哪個字型、以及被哪個字型取代,亦不會指明具體是哪一個文件。此類功能難以落實,因為很難明確、具體地定義應該以何種形式、何種內容向客戶端發送通知。

不過,GroupDocs.Viewer 為使用者提供了兩種解決方案:手動 指定 缺少的字型,或手動 替代 缺少的字型。

指定缺少的字型

當使用者事先 知道 某文件使用字型 “AAA”,且 知道 目標機器上未安裝此字型,同時手上也擁有該字型的二進位內容時,便可在呼叫 Viewer.View() 之前 指定 該字型。

若要指定一個或多個自訂字型(這些字型未安裝於目標作業系統),使用者需要 新增字型來源字型來源 本質上是一個資料夾,裡面放置了一或多個字型檔案,透過 FolderFontSource 類別來表示。而 FontSettings 類別則提供了 SetFontSources() 方法,可將 字型來源 加入至 GroupDocs.Viewer。

以下程式碼片段說明了此流程。假設「sample.docx」文件使用了稀有字型 “AAA.ttf”,而目標作業系統未安裝該字型。使用者將「AAA.ttf」放入 C:\custom_fonts 資料夾,接著建立指向此資料夾的 FolderFontSource 實例,將該實例傳入 FontSettings 靜態類別,最後將「sample.docx」渲染為 HTML。結果,輸出 HTML 文件將使用 “AAA” 字型。

using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
using GroupDocs.Viewer.Fonts;
// ...

// Specify the font source.
FolderFontSource fontSource = 
    new FolderFontSource(@"C:\custom_fonts", SearchOption.TopFolderOnly);
FontSettings.SetFontSources(fontSource);

using (Viewer viewer = new Viewer("sample.docx"))
{
    // Create an HTML file.
    HtmlViewOptions viewOptions = HtmlViewOptions.ForEmbeddedResources();
    viewer.View(viewOptions);
}

替換缺少的字型

當使用者事先 知道 某文件使用字型 “AAA”,且 知道 目標機器未安裝此字型,但手頭沒有該字型的二進位內容時,仍可指定另一個字型 “BBB” 來 取代 缺少的 “AAA”。與前述情況不同的是,這需要透過 檢視選項(view options)來設定,然後將此選項傳入 Viewer.View() 方法。

此選項稱為 DefaultFontName,屬於字串型別的屬性,定義於抽象類別 BaseViewOptions 中,因而對所有渲染選項皆通用:HtmlViewOptionsPdfViewOptionsPngViewOptionsJpgViewOptions 等。

設定此屬性後,GroupDocs.Viewer 會在渲染時使用此字型取代任何不可用的字型。例如,若文件包含非英文字符的字型,指定預設字型名稱即可確保 GroupDocs.Viewer 用具備相同字符集的字型取代缺失的字型。當然,DefaultFontName 所指定的字型必須已安裝於執行 GroupDocs.Viewer 的作業系統中。

以下程式碼示範如何設定預設字型名稱:

using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...

using (Viewer viewer = new Viewer("sample.pptx"))
{
    // Create options for rendering HTML document with embedded resources
    HtmlViewOptions viewOptions = HtmlViewOptions.ForEmbeddedResources();
   
    // Specify a default font name is the options
    viewOptions.DefaultFontName = "Courier New";
    
    // Render input PPTX to output HTML
    viewer.View(viewOptions);
}          

在 HTML 中排除字型

將文件渲染為 HTML 時,GroupDocs.Viewer 會預設將所有使用的字型匯出至 HTML 文件,確保即使瀏覽設備缺少所需字型也能正確顯示。字型可以以外部資源的形式儲存(HtmlViewOptions.ForExternalResources),亦或透過 data URI scheme 結合 base64 編碼直接嵌入 HTML 標記內(HtmlViewOptions.ForEmbeddedResources)。幾乎所有支援字型的文件格式皆支援匯出字型至 HTML:Microsoft Office(Excel 除外)、OpenDocument、電子郵件、PDF、電子書等。

然而在某些情況下此功能不受歡迎。實際上,將字型嵌入會顯著增加產出 HTML 的檔案大小。若目標機器或裝置已安裝所有使用的字型,瀏覽器即可直接使用系統字型,無需嵌入。

為了滿足此類需求,GroupDocs.Viewer 提供 排除字型 的功能,可透過兩種方式實現:排除所有字型僅排除特定字型

這兩個選項皆在 HtmlViewOptions 類別中以不同屬性呈現:

  • ExcludeFonts 為布林旗標,啟用(true)時會停用所有字型匯出。預設為停用(false)。
  • FontsToExclude 為字串清單,每個元素代表欲在產生的 HTML 中排除的字型名稱。預設為空清單——不排除任何字型。請注意,此屬性僅在 ExcludeFonts 為停用(false)時有效。

以下兩段程式碼分別示範上述兩種情況:第一段使用 ExcludeFonts,第二段使用 FontsToExclude

using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...

using (Viewer viewer = new Viewer("sample.docx"))
{
    // Create an HTML file.
    var viewOptions = HtmlViewOptions.ForEmbeddedResources();    
    viewOptions.ExcludeFonts = true;
    viewer.View(viewOptions);
}
using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...

using (Viewer viewer = new Viewer("presentation.pptx"))
{
    // Create an HTML file.
    var viewOptions = HtmlViewOptions.ForEmbeddedResources();    
    viewOptions.FontsToExclude.Add("Times New Roman");// Exclude the Times New Roman font.
    viewOptions.FontsToExclude.Add("Arial");// Exclude the Arial font.
    viewer.View(viewOptions);
}

結論

GroupDocs.Viewer 主要聚焦於將各種文件格式渲染為廣泛使用的「可視」格式——HTML、PDF、JPEG 以及 PNG。近期我們新增了多項有關字型處理的實用功能,讓使用者得以檢視與分析使用的字型、調整字型匯出行為,以及自訂字型替代機制。

相關參閱

取得免費試用版

您可以從 releases.groupdocs.com 下載 GroupDocs.Viewer for .NET 的免費試用版。亦可前往 此處 取得暫時授權,以無限制方式試用所有功能與特性。