iTextSharp 中文字型解決方案

iTextSharp 是由 iText(for Java)移植到 .NET 平台的開放原始碼專案。它是一個完全使用 C# 語言所撰寫的 PDF APIs,可以讓你即時建立 PDF 文件。然而,當你要使用 iTextSharp 來建立包含中文字型的文件時,就會面臨無法正常顯示中文的問題。這是因為 iTextSharp 只支援 14 個標準的 Type 1 英文字型,並沒有直接支援中文字型的顯示,取而代之的是你必須自行指定中文字型來源才能獲得解決,所以在此整理顯示中文字的幾種解決方案。

Windows 內建的中文字型
中文版 Windows 內建的中文字型檔可分為 True Type、True Type Collection 及 Open Type 三種字型格式。你可以在 %WINDIR%\Fonts 目錄下找到以 .ttf、.ttc 為延伸檔名的中文字型檔。以下範例將會使用標楷體字型來顯示文字:
Document document = new Document();
PdfWriter.GetInstance(
document,
new FileStream(@"cjk.pdf", FileMode.Create)
);
document.Open();

string fontPath = Environment.GetFolderPath(Environment.SpecialFolder.System) +
@"\..\Fonts\kaiu.ttf";
BaseFont bfChinese = BaseFont.CreateFont(
fontPath,
BaseFont.IDENTITY_H, //橫式中文
BaseFont.NOT_EMBEDDED
);
Font fontChinese = new Font(bfChinese, 16f, Font.NORMAL);
document.Add(new Paragraph(
"難得糊塗",
fontChinese
));
document.Close();

在上例中,你也可以使用 FontFactory 代替 BaseFont 來取得中文字型:
FontFactory.Register(fontPath);
Font fontChinese = FontFactory.GetFont("標楷體", BaseFont.IDENTITY_H, 16f);
document.Add(new Paragraph(
"吃虧是福",
fontChinese
));

CID 字型(Character Identity-keyed Fonts)
CID 字型格式通常被應用到中日韓(Chinese Japanese Korean, CJK)字元集。如果要使用 CJK 字型,你就必須搭配額外的亞洲語言包 iTextAsian-1.0.dll
Document document = new Document();
BaseFont.AddToResourceSearch("iTextAsian.dll");

PdfWriter.GetInstance(
document,
new FileStream(@"cjk.pdf", FileMode.Create)
);
document.Open();

BaseFont bfChinese = BaseFont.CreateFont(
"MHei-Medium",
"UniCNS-UCS2-H", // 橫式中文
BaseFont.NOT_EMBEDDED
);
Font fontChinese = new Font(bfChinese, 8);
document.Add(new Paragraph(
@"聰明難,糊塗難,
由聰明而轉入糊塗更難,
放一著,退一步,當下心安,非圖後來福報也。",
fontChinese
));
document.Close();

Download sample code

參考資料:
iText Tutorial: Getting fonts


Share/Save/Bookmark

0 comments :: iTextSharp 中文字型解決方案

張貼留言