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.3往Document中寫入內容
到此為止我們已經成功建立了一個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 Table和PdfPTable
要在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.3往Document中寫入內容
到此為止我們已經成功建立了一個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 Table和PdfPTable
要在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兩個檔案的內容。