[itextsharp][002]各種中文字型設定

itextsharp,各種中文字型設定

可先參考[itextsharp][001]建立第一個中文HelloWorld的Pdf之後,便可參考本篇做各種中文字形的變化

本篇的重點就在於不同的中文字體檔案到底放在哪裡,原始的字體檔案副檔名是.ttf,而微軟再後來因為某些原因,他把某些.ttf包在一起變成.ttc,舉例來說新細明體以及細明體都被包在同一個.ttc裡面,也因此.ttf或是.ttc字體在iTextSharp裡面就有了不同的引用方法,.ttf的引用方式由於在前一篇已經使用過,因此只取前篇的片段程式碼回憶一下如下:只要直接把字體的路徑帶入到BaseFont.CreateFont()裡面即可

string chFontPath = "c:\\windows\\fonts\\simhei.ttf";//windows內建的SimHei字體(中易黑體)                            
BaseFont chBaseFont = BaseFont.CreateFont(chFontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

而.ttc的引用方式,以新細明體以及細明體為例的話,windows內建是放在C:\Windows\fonts\mingliu.ttc,這時候需要利用另外的軟體FontForge先去解開.ttc看看有什麼字體包在裡面:

FontForge Step1:官網下載並下一步下一步安裝,這部分應該不用解釋了....

FontForge Step2:執行FontForge之後,他會自動要你選擇一個檔案,這時候就選擇C:\Windows\fonts\mingliu.ttc,然後按下OK按鈕

FontForge Step3:然後就會看到細明體出現在第零個位置,新細明體出現在第一個位置

然後就可以回到iTextSharp去引用此字體了,若是要用細明體以及新細明體的話的話,檔案路徑需根據剛剛用FontForge確認的位置去稍做修改:

string chMingliu0FontPath = "c:\\windows\\fonts\\mingliu.ttc,0";//windows內建的細明體                            
string chMingliu1FontPath = "c:\\windows\\fonts\\mingliu.ttc,1";//windows內建的新細明體             

接下來的步驟就都跟.ttf的使用方式一樣。

此外,也可以透過程式碼參數的設定,將字體改成粗體、斜體、粗體斜體、有底線,只要設定參數粗體=1 or 2 or 3 or 4就可以了,舉例來說,下面的程式碼將會把字體改成粗體:

int fontStyle = 1; // 設定為粗體
string fontPath = "c:\\windows\\fonts\\simhei.ttf";
BaseFont chBaseFont = BaseFont.CreateFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
iTextSharp.text.Font myFont ;
myFont = new iTextSharp.text.Font(chBaseFont, 12, fontStyle);

這樣介紹就大致結束了,為了以後參考方便,下面直接示範標楷體、細明體、新細明體、微軟正黑體:

ps.微軟正黑體的部分,可以到微軟網站下載,雖然網頁上寫說是for win XP的,但是用win8實際下載時,下載檔案會提供vista版本的,測試安裝後也的確可使用:

https://www.microsoft.com/zh-TW/download/details.aspx?id=12072

執行結果:

完整程式碼:

//設定文件紙張大小
Document doc = new Document(new iTextSharp.text.Rectangle(300f, 300f), 0, 0, 0, 0);
Paragraph para = new Paragraph();
para.Leading = 10; //設定每行之間的間隔

//設定中文字體
string chKaiuFontPath = "c:\\windows\\fonts\\KAIU.TTF";//windows內建的標楷體
string chSimheiFontPath = "c:\\windows\\fonts\\simhei.ttf";//windows內建的中易黑體                            
string chMingliu0FontPath = "c:\\windows\\fonts\\mingliu.ttc,0";//windows內建的細明體                            
string chMingliu1FontPath = "c:\\windows\\fonts\\mingliu.ttc,1";//windows內建的新細明體                            
string chMsjhFontPath = "c:\\windows\\fonts\\msjh.ttc,0";//微軟正黑體(需另外安裝)
string chMsjhbdFontPath = "c:\\windows\\fonts\\msjhbd.ttc,0";//微軟正黑體粗體(需另外安裝)


//設定pdf檔案名稱
PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream("中文字型設定.pdf", FileMode.Create));
doc.Open();
para.Add(GetChinesePhrase(chKaiuFontPath,"我是標楷體"));
para.Add(new Paragraph("\n"));
para.Add(GetChinesePhrase(chSimheiFontPath, "我是中易黑體"));
para.Add(new Paragraph("\n"));
para.Add(GetChinesePhrase(chMingliu0FontPath,"我是細明體"));
para.Add(new Paragraph("\n"));
para.Add(GetChinesePhrase(chMingliu1FontPath,"我是新細明體"));
para.Add(new Paragraph("\n"));
para.Add(GetChinesePhrase(chMsjhFontPath, "我是微軟正黑體"));
para.Add(new Paragraph("\n"));
para.Add(GetChinesePhrase(chMsjhbdFontPath, "我是微軟正黑體(粗體)"));
para.Add(new Paragraph("\n"));
para.Add(GetChinesePhrase(chMsjhbdFontPath, "---------以下透過設定檔將字體改為粗體斜體--------"));
para.Add(new Paragraph("\n"));
para.Add(GetChinesePhrase(chMingliu1FontPath, "我是粗體的新細明體", 1));
para.Add(new Paragraph("\n"));
para.Add(GetChinesePhrase(chMingliu1FontPath, "我是斜體的新細明體", 2));
para.Add(new Paragraph("\n"));
para.Add(GetChinesePhrase(chMingliu1FontPath, "我是斜體+粗體的的新細明體", 3));
para.Add(new Paragraph("\n"));
para.Add(GetChinesePhrase(chMingliu1FontPath, "我是有底線的的新細明體", 4));
para.Add(new Paragraph("\n"));
doc.Add(para);
doc.Close();

本文使用iTextSharp版本5.5.8

附註:iTextSharp版本4.1.6測試結果:

程式碼都不用改,產出的pdf會跟版本5.5.8一樣的結果(只是在前篇[itextsharp][001]建立第一個中文HelloWorld的Pdf發生中文位置跑掉的問題便沒發生了...真奇怪)