2019/12/14

itextSharp繪製表單使用攻略(如何美化)

筆者從2011年開始接觸itextsharp這個從java轉到c#的套件,累積了一些心得與大家分享。

一、itextSharp 的物件概念很徹底,從文件本體的 doc 出發,最小單元的phrase(詞彙),到paragraph(段落),乃至於table,都是以組件的方式新增到doc之中。因為用法很靈活,初學者很常會搞不清楚而寫出冗長的程式碼。

例如畫出一個表格,語法大概像下面這樣,先指定有幾欄、帶入每欄寬度、表格的寬度,以及欄位的padding預設值。可以用預設值方式設定格子的留白(padding),看起來較專業。若是padding沒設,字會跟儲存格黏再一起,感覺就像是工程師畫的 XD

float[] tbPreReqColWidth = { 250f, 250f, 250f, 250f };


PdfPTable tbCredit = new PdfPTable(4);
tbCredit.SetWidths(tbPreReqColWidth);
tbCredit.WidthPercentage = 95; //寬度
tbCredit.DefaultCell.Padding = 7;

若是宣告好 paragraph,直接用addcell方法塞進表格而產生cell的,會自動套用 DefaultCell的屬性值,如:
tbCredit.AddCell(thisTeach2);
 
若是這是個需要獨立個別屬性的儲存格,就不受到tbCredit.DefaultCell底下屬性的影響,必須都自己來。
Paragraph BriefTitle = new Paragraph("一、教師姓名:" + query1.NAME_CH.Trim() + "\n", largeFontBold);
BriefTitle.Alignment = Element.ALIGN_LEFT;



PdfPCell cellTitle = new PdfPCell(BriefTitle);
cellTitle.Colspan = 4;
cellTitle.PaddingBottom = 7;
cellTitle.BackgroundColor = new BaseColor(System.Drawing.Color.LightGray);
tbCredit.AddCell(cellTitle);
二、itextsharp如果遇到一個段落內有不同語系的語言,按照比較正規的做法,應該是針對每段不同語系的字源內容產生phrase,然後塞到paragraph內。偏偏itextsharp要顯示文字,還要吃Server上的字體,否則可能會完全不能顯示,或只顯示某些內容。

有些字體是包含不同粗細的,在新增字體的後面會多個變數去取組合內的第幾套。
public static BaseFont bfChinese = BaseFont.CreateFont("c://windows/fonts/kaiu.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
//正黑體
//public static BaseFont hei_ti = BaseFont.CreateFont("c://windows/fonts/msjh.ttc,0", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
//public static BaseFont korean = BaseFont.CreateFont("c://windows/fonts/GULIM.TTC,0", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
// public static BaseFont arial = BaseFont.CreateFont("c://windows/fonts/arial.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
 

以筆者遇過的系統而言,雖然程式與資料庫欄位都是使用萬國碼,因此理論上所有字元都可容納;但若填報單位使用的字元,使用頻率較低者,或者是非西歐語系的語文,標楷體、明體可能顯示不出來。 但是比較新問世的微軟黑體等等,則可以顯示。
另外也分享之前科普的心得,C#針對 unicode 裡特殊語言的定義叫做 named blocks,
幾個主流語言很幸運的有被界定出來。但如果是很罕見的就慘了,即使程式能把他識別出來,也要找得到能顯示的字型,才能讓它顯示在電子文件中。

大部分的西歐語言或羅馬拼音,都是字根,使用的編碼範圍不多,因此掉字的機會小一些。
中日韓文的每一個「方塊字」則是包含不同的字根,所以字若不在共同表意文字範圍內,套錯字型了則根本無法顯示那個字。word內可以顯示,是因為word會自動幫沒字型的字去湊數。若用較專門的繪圖軟體,比較看得出差別。