作者:唐瑤瑤 / 臺灣大學計算機及資訊網路中心程式設計組程式設計師
上一期的計中電子報中,我們向各位介紹了iTextSharp 這個十分強大且免費的PDF函式庫,相信各位對它應該已經不陌生了。接下來我們就針對幾項進階功能做介紹,包含Direct content、Header、Footer、Barcode及JavaScript等互動功能。
Part 1:Direct content
Direct content 是指在頁面的絕對位置中插入內容。範例中會使用到的是PdfContentByte及ColumnText 2個類別。首先於頁面中加入一張圖檔,接著我們在圖片的【上方 upper layer】寫字,在圖片的【下方 lower layer】畫一個矩形並填滿色彩。主要使用到的方法是PdfWriter.DirectContent 及PdfWriter.DirectContentUnder:
產生的結果如下圖:
接下來我們在頁面絕對座標位置上任意畫幾條直線:
如果是利用ColumnText 顯示文字內容於頁面絕對位置,請參考下列程式碼:
產生的結果如下圖:
Part 2:Header及Footer
如果我們希望針對每一頁都能加上Header或Footer時,除了需要用到Part 1 提到的Direct Content,最重要是要處理Page Event,也就是PdfPageEventHelper介面。
可以override 事件如下:OnChapter、OnChapterEnd、OnCloseDocument、OnEndPage、OnGenericTag、OnOpenDocument、OnParagraph、OnParagraphEnd、OnSection、OnSectionEnd、OnStartPage。我們可以針對程式需求,挑出需要使用到的事件來改寫。
在我們的範例程式中,希望能於頁尾顯示頁數及檔案建立時間。所以我們先建立Page Event class,並改寫OnOpenDocument 方法。PdfTemplate 是在每一頁頁尾用來存放總頁數的值:
接著override OnEndPage 方法。我們將在每一頁右上角Header顯示”NTU C&INC”文字;左下角Footer顯示頁數與總頁數、右下角Footer 顯示文件產生的日期與時間。使用ShowTextAligned、ShowTextMatrix、ShowText 等方法設定文字顯示的絕對位置,並保留好template 的位置以顯示總頁數:
最後 override OnCloseDocument 方法,因為template 的位置已經都保留了,所以只要填入內容即可。
Part 3:Barcode條碼
iTextSharp 提供直覺的方式來產生各種條碼,包括Barcode、QR Code 等。您也可以利用上一節的Page event 作法於每一頁頁尾產生文件條碼,使用PlaceBarcode 方法即可。程式碼很容易懂,直接複製如下:
產生結果如下圖:
Part 4:利用javascript與使用者互動
完整程式碼如下:
Javascript 程式碼很簡單:
產生的結果如下圖:
右上角會出現<列印本頁>文字,當滑鼠移上去時會顯示可以click按下的指標,按下滑鼠左鍵後,會跳出alert 視窗:
接著按下確定,會出現列印對話方塊:
上述這個功能可以用在隱藏menu bar 及tool bar 時,使用者可以於頁面上直接做列印動作。
結語
在尚未接觸用程式產生PDF 檔案之前,對PDF只有很粗淺的認識,猜測大致上應該就只是某種檔案格式。真正接觸後才發現真是挖到寶庫,尤其是有這麼強大函式庫可供使用,對程式開發者來說簡直是如虎添翼。還有沒有其他功能尚未介紹?答案是有的,而且還很多,再找時間介紹給各位讀者。各位若有需求,可以先從參考資料中開始找起,也許您會得到更多。
參考資料
-
主要教學網站
http://itextpdf.com/index.php http://www.mikesdotnetting.com/Article/80/Create-PDFs-in-ASP.NET-getting-started-with-iTextSharp
-
浮水印Watermark 製作http://footheory.com/blogs/donnfelker/archive/2008/05/11/using-itextsharp-to-watermark-write-text-to-existing-pdf-s.aspx
-
書籤Bookmark製作
http://www.mazsoft.com/blog/post/2008/04/30/Code-sample-for-using-iTextSharp-PDF-library.aspx
-
Footer 製作
http://stackoverflow.com/questions/1032614/itextsharp-creating-a-footer-page-of