itextsharp的基礎用法,這篇文章寫的就很細,大家有興趣可以看看ITextSharp使用說明
我就說一下我在實際應用中使用到的東西。
我們的項目中主要用到的就是章節(Chapter)和區域(Section)這兩個元素,基類中定義一個全局的chapter,在子類中使用addsection創建section,然后把所有的數據填充到section中,使用pdfwriter的FitsPage來檢測表格的分頁。
具體的用法:

1 //如果當前頁的剩余高度小於offset,執行括號里的內容,自動分頁的話就添加一個page 2 if (!PDFGenerate.Instance.FitPage(table,offset)) 3 { 4 section.NewPage(); 5 }
分頁之后要面對的下一個問題就是頁碼的處理了,有兩種實現方式:HeaderFooter和PdfEvent中的EndPage事件
HeaderFooter對象提供了三個構造函數,可以對頁碼進行自定義的設置。

1 //設置頁碼數是否顯示、文字水平居中方式、邊距 2 HeaderFooter(Properties attributes) 3 4 //設置頁碼數前面和后面顯示的文字,默認顯示頁碼數 5 HeaderFooter(Phrase before, Phrase after) 6 例如第一頁 7 HeaderFooter(new Phrase("第"), new Phrase("頁")) 8 9 //設置頁碼數前面的文字、頁碼數是否顯示 10 HeaderFooter(Phrase before, bool numbered)
不過由於這個頁碼是自動算的,所以,還是推薦使用PdfEvent中的EndPage事件。
自定義一個繼承PdfPageEventHelper類的類來進行EndPage事件中的操作
1 public override void OnEndPage(PdfWriter writer, Document document) 2 { 3 //write和document都有PageNumber屬性,你也可以不用 4 }
前幾天遇到了一種新的情況,一個匯總的pdf怎么拆分,比如用戶1的報表有1,2,3頁,用戶2的報表在4,5,6頁,因為EndPage事件是在把數據寫入Section之后調用的,在寫頁碼的時候無法獲取用戶的信息,寫用戶信息的時候又不知道頁碼的信息,這就需要在循環用戶信息的時候先把數據整理好然后在寫頁碼的時候來處理。
解決方案其實就相當於是多統計了一遍頁碼,在寫用戶信息的時候,定義一個私有的Document變量,指定PageEvent,這里用到了另外的一個PdfPageEventHelper類中的事件:OnCloseDocument,在關閉文檔的時候檢測一下文檔的頁數,然后添加到Dictionary中,在整體的EndPage中使用。
1 public override void OnCloseDocument(PdfWriter writer, Document document) 2 { 3 int num = document.PageNumber-1; 4 //name是用戶名,這里需要注意的是,document.PageNumber並不是最后一頁 5 //是最后一頁再加1,所以,要減一 6 _numList.add(num,_name); 7 }
因為是在之前寫好的基類上面做的,所以,很多地方考慮的很少,關於保存數據應該使用什么元素,也許是一個值得思考的問題。