作者:唐瑤瑤 / 臺灣大學計算機及資訊網路中心程式設計組程式設計師
由於工作內容需要使用ASP .NET C#產生PDF檔,但是微軟的.NET framework 並沒有內建產生PDF 的功能,所以只能上網找Third-Party 提供的函式庫。請出Google大神幫忙,搜尋出來的結果有上萬筆,在沒有頭緒的情況下真是大海撈針。搜尋結果中有很多PDF 函式庫是要付費的,就先將它排除,我們將搜尋範圍縮小至free又能支援中文後,終於讓我找到一個很實用且容易上手的library — iTextSharp。
本函式庫原名是iText,主要是支援Java程式語言。之後針對Microsoft .NET C Sharp做了一個版本,也就是我們今天要介紹的iTextSharp。針對PDF檔案的製作與修改,支援的功能如下:
1. Create:Automate、Convert、Sign、Encrypt。
2. Read:Extract。
3. Update:Stamp、Fill out、Split/Merge、Convert、Sign、Encrypt。
接下來就讓我帶領大家一步一步用程式碼產生PDF 檔。
開發環境
1. 我的ASP .NET開發環境是Microsoft Visual Studio 2010 版,使用的程式語言是C#。
2. iTextSharp 目前版本是5.0.4,下載位置:http://sourceforge.net/projects/itextsharp/ 。請先下載zip,解壓縮後只有一個dll檔,利用Add Reference方式將itextsharp.dll 加入您微軟專案的Bin目錄中,就這麼簡單而且可以開始coding了。
Part 1:首先建立一個Web Application
在這個範例中,我們利用web application在Server Memory產生pdf 檔後,使用者可以自行下載瀏覽或存檔,採用的是PdfWriter類別:
若是要在Server FileSystem 先產生pdf檔,可以使用下列程式碼:
在PDF檔案內容中要顯示中文,最重要的是字型設定,如果沒有正確設定中文字型,會造成中文無法顯示的問題。首先設定基本字型:kaiu.ttf 是作業系統系統提供的標楷體字型,IDENTITY_H 是指編碼(The Unicode encoding with horizontal writing),及是否要將字型嵌入PDF 檔中。再來針對基本字型做變化,例如Font Size、粗體斜體以及顏色等。當然你也可以採用其他中文字體字型。
開啟檔案寫入內容後,將檔案關閉。
到此階段,您已經產生了一個可以在瀏覽器端下載的檔案(檔名為pdfExample.pdf)。執行程式結果如下:
選擇開啟舊檔,顯示如下圖:
Part 2:使用chunk、phrase及paragraph建立文字段落內容
Paragraph是文章段落,可由phrases (句子)組成,然後phrase又可以由chunks(文字片段)所組成。這樣的組成方式可以很方便的在文字段落中穿插不同的字型樣式。但要注意的是chunk不會自動換行,必須自行插入換行符號”\n” 或是使用Environment.NewLine。至於Paragraph有許多樣式可以設定,像是Alignment、indentation、leading及spacing 等。
執行結果如下:
Part 3:產生表格
使用 iTextSharp 產生表格是十分直覺且容易的,類似CSS的寫法。在建立table 時,可以很輕易用欄位相對寬度做設定,也可以給絕對寬度,或者單純的給予欄位數做平均等分,ex: PdfPTable table = new PdfPTable(4);。
比較值得注意的是,由於PdfPTable表格裡面,每一格叫做cell,因此在塞資料時,必須注意填寫方式是由左而右、由上而下。此外,PdfpCell 有合併欄位的功能Colspan,也有合併列的功能Rowspan,我們可以利用這兩項特性將平淡的表格做些變化。請參考下面的範例:
執行結果如下圖:
Part 4:插入圖片
iTextSharp 支援的image type包括:JPEG, JPEG2000, GIF, PNG, BMP, WMF, TIFF, and JBIG2。除了可以讀取伺服器本地端圖檔外,也可以直接指定圖檔的URL位置。我們延續表格的範例實作如下:
執行結果如下圖:
Part 5:書籤
iTextSharp 是透過Chapter類別及Section類別來產生樹狀結構的書籤功能。最上層的書籤必須是Chapter,且每個Chapter之開始必定是一個New Page,就是會自動換頁的意思。Section則須在Chapter 物件中,或是在另一個Section物件中,無法單獨存在。
若要使用者一開啟PDF檔案時,書籤列就自動展開,請加上這一行程式碼:
PdfWriter.ViewerPreferences = PdfWriter.PageModeUseOutlines;
|
執行結果如下圖:
Part 6:浮水印
iTextSharp 產生浮水印(Watermark)的方式是使用PdfStamper 類別,且必須是針對已經產生之pdf檔做加工。在我們的範例中,請先產生一個儲存在server 端的檔案,再經由PdfReader物件讀進來處理。
執行結果如下圖:
Part 7:文章加密及保護
若要使用者必須輸入密碼才能開啟pdf檔,iTextSharp的做法是針對已經產生之pdf檔做加工。在我們的範例中,請先產生一個儲存在server 端的檔案,再經由PdfReader物件讀進來處理。一切安全性設定都是使用PdfEncryptor 物件。
PdfEncryptor.Encrypt (PdfReader reader, Stream os, bool strength, string userPassword, string ownerPassword, int permissions);
上述主要函式中,可以設定user password 及owner password。一旦設定後,每次打開PDF 檔時都必須輸入密碼。User password 可以讀檔,但不能列印及修改儲存;owner password 則具有全部權限。
下圖可以看到列印及存檔的圖示都被disable了
如果想要隱藏Menu Bar 及工具列,只要簡單的設定PdfWriter.ViewerPreferences,這在之前介紹自動開啟書籤的做法時有使用過。
PdfWriter.ViewerPreferences = PdfWriter.HideMenubar |
PdfWriter.HideToolbar;
|
針對被保護的文件,如果想開放某些權限,例如讓使用者能列印,做法是在PdfEncryptor 物件中設定如下:
PdfEncryptor.Encrypt(reader, memoryStream,null,null,
PdfWriter.AllowAssembly |PdfWriter.AllowFillIn|
PdfWriter.AllowScreenReaders|PdfWriter.AllowPrinting, false);
|
Part 8:Metadata
我們可以在PDF 文件的metadata 中寫入一些值,但為防止被修改,建議搭配PdfEncryptor 物件使用。
doc1.AddTitle("介紹DPDF");
doc1.AddAuthor("Dana Tang");
doc1.AddSubject("This example shows how to add metadata");
doc1.AddKeywords("Metadata, iTextSharp, PDF");
doc1.AddCreator("Using iTextSharp");
doc1.Open();
|
開啟PDF檔,選擇工具列【檔案】→【內容】,即會看到如下圖所顯示:
大功告成!是不是覺得iTextSharp 功能很強大?我們現在已經可以產生一個專業級的PDF檔。事實上,iTextSharp還有許多進階功能,像是Header、Footer、Barcode、Direct content及JavaScript等互動功能,就留待下次再介紹給各位。
參考資料
1.主要教學網站
http://itextpdf.com/index.php http://www.mikesdotnetting.com/Article/80/Create-PDFs-in-ASP.NET-getting-started-with-iTextSharp
2.浮水印Watermark製作
http://footheory.com/blogs/donnfelker/archive/2008/05/11/using-itextsharp-to-watermark-write-text-to-existing-pdf-s.aspx
3.書籤Bookmark製作
http://www.mazsoft.com/blog/post/2008/04/30/Code-sample-for-using-iTextSharp-PDF-library.aspx
4.Footer 製作
http://stackoverflow.com/questions/1032614/itextsharp-creating-a-footer-page-of