前言
由於在MVC項目中需要使用PDF,所以自己抽空也來看看itext,以便於豐富自己的知識吧。在此也簡單的記錄一下,說不定以后可能還用的到。
在此您可以下載你想使用的版本http://sourceforge.net/projects/itextsharp/files/itextsharp/。於是我就下載了現在最新的版本5.4.0。

下面我就在Asp.Net Mvc 3.0Web項目中創建最簡單的Hello PDF了。當然在項目中要首先引用dll文件。itextsharp.dll
第一步創建一個Document實例
public Document();
public Document(Rectangle pageSize);
public Document(Rectangle pageSize, float marginLeft, float marginRight, float marginTop, float marginBottom);
當然F12轉到定義就可以看到Document有三個構造函數。
其中第一個Document給size,color,margins都設置了默認值。查看源代碼,默認為Document(PageSize.A4, 36, 36, 36, 36);
第一個構造函數以A4頁面作為參數調用第二個構造函數。,第二個構造函數以每邊36磅頁邊距為參數調用第三個構造函數。
第二個構造函數就可以自定義頁面的大小了,例如
Rectangle pageSize = new Rectangle(144, 720); pageSize.BackgroundColor = new Color(0xFF, 0xFF, 0xDE); Document document = new Document(pageSize);
通常,你不必創建這樣的頁面,而可以從下面頁面尺寸中選擇: A0-A10, LEGAL, LETTER, HALFLETTER, _11x17, LEDGER, NOTE, B0-B5, ARCH_A-ARCH_E, FLSA 和 FLSE
可以直接 Document document =new Document(PageSize.LEGAL);
大多數情況下使用縱向頁面,如果希望使用橫向頁面,你只須使用rotate()函數: Document document = new Document(PageSize.A4.rotate());
當創建一個文件時,你還可以定義上、下、左、右頁邊距: Document document = new Document(PageSize.A5, 36, 72, 108, 180);
說明: 當創建一個矩形或設置邊距時,你可能希望知道該用什么度量單位:厘米、英寸或象素,事實上,默認的度量系統以排版單位磅為基礎得出其他單位的近似值,如1英寸=72磅,如果你想在A4頁面的PDF中創建一個矩形,你需要計算以下數據:
21 厘米 / 2.54 = 8.2677 英寸
8.2677英寸* 72 = 595 磅
29.7 厘米 / 2.54 = 11.6929 英寸
11.6929英寸* 72 = 842 磅
默認邊距為36磅即半英寸。 如果你修改了頁面尺寸,僅僅影響到下一頁,如果你修改了頁邊距,則影響到全部,故慎用。
第二步 創建Writer實例
一旦創建了Document,我們可以創建該文檔的多個Writer的實例,所有這些Writer實例均繼承自抽象類“iTextSharp.text.DocWriter”。
同時還有另外一種情況,你可以用iTextSharp.text.pdf.PdfWriter產生文檔PDF文件。
Writer類的構造函數是私有的,你只能通過下面的方法創建一個實例:
public static PdfWriter getInstance(Document document, Stream os);
你可以通過下面的方法創建一個實例:
PdfWriter writer = PdfWriter.getInstance(document, new FileStream("Chap01xx.pdf"));
但是你幾乎永遠不會用到Writer實例(除非你想創建高級PDF或者希望用一些非常特殊的函數,如ViewerPreferences 或 Encryption)。所以通過下面的辦法得到實例已經足夠了: PdfWriter.getInstance(document, new FileStream("Chap01xx.pdf"));
在第一步中創建一個文檔時,第一個參數意義不大,第二個參數可以是任何一種流,到目前為止我們一直使用System.IO.FileStream將Document寫入文件中。
第三步 打開Document
在你寫入任何實際數據之前,你可能希望通過以下幾種方法寫入一些關於本文檔的摘要:
public boolean addTitle(String title);
public boolean addSubject(String subject);
public boolean addKeywords(String keywords);
public boolean addAuthor(String author);
public boolean addCreator(String creator);
public boolean addProducer();
public boolean addCreationDate();
public boolean addHeader(String name, String content) ;
你可以選擇自己的標題、主題、關鍵字、作者、創建程序,但以下產品信息將始終被添加:
iTextSharp (或者iTextSharp的引用)和創建時間(實際上這兩種方法是自動調用的)。
打開document前要做的事: 你只能在Open方法調用之前添加摘要,這是iText開發工具提供的一個選擇。 在HTML中,報頭信息被放在文檔前面報頭標識中間,調用Open方法將導致報頭信息寫入流,因而在Document被打開后無法更改這些數據。
頁面初始化
Open方法在不同的Witer中同時會產生初始化事件,舉例來說,如果你需要一個水印或者頁眉頁角對象出現在文檔第一頁的開始處,你需要在打開文檔前添加這些,同樣的用於設置該文檔其他頁水印、頁眉、頁角、頁數和尺寸。 當調用下列方法:
public bool setPageSize(Rectangle pageSize)
public bool Add(Watermark watermark)
public void removeWatermark()
//setting Header property
public void resetHeader()
//setting Footer property
public void resetFooter()
public void resetPageCount()
//setting PageCount property
產生的結果只能在下一個新頁中看到(當在本頁調用初始化方法時)
閱讀器參數:
你可以通過下面的辦法為PDF文件指定一些閱讀器 (如Adobe Reader) 參數: public void setViewerPreferences(int preferences)
參數可以使用以下一些常量:
文件被打開時,頁面布局用到下面的其中一個 :
o PdfWriter.PageLayoutSinglePage – 同時只顯示一個頁面
o PdfWriter.PageLayoutOneColumn –單列顯示
o PdfWriter.PageLayoutTwoColumnLeft –雙列顯示,奇數頁在左
o PdfWriter.PageLayoutTwoColumnRight -雙列顯示,奇數頁在右
文件打開時,頁面模式用到下面其中之一:
o PdfWriter.PageModeUseNone – 既不顯示大鋼也不顯示縮略圖
o PdfWriter.PageModeUseOutlines – 顯示大綱
o PdfWriter.PageModeUseThumbs – 顯示縮略圖
o PdfWriter.PageModeFullScreen – 全屏模式,沒有菜單、windows控件或者其他任何windows可見控件
PdfWriter.HideToolbar – 當文檔激活時,是否隱藏閱讀程序(如Adobe Reader)的工具條
PdfWriter.HideMenubar -當文檔激活時,是否隱藏閱讀程序的菜單.
PdfWriter.HideWindowUI -當文檔激活時,是否隱藏閱讀程序的界面元素,如滾動條、導航條等,而僅僅保留文檔顯示
PdfWriter.FitWindow – 是否調整文檔窗口尺寸以適合顯示第一頁。
PdfWriter.CenterWindow – 是否將文檔窗口放到屏幕中央
在全屏模式下,指定如何顯示界面元素(選擇一個)
o PdfWriter.NonFullScreenPageModeUseNone -既不顯示大鋼也不顯示縮略圖
o PdfWriter.NonFullScreenPageModeUseOutlines – 顯示大鋼
o PdfWriter.NonFullScreenPageModeUseThumbs – 顯示縮略圖 說明:你只能在類PdfWriter中調用這些方法。
加密
打開文檔之前還要做的一件事情就是加密(如果你希望該文檔加密),要達到這個目的,你可以使用下面的方法:
public void setEncryption(boolean strength, String userPassword, String ownerPassword, int permissions);
strength 是下面兩個常量之一:
o PdfWriter.STRENGTH40BITS: 40 位
o PdfWriter.STRENGTH128BITS: 128位 (Acrobat Reader 5.0及以上版本支持)
UserPassword和ownerPassword 可以為空或零長度, 這種情況下, ownerPassword 將被隨機的字符串代替 Permissions 為下列常量之一:
o PdfWriter.AllowPrinting
o PdfWriter.AllowModifyContents
o PdfWriter.AllowCopy
o PdfWriter.AllowModifyAnnotations
o PdfWriter.AllowFillIn
o PdfWriter.AllowScreenReaders
o PdfWriter.AllowAssembly
o PdfWriter.AllowDegradedPrinting
例如:writer.setEncryption(PdfWriter.STRENGTH128BITS, "userpass", "ownerpass", PdfWriter.AllowCopy | PdfWriter.AllowPrinting);
打你試圖打開示例代碼0110產生的文件時,將要求輸入密碼('userpass'),因為添加了AllowPrinting參數,你可以打印該文檔而不會發生任何問題。
第四步 添加內容
doc.Add(new Paragraph("您好, PDF !", font));
當我們創建了兩個writer: writerA 和 writerB:
PdfWriter writerA = PdfWriter.getInstance(document, new FileStream("Chap0111a.pdf", FileMode.Create));
PdfWriter writerB = PdfWriter.getInstance(document, new FileStream("Chap0111b.pdf", FileMode.Create));
我們可以創建兩個有細微差別的文檔:
writerA.Pause();
document.add(new Paragraph("This paragraph will only be added to Chap0111b.pdf, not to Chap0111a.pdf"));
writerA.resume();
你可以比較文件: Chap0111a.pdf和Chap0111b.pdf的區別
第五步關閉 document
關閉 document 非常重要, 因為它將關閉正在運行的Writer並將內容寫入文件,該方法在最后被調用,你應該總是要關閉文檔。
示例代碼

#region//第一步定義一個Document,並設置頁面大小為A4,豎向
Document doc = new Document(PageSize.A4);
#endregion
#region//第二步創建Writer實例
PdfWriter.GetInstance(doc, new FileStream("D:\\Hello.pdf", FileMode.Create));
#endregion
#region 設置PDF的頭信息,一些屬性設置,在Document.Open 之前完成
doc.AddAuthor("作者aehyok");
doc.AddCreationDate();
doc.AddCreator("創建aehyok");
doc.AddSubject("Asp.Net Mvc 使用 itextsharp 類庫創建PDF文件的例子");
doc.AddTitle("此PDF由aehyok創建,嘿嘿");
doc.AddKeywords("Asp.Net Mvc,PDF,iTextSharp,aehyok");
//自定義頭
doc.AddHeader("Expires", "0");
#endregion
#region//第三步打開document
doc.Open();
#endregion
#region//載入字體
//"UniGB-UCS2-H" "UniGB-UCS2-V"是簡體中文,分別表示橫向字 和 // 縱向字 //" STSong-Light"是字體名稱
BaseFont baseFT = BaseFont.CreateFont(@"c:\windows\fonts\SIMHEI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
iTextSharp.text.Font font = new iTextSharp.text.Font(baseFT); //寫入一個段落, Paragraph
#endregion
#region///第四步添加內容
doc.Add(new Paragraph("您好, PDF !", font));
#endregion
#region//第五步關閉document
doc.Close();
#endregion
//打開PDF,看效果
Process.Start("D:\\Hello.pdf");
查看生成的PDF的文檔吧

