最近把程式佈署到新機器上(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)