1. 程式人生 > >ITextSharp構造PDF檔案

ITextSharp構造PDF檔案

1.1 生成Document

Document是我們要生成的PDF檔案所有元素的容器,因此要生成一個PDF文件,必須首先定義一個Document物件。 
Document有三種建構函式: 
   public Document(); 
   public Document(Rectangle pageSize); 
   public Document(Rectangle pageSize, float marginLeft,    float marginRight, float marginTop, float marginBottom); 
第一種方法沒有定義任何引數,生成的文件將自動採用A4大小的紙張;第二種方法,使用者可以定義紙張的大小;而第三種方法中,使用者不僅可以定義紙張大小,而且還能定義頁面的左右上下邊距。 
我們通過下面的語句定義一個Document物件,頁面大小為A4,四周邊距均為50。 
    Document document = new Document(PageSize.A4, 50, 50, 50, 50);
如果頁面需要採用橫排模式,只要修改第一個引數就行: 
Document doc = new Document(PageSize.A4.rotate(),50,50,50,50);

1.2 指定Document型別為PDF

定義了Document物件後,緊接著需要指定Document物件的型別。因為使用iText庫不僅支援PDF文件的建立,還可以支援Html、RTF、Xml、Word等多種文件型別,我們要生成PDF文件格式,需要呼叫如下的方法: 

PdfWriter writer = PdfWriter.getInstance(document, 
                  new FileOutputStream("c:\\ITextTest.pdf")); 
如果你想建立的不是PDF文件,則可以根據你想建立的文件型別選擇建立HtmlWriter、RtfWriter、XmlWriter、RtfWriter2(注:word文件)物件,具體支援的文件型別可以檢視iText的API文件。 
你可以設定生成的PDF文件外觀,比如是否顯示選單欄、工具欄等,設定方法如下: 
writer.setViewerPreferences(PdfWriter.HideMenubar); 
writer.setViewerPreferences(PdfWriter.HideToolbar); 
writer.setViewerPreferences(PdfWriter.HideMenubar 
                  | PdfWriter.HideToolbar); 
第一條語句隱藏了選單欄,第二條語句隱藏了工具欄,第三條語句則可以同時實現選單欄和工具欄的隱藏。

1.3Document中寫入內容

到此為止我們已經成功建立了一個PDF文件,現在可以往裡寫入資料了。 
為了寫入資料,我們首先要做的事將當前文件開啟: 
    document.open(); 
常用的構成PDF檔案的元素有Chunk、Paragraph、Phrase、List、Image、Table等,下面我們對它們進行簡單的介紹。

1.4 Chunk

Chunk是可以往Document中新增的最小元素,你可以將其直接新增到Document中,document.add(new Chunk("ZipCode")); 
你可以為Chunk物件指定顏色,字型,但是一個Chunk物件只能有一種顏色和字型,也就是說Chunk就是一個“原子”物件,你無法讓一個Chunk物件中的不同字元擁有不同的屬性。 
Chunk物件一個有趣的功能就是可以為其下劃線、上劃線、刪除線。 
Chunk title = new Chunk("Title", titleFont); 
title.setUnderline(Color.BLACK, 2.0f, 0.0f, 24.0f, 0.0f, PdfContentByte.LINE_CAP_BUTT); title.setUnderline(Color.BLACK, 2.0f, 0.0f, -12.0f, 0.0f, PdfContentByte.LINE_CAP_BUTT); 
通過呼叫setUnderline()方法並設定引數,你可以將線段新增在Chunk物件的任意位置,還可以設定線段的顏色、粗細和形狀(圓頭線、平頭線等)。 
除了直接將Chunk物件加入文件中以外,你也可以將其作為更高階的PDF元素的一部分,比如: 
Paragraph p = new Paragraph(); 
Chunk chunk = new Chunk("總經理"); 
p.add(chunk);

1.5 Paragraph

Paragraph顧名思義就是段落的意思,就好像Word中的一個段落,你可以定義它的段前間距,段後間距、段落對齊方式、左右縮排: 
 p.setAlignment(Element.ALIGN_JUSTIFIED);

 p.setIndentationLeft(15f);

p.setIndentationRight(15f); 
p.setSpacingBefore(15f); 
p.setSpacingAfter(5f); 
第一條語句定義了段落p的對齊方式,第二條語句定義了p的左側縮排距離,第三條語句定義了p的右側縮排距離,第四條語句定義了p的段前間距,第五條語句定義了p的段後間距,可以根據實際需要定義相應的值。 
定義好一個Paragraph物件之後,將其加入文件中。 
document.add(p);   

1.6  Phrase

Phrase實現的功能與Paragraph相似,假如想要往文件中新增一個段落是,我們還是覺得使用Paragraph物件比較合適。 

Phrase有許多種構造方式,通常我們只需要new Phrase(String string)或者new Phrase(String string, Font font)就可以建立一個Phrase物件了。但是還有類似Phrase(float leading, String string) 這樣的建構函式。引數leading設定的是Phrase物件的行間距,當Phrase內容超過一行時,這個引數的作用就會展現出來。通常leading都應該是一個正值,不過如果你把它設定為一個負值的話,也會發現有趣的事情發生。

1.7 List

List類實現的效果類似於Word中的“專案符號和編號”,你可以通過下面的方法建立一個List物件: 
List l = new List(true, false, 10); 
l.add(new ListItem("First item of list")); 
l.add(new ListItem("Second item of list")); 
new List(true, false, 10)函式的第一個引數指明瞭你建立的是否是一個有編號的列表,true表示建立的是一個有編號的列表;第二個引數表示是否採用字母進行編號,true為字母,false為數字;第三個引數是列表的縮排量。 
列表有列表項組成,ListItem就是List的列表項,建立完列表項之後通過add()方法就可以將其加入列表中。 
你也可以直接將一個字串加入List列表: 
l.add("Third item of list"); 
你也可以建立一個新的List物件,將它加入到當前List物件中: 
List sublist = new List(false, true, 10); 
    sublist.add("First subitem of third item"); 
    sublist.add("Second subitem of third item"); 
l.add(sublist);         
最後將List物件加入到文件中。 
document.add(l);

1.8 TablePdfPTable

要在PDF檔案中建立表格,iText為我們提供了兩個類,Table和PdfPTable。兩種方法各有優點,總的來說Table型別的表格實現起來相對比較簡單,但如果需要實現的表格比較複雜,有時就必須使用PdfPTable類。 
首先簡單介紹一下使用Table類生成表格的方法: 
    Table t = new Table(3, 2); 
    t.setBorderColor(Color.white); 
    t.setPadding(5); 
    t.setSpacing(5); 
    t.setBorderWidth(1); 
第一行程式建立了一個3x2的表格,其後的程式分別設定了表格的邊框顏色、單元格內文字間距、單元格間距、邊框寬度。如果使用者不希望顯示錶格邊框,只需要將邊框顏色設定成與背景色一致就行。由於預設的文件背景色為白色,因此我們把表格的邊框顏色也設定為白色。 
表格是有一個個單元格組成的。單元格的建立方法如下: 
    Cell c1 = new Cell("Header1"); 
    t.addCell(c1); 
這樣我們就在表格的第一行第一列中寫入了內容“Header1”。使用同樣的方法我們可以繼續往表格中加入內容。你會發現我們並沒有指定單元格在表格中的位置,那麼程式為怎樣將我們加入的單元格加到哪裡呢?程式預設的加入單元格順序是從第一行第一列開始,以行的順序從左往右一次加入單元格,等第一行放滿之後再從第二行第一列開始,依次從左往右填充表格。 
如果你不想按照程式預設的順序往表格中寫入內容,也可以呼叫addCell(Cell aCell, int row, int column)或addCell(Cell aCell, Point aLocation)方法,都可以將內容直接放入你指定的表格位置。 
可以將一個表格加入另一個表格中,即表格的巢狀,實現的方式是insertTable(Table table)。 
    Table subTable = new Table(2, 2); 
    subTable.addCell("1.3.1"); 
    subTable.addCell("1.3.2"); 
    subTable.addCell("1.3.3"); 
    t.insertTable(subTable); 
PdfPTable類生成表格是這樣實現的: 
PdfPTable table = new PdfPTable(3); 
這樣就實現了一個3列的表格。你也可以預先指定每一列的寬度,使用如下的方法實現一個表格: 
float[] widths = {15f, 25f, 60f}; 
PdfPTable table = new PdfPTable(widths); 
上面的方法定義了一個3列的表格,每列所佔的寬度分別為15%、25%、60%。通常生成的表格預設以80%的比例顯示在頁面上,你需要呼叫PdfPTable的setWidthPercentage(float widthPercentage)方法設定表格寬度,如果將引數設定成100,表格將佔滿整個頁面寬度。 
也可以設定表格的絕對寬度:table.setTotalWidth(300),這樣就將表格的寬度設定在了300px。可是假如表格的內容超過了300px,表格的寬度會自動加長。如果要將表格鎖定在300px,還需要新增table.setLockedWidth(true)的設定。 
在建立PdfPTable物件的時候只需要指定列數,而不用指定行數,因為行數是可以自動新增的。表格建立完成以後,接著就需要往裡面插入單元格元素。PdfPTable物件新增單元格的發放是addCell(Object object)。Object物件可以是PdfPCell、String、Phrase、Image,也可以是是PdfPTable物件本身,即在表格中巢狀一個表格。 
為了實現某些特殊的表格形式,需要合併單元格。PdfPCell類提供了setColspan(int colspan)方法用於合併橫向單元格,引數colspan指定要合併的單元格數。但是PdfPCell類中沒有setRowspan()方法,也就是說你不能合併縱向單元格。不過你可以使用巢狀表格的方法達到類似的效果,就是使用table.addCell(PdfPTable table)將一個表格加入到單元格中。 
通常的表格都需要一個表頭,你表頭中你可以定義表格的每一列所代表的含義,如同下面的這個被保險人清單表,其中第一行的內容就是我們需要的表頭: 
表頭的內容也是通過table.addCell()方法新增到表格中的,完成之後你需要呼叫table.setHeaderRows(1)方法告訴程式這一行是你的表頭。當表內容很大,一頁無法顯示時,程式會自動將表格進行分頁,這時候讓程式知道什麼是表頭就非常必要了,程式會在每一頁的表格頭部都加上表頭。 
出於某種需要,你可能必須將表格固定在頁面的某一個位置,PdfPTable也為我們提供了這種方法:table.writeSelectedRows(int rowStart, int rowEnd, float xPos, float yPos, PdfContentByte canvas)。你可以參考API文件瞭解每個引數的含義。

1.9 新增頁首頁尾

對於多頁文件來說,頁碼標誌是不可少的,這就涉及到了頁首頁尾的新增方法。 
Document容器裡的頁首頁尾類叫著HeaderFooter,建立HeaderFooter的方法有兩個: 
HeaderFooter(Phrase before, boolean numbered); 
HeaderFooter(Phrase before, Phrase after); 
HeaderFooter類可以替你計算當前頁的頁碼並寫入頁首或頁尾中,方法一中的引數numbered就是讓你選擇是否顯示頁碼,before和after引數指的是你要在頁碼前後顯示的內容。加入你希望在將頁碼顯示成“第i頁”的形式,通過new HeaderFooter(“第”,”頁”)方法就能實現。 
通過setAlignment(int alignment)方法你可以設定頁首頁尾是左對齊、右對齊還是居中顯示。 
預設的HeaderFooter物件會在顯示一個邊框,你可以通過setBorder()方法將其隱藏或選擇顯示某一側的邊框。 
最終你需要告訴程式是將HeaderFooter物件顯示為頁首還是頁尾,對應的方法是document.setHeader()和document.setFooter()。 
下面是實現頁首頁尾的一個例子。 
    HeaderFooter footer = new HeaderFooter(new Phrase(" 第", FontFooter), new Phrase(" 頁", FontFooter)); 
    footer.setBorder(Rectangle.NO_BORDER); 
    footer.setAlignment(Element.ALIGN_BOTTOM); 
    document.setFooter(footer); 
當生成PDF文件之後,也許你會發現在文件的頁首頁尾只從第二頁才開始開始,第一頁中並沒有你期望的頁首頁尾。這是因為你程式新增的位置不對,為了在文件的第一頁也能產生頁首頁尾,你必須把上面的這段程式放在document.open()程式碼之前。

1.10  關閉Document

通過以上步驟,你基本可以實現一個想要的PDF文件了。你最後要做的就是呼叫document.close()方法將文件關閉。當然,由於JAVA的異常機制,別忘了把以上的程式放在try…catch()…之中以捕獲可能發生的程式異常。

2.1 合併多個PDF檔案

開發中有時需要將幾個現成的PDF文件合併成一個文件,我們只需要使用PdfCopyFields就能實現。假設我們有兩個名為source1.pdf、source2.pdf的檔案,我們的目標是將它們合併成一個叫concatenated.pdf的檔案。 
方法是先用PdfReader物件得到源PDF檔案: 
PdfReader reader1 = new PdfReader("source1.pdf"); 
PdfReader reader2 = new PdfReader("source2.pdf"); 
這樣我們的程式就得到了想要合併的檔案內容,然後我們再定義一個PdfCopyFields物件: 
PdfCopyFields copy = new PdfCopyFields(new FileOutputStream("concatenated.pdf")); 
指定生成的檔案為concatenated.pdf。然後將讀入的內容寫入該物件: 
copy.addDocument(reader1); 

 copy.addDocument(reader2); 
關閉PdfCopyFields物件: 
copy.close(); 
    你會發現,一個新的PDF檔案就這樣生成了,它包含了source1.pdf和source2.pdf兩個檔案的內容。

 

Document是我們要生成的PDF檔案所有元素的容器,因此要生成一個PDF文件,必須首先定義一個Document物件。 
Document有三種建構函式: 
   public Document(); 
   public Document(Rectangle pageSize); 
   public Document(Rectangle pageSize, float marginLeft,    float marginRight, float marginTop, float marginBottom); 
第一種方法沒有定義任何引數,生成的文件將自動採用A4大小的紙張;第二種方法,使用者可以定義紙張的大小;而第三種方法中,使用者不僅可以定義紙張大小,而且還能定義頁面的左右上下邊距。 
我們通過下面的語句定義一個Document物件,頁面大小為A4,四周邊距均為50。 
    Document document = new Document(PageSize.A4, 50, 50, 50, 50);
如果頁面需要採用橫排模式,只要修改第一個引數就行: 
Document doc = new Document(PageSize.A4.rotate(),50,50,50,50);

1.2 指定Document型別為PDF

定義了Document物件後,緊接著需要指定Document物件的型別。因為使用iText庫不僅支援PDF文件的建立,還可以支援Html、RTF、Xml、Word等多種文件型別,我們要生成PDF文件格式,需要呼叫如下的方法: 

PdfWriter writer = PdfWriter.getInstance(document, 
                  new FileOutputStream("c:\\ITextTest.pdf")); 
如果你想建立的不是PDF文件,則可以根據你想建立的文件型別選擇建立HtmlWriter、RtfWriter、XmlWriter、RtfWriter2(注:word文件)物件,具體支援的文件型別可以檢視iText的API文件。 
你可以設定生成的PDF文件外觀,比如是否顯示選單欄、工具欄等,設定方法如下: 
writer.setViewerPreferences(PdfWriter.HideMenubar); 
writer.setViewerPreferences(PdfWriter.HideToolbar); 
writer.setViewerPreferences(PdfWriter.HideMenubar 
                  | PdfWriter.HideToolbar); 
第一條語句隱藏了選單欄,第二條語句隱藏了工具欄,第三條語句則可以同時實現選單欄和工具欄的隱藏。

1.3Document中寫入內容

到此為止我們已經成功建立了一個PDF文件,現在可以往裡寫入資料了。 
為了寫入資料,我們首先要做的事將當前文件開啟: 
    document.open(); 
常用的構成PDF檔案的元素有Chunk、Paragraph、Phrase、List、Image、Table等,下面我們對它們進行簡單的介紹。

1.4 Chunk

Chunk是可以往Document中新增的最小元素,你可以將其直接新增到Document中,document.add(new Chunk("ZipCode")); 
你可以為Chunk物件指定顏色,字型,但是一個Chunk物件只能有一種顏色和字型,也就是說Chunk就是一個“原子”物件,你無法讓一個Chunk物件中的不同字元擁有不同的屬性。 
Chunk物件一個有趣的功能就是可以為其下劃線、上劃線、刪除線。 
Chunk title = new Chunk("Title", titleFont); 
title.setUnderline(Color.BLACK, 2.0f, 0.0f, 24.0f, 0.0f, PdfContentByte.LINE_CAP_BUTT); title.setUnderline(Color.BLACK, 2.0f, 0.0f, -12.0f, 0.0f, PdfContentByte.LINE_CAP_BUTT); 
通過呼叫setUnderline()方法並設定引數,你可以將線段新增在Chunk物件的任意位置,還可以設定線段的顏色、粗細和形狀(圓頭線、平頭線等)。 
除了直接將Chunk物件加入文件中以外,你也可以將其作為更高階的PDF元素的一部分,比如: 
Paragraph p = new Paragraph(); 
Chunk chunk = new Chunk("總經理"); 
p.add(chunk);

1.5 Paragraph

Paragraph顧名思義就是段落的意思,就好像Word中的一個段落,你可以定義它的段前間距,段後間距、段落對齊方式、左右縮排: 
 p.setAlignment(Element.ALIGN_JUSTIFIED);

 p.setIndentationLeft(15f);

p.setIndentationRight(15f); 
p.setSpacingBefore(15f); 
p.setSpacingAfter(5f); 
第一條語句定義了段落p的對齊方式,第二條語句定義了p的左側縮排距離,第三條語句定義了p的右側縮排距離,第四條語句定義了p的段前間距,第五條語句定義了p的段後間距,可以根據實際需要定義相應的值。 
定義好一個Paragraph物件之後,將其加入文件中。 
document.add(p);   

1.6  Phrase

Phrase實現的功能與Paragraph相似,假如想要往文件中新增一個段落是,我們還是覺得使用Paragraph物件比較合適。 

Phrase有許多種構造方式,通常我們只需要new Phrase(String string)或者new Phrase(String string, Font font)就可以建立一個Phrase物件了。但是還有類似Phrase(float leading, String string) 這樣的建構函式。引數leading設定的是Phrase物件的行間距,當Phrase內容超過一行時,這個引數的作用就會展現出來。通常leading都應該是一個正值,不過如果你把它設定為一個負值的話,也會發現有趣的事情發生。

1.7 List

List類實現的效果類似於Word中的“專案符號和編號”,你可以通過下面的方法建立一個List物件: 
List l = new List(true, false, 10); 
l.add(new ListItem("First item of list")); 
l.add(new ListItem("Second item of list")); 
new List(true, false, 10)函式的第一個引數指明瞭你建立的是否是一個有編號的列表,true表示建立的是一個有編號的列表;第二個引數表示是否採用字母進行編號,true為字母,false為數字;第三個引數是列表的縮排量。 
列表有列表項組成,ListItem就是List的列表項,建立完列表項之後通過add()方法就可以將其加入列表中。 
你也可以直接將一個字串加入List列表: 
l.add("Third item of list"); 
你也可以建立一個新的List物件,將它加入到當前List物件中: 
List sublist = new List(false, true, 10); 
    sublist.add("First subitem of third item"); 
    sublist.add("Second subitem of third item"); 
l.add(sublist);         
最後將List物件加入到文件中。 
document.add(l);

1.8 TablePdfPTable

要在PDF檔案中建立表格,iText為我們提供了兩個類,Table和PdfPTable。兩種方法各有優點,總的來說Table型別的表格實現起來相對比較簡單,但如果需要實現的表格比較複雜,有時就必須使用PdfPTable類。 
首先簡單介紹一下使用Table類生成表格的方法: 
    Table t = new Table(3, 2); 
    t.setBorderColor(Color.white); 
    t.setPadding(5); 
    t.setSpacing(5); 
    t.setBorderWidth(1); 
第一行程式建立了一個3x2的表格,其後的程式分別設定了表格的邊框顏色、單元格內文字間距、單元格間距、邊框寬度。如果使用者不希望顯示錶格邊框,只需要將邊框顏色設定成與背景色一致就行。由於預設的文件背景色為白色,因此我們把表格的邊框顏色也設定為白色。 
表格是有一個個單元格組成的。單元格的建立方法如下: 
    Cell c1 = new Cell("Header1"); 
    t.addCell(c1); 
這樣我們就在表格的第一行第一列中寫入了內容“Header1”。使用同樣的方法我們可以繼續往表格中加入內容。你會發現我們並沒有指定單元格在表格中的位置,那麼程式為怎樣將我們加入的單元格加到哪裡呢?程式預設的加入單元格順序是從第一行第一列開始,以行的順序從左往右一次加入單元格,等第一行放滿之後再從第二行第一列開始,依次從左往右填充表格。 
如果你不想按照程式預設的順序往表格中寫入內容,也可以呼叫addCell(Cell aCell, int row, int column)或addCell(Cell aCell, Point aLocation)方法,都可以將內容直接放入你指定的表格位置。 
可以將一個表格加入另一個表格中,即表格的巢狀,實現的方式是insertTable(Table table)。 
    Table subTable = new Table(2, 2); 
    subTable.addCell("1.3.1"); 
    subTable.addCell("1.3.2"); 
    subTable.addCell("1.3.3"); 
    t.insertTable(subTable); 
PdfPTable類生成表格是這樣實現的: 
PdfPTable table = new PdfPTable(3); 
這樣就實現了一個3列的表格。你也可以預先指定每一列的寬度,使用如下的方法實現一個表格: 
float[] widths = {15f, 25f, 60f}; 
PdfPTable table = new PdfPTable(widths); 
上面的方法定義了一個3列的表格,每列所佔的寬度分別為15%、25%、60%。通常生成的表格預設以80%的比例顯示在頁面上,你需要呼叫PdfPTable的setWidthPercentage(float widthPercentage)方法設定表格寬度,如果將引數設定成100,表格將佔滿整個頁面寬度。 
也可以設定表格的絕對寬度:table.setTotalWidth(300),這樣就將表格的寬度設定在了300px。可是假如表格的內容超過了300px,表格的寬度會自動加長。如果要將表格鎖定在300px,還需要新增table.setLockedWidth(true)的設定。 
在建立PdfPTable物件的時候只需要指定列數,而不用指定行數,因為行數是可以自動新增的。表格建立完成以後,接著就需要往裡面插入單元格元素。PdfPTable物件新增單元格的發放是addCell(Object object)。Object物件可以是PdfPCell、String、Phrase、Image,也可以是是PdfPTable物件本身,即在表格中巢狀一個表格。 
為了實現某些特殊的表格形式,需要合併單元格。PdfPCell類提供了setColspan(int colspan)方法用於合併橫向單元格,引數colspan指定要合併的單元格數。但是PdfPCell類中沒有setRowspan()方法,也就是說你不能合併縱向單元格。不過你可以使用巢狀表格的方法達到類似的效果,就是使用table.addCell(PdfPTable table)將一個表格加入到單元格中。 
通常的表格都需要一個表頭,你表頭中你可以定義表格的每一列所代表的含義,如同下面的這個被保險人清單表,其中第一行的內容就是我們需要的表頭: 
表頭的內容也是通過table.addCell()方法新增到表格中的,完成之後你需要呼叫table.setHeaderRows(1)方法告訴程式這一行是你的表頭。當表內容很大,一頁無法顯示時,程式會自動將表格進行分頁,這時候讓程式知道什麼是表頭就非常必要了,程式會在每一頁的表格頭部都加上表頭。 
出於某種需要,你可能必須將表格固定在頁面的某一個位置,PdfPTable也為我們提供了這種方法:table.writeSelectedRows(int rowStart, int rowEnd, float xPos, float yPos, PdfContentByte canvas)。你可以參考API文件瞭解每個引數的含義。

1.9 新增頁首頁尾

對於多頁文件來說,頁碼標誌是不可少的,這就涉及到了頁首頁尾的新增方法。 
Document容器裡的頁首頁尾類叫著HeaderFooter,建立HeaderFooter的方法有兩個: 
HeaderFooter(Phrase before, boolean numbered); 
HeaderFooter(Phrase before, Phrase after); 
HeaderFooter類可以替你計算當前頁的頁碼並寫入頁首或頁尾中,方法一中的引數numbered就是讓你選擇是否顯示頁碼,before和after引數指的是你要在頁碼前後顯示的內容。加入你希望在將頁碼顯示成“第i頁”的形式,通過new HeaderFooter(“第”,”頁”)方法就能實現。 
通過setAlignment(int alignment)方法你可以設定頁首頁尾是左對齊、右對齊還是居中顯示。 
預設的HeaderFooter物件會在顯示一個邊框,你可以通過setBorder()方法將其隱藏或選擇顯示某一側的邊框。 
最終你需要告訴程式是將HeaderFooter物件顯示為頁首還是頁尾,對應的方法是document.setHeader()和document.setFooter()。 
下面是實現頁首頁尾的一個例子。 
    HeaderFooter footer = new HeaderFooter(new Phrase(" 第", FontFooter), new Phrase(" 頁", FontFooter)); 
    footer.setBorder(Rectangle.NO_BORDER); 
    footer.setAlignment(Element.ALIGN_BOTTOM); 
    document.setFooter(footer); 
當生成PDF文件之後,也許你會發現在文件的頁首頁尾只從第二頁才開始開始,第一頁中並沒有你期望的頁首頁尾。這是因為你程式新增的位置不對,為了在文件的第一頁也能產生頁首頁尾,你必須把上面的這段程式放在document.open()程式碼之前。

1.10  關閉Document

通過以上步驟,你基本可以實現一個想要的PDF文件了。你最後要做的就是呼叫document.close()方法將文件關閉。當然,由於JAVA的異常機制,別忘了把以上的程式放在try…catch()…之中以捕獲可能發生的程式異常。

2.1 合併多個PDF檔案

開發中有時需要將幾個現成的PDF文件合併成一個文件,我們只需要使用PdfCopyFields就能實現。假設我們有兩個名為source1.pdf、source2.pdf的檔案,我們的目標是將它們合併成一個叫concatenated.pdf的檔案。 
方法是先用PdfReader物件得到源PDF檔案: 
PdfReader reader1 = new PdfReader("source1.pdf"); 
PdfReader reader2 = new PdfReader("source2.pdf"); 
這樣我們的程式就得到了想要合併的檔案內容,然後我們再定義一個PdfCopyFields物件: 
PdfCopyFields copy = new PdfCopyFields(new FileOutputStream("concatenated.pdf")); 
指定生成的檔案為concatenated.pdf。然後將讀入的內容寫入該物件: 
copy.addDocument(reader1); 

 copy.addDocument(reader2); 
關閉PdfCopyFields物件: 
copy.close(); 
    你會發現,一個新的PDF檔案就這樣生成了,它包含了source1.pdf和source2.pdf兩個檔案的內容。