[.NET]iTextsharp找不到字型檔問題(.ttf not found as file or resource)

最近把程式佈署到新機器上(Windows Server 2012 R2),但程式使用iTextsharp套PDF時意外出現找不到字型檔的問題:

System.IO.IOException: C:\Windows\Fonts\msjh.ttf not found as file or resource.

 

msjh.ttf是微軟正黑體的字型,於是檢查C:\Windows\Fonts\

使用檔案總管進入Fonts資料夾,會自動以字型圖示方式顯示,看起來有微軟正黑體啊!

改用Dir來看:

真的少了msjh.ttf,不過目錄中有msjh.ttc

  • .ttf是True type字型檔
  • .ttc則是True Type Collection字型檔,ttf的集合

 

好!抓到找不到字型的問題了,那麼要如何在ttc集合中載入指定的字型?

 


載入.ttc

假設選擇粗體,後面加上,1的索引位置就可了!

C:\WINDOWS\Fonts\msjh.ttc,1

 

好!來測試看看!

1.先新增一個單元測試專案,然後Nuget安裝iTextSharp(License Type=LGPL)

2.新增一隻測試程式,輸入以下程式碼

using iTextSharp.text;
using System.IO;
using iTextSharp.text.pdf;
....
....
[TestMethod]
public void TestFont()
{

    var doc = new Document(PageSize.A4, 50, 50, 80, 50);
    //建立pdf物件
    PdfWriter pw = PdfWriter.GetInstance(doc, new FileStream(@"C:\temp\hello.pdf", FileMode.Create));

    //字型設定
    BaseFont bf = BaseFont.CreateFont(@"C:\WINDOWS\Fonts\msjh.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
    //字體大小、顏色
    Font f = new Font(bf, 30, Font.NORMAL, Color.BLUE);

    doc.Open();
    doc.Add(new Paragraph(10f, "Hello World!", f));
    doc.Close();
}

 

3.執行測試:

寫入成功!Hello World!

 

小結:

  • 猜測Windows8.1之後新增了微軟正黑體Light字體,因此把粗體、標準及Light整合在msjh.ttc中,因此也取消了msjh.ttf。

 

 

*msjh: Microsoft JhengHai Traditional Chinese font file. (微軟正黑體)

*常見字型檔有TrueType及OpenType兩種分類,副檔名則是.ttf及.otf

 

參考

Traditional Chinese Font Files (Compact 7)

微軟正黑體