如果應(yīng)用程序需要動態(tài)生成 PDF 文檔,則需要 iText 庫。開放源碼的 iText 庫使 PDF 文檔的創(chuàng)建能夠在瞬間完成。本文介紹了 iText 并提供了使用它從 Java ? 技術(shù)應(yīng)用程序生成 PDF 文檔的由淺入深的指南。我們創(chuàng)建了一個(gè)示例應(yīng)用程序以更好地理解 iText。

  很多應(yīng)用程序要求動態(tài)生成 PDF 文檔。這類應(yīng)用程序包括銀行生成用于電子郵件投遞的客戶報(bào)表,到讀者購買特定圖書章節(jié)并以 PDF 格式接收這些文檔。例子羅列下去是很多的。在本文中,將使用 iText Java 庫生成 PDF 文檔,并引導(dǎo)您完成一個(gè)示例應(yīng)用程序,以使您能夠更好地理解和使用 iText。

  熟悉 iText

  iText 是 Lowagie.com 站點(diǎn)(請參閱 參考資料)免費(fèi)提供的 Java 庫。iText 庫的功能很強(qiáng)大,支持 HTML、RTF 和 XML 文檔的生成,此外還能夠生成 PDF 文檔。可以從多種字體中選擇文檔中所使用的字體。同時(shí),iText 的結(jié)構(gòu)允許使用相同的代碼生成以上任意類型的文檔。

  iText 庫中的類用于以各種字體來生成 PDF 文本、在 PDF 文檔中生成表格、為頁添加水印等。iText 還提供許多功能。在一篇文章中不可能一一演示。本文中將介紹生成 PDF 文檔的基本需求。

  我們將使用 Eclipse 來進(jìn)行示例應(yīng)用程序開發(fā)。作為一個(gè)開放源碼的 IDE,可以免費(fèi)獲得 Eclipse,而且其功能非常強(qiáng)大?,F(xiàn)在就可以下載 Eclipse。

  iText API:近距離觀察

  com.lowagie.text.Document 是生成 PDF 的主要的類。它是需要使用的第一個(gè)類。一旦開始創(chuàng)建文檔,將需要一個(gè)寫入器向文檔中寫入內(nèi)容。com.lowagie.text.pdf.PdfWriter 就是一個(gè) PDF 寫入器。下面列出了通常需要使用的類:

  com.lowagie.text.Paragraph —— 這個(gè)類表示一個(gè)縮進(jìn)的段落。

  com.lowagie.text.Chapter —— 這個(gè)類表示 PDF 文檔中的章節(jié)。使用 Paragraph 作為題目并使用 int 作為章節(jié)號碼來創(chuàng)建它。

  com.lowagie.text.Font —— 這個(gè)類包含了全部的字體規(guī)范,例如字體、大小、樣式和顏色。各種字體都在這個(gè)類中聲明為靜態(tài)常數(shù)。

  com.lowagie.text.List —— 這個(gè)類表示一個(gè)列表,按順序包含許多 ListItems。

  com.lowagie.text.Table —— 這個(gè)類表示包含單元格的表,單元格有序地排列在矩陣中。

  下載 iText 并在 Eclipse 中進(jìn)行配置

  作為一個(gè)純粹的 Java 庫,iText 是以 JAR 文件的形式出現(xiàn)的(請參閱 參考資料)。一旦下載了這個(gè)庫(在路徑 C:\temp 下),執(zhí)行下列步驟將會在 Eclipse 環(huán)境中配置 iText 庫:

  在 Eclipse 中創(chuàng)建一個(gè)新的 Java 項(xiàng)目,將其命名為 iText。

  在 Package Explorer 視圖中右擊 iText 項(xiàng)目,然后選擇 Properties。

  單擊 Java Build Path。在 Libraries 選項(xiàng)卡中,單擊 Add External JARs。

  瀏覽到 C:\temp 目錄,選擇該目錄下的 itext-1.3.jar。

  單擊 OK。

  現(xiàn)在已經(jīng)配置好 iText,Eclipse 已經(jīng)準(zhǔn)備好創(chuàng)建 Java 應(yīng)用程序以生成動態(tài) PDF 文檔。

  示例應(yīng)用程序

  還有什么能夠比自己動手創(chuàng)建一個(gè)工作示例更好地演示技術(shù)了?現(xiàn)在有了所需的工具(Eclipse IDE)和庫(iText 庫),可以開始設(shè)計(jì)和開發(fā)一個(gè)示例應(yīng)用程序了。

  讓我們創(chuàng)建一個(gè)簡單的 PDF 文檔,其中包含一些基本元素,如純文本、非默認(rèn)字體的彩色文本、表格、列表、章節(jié)和小節(jié)等。此應(yīng)用程序的目的是讓您熟悉 iText 庫的使用方式。有很多與幫助生成 PDF 文檔有關(guān)的類。在這里不可能介紹所有這些類。iText 的 javadoc 是介紹如何使用這些類的很好的資料。下面讓我們來開始編寫代碼。

  第一步是創(chuàng)建一個(gè)文檔。文檔是 PDF 文檔的所有元素的容器。

  清單 1. 實(shí)例化文檔對象

Document document = new Document(PageSize.A4, 50, 50, 50, 50);

  第一個(gè)參數(shù)是頁面大小。接下來的參數(shù)分別是左、右、上和下頁邊距。但是還沒有定義該文檔的類型。它取決于所創(chuàng)建的寫入器的類型。對于我們的示例,選擇了 com.lowagie.text.pdf.PdfWriter。其他寫入器為 HtmlWriter、RtfWriter、XmlWriter 等等。它們的名稱解釋了它們的實(shí)際用途。

  清單 2. 創(chuàng)建 PdfWriter 對象

PdfWriter writer = PdfWriter.getInstance(document, \
new FileOutputStream("C:\\ITextTest.pdf"));
document.open();

  第一個(gè)參數(shù)是對文檔對象的引用,第二個(gè)參數(shù)是文件的實(shí)際名稱,在該名稱中還會給出其輸出路徑。接下來,打開文檔以寫入內(nèi)容。


 現(xiàn)在,將在文檔的第一頁上添加一些文本。通過 com.lowagie.text.Paragraph 來添加文本??梢杂梦谋炯捌淠J(rèn)的字體、顏色、大小等等設(shè)置來創(chuàng)建一個(gè)默認(rèn)段落?;蛘?,也可以設(shè)置自己的字體。下面讓我們來看看這兩種做法。

  清單 3. 創(chuàng)建段落對象

document.add(new Paragraph("First page of the document."));
document.add(new Paragraph("Some more text on the \
first page with different color and font type.",
FontFactory.getFont(FontFactory.COURIER, 14, Font.BOLD, new Color(255, 150, 200))));

  下面是上面代碼的輸出示例。在上面代碼的結(jié)尾處添加 document.close(); 以關(guān)閉文檔。

上面代碼的輸出示例
圖 1. 上面代碼的輸出示例

  您已經(jīng)看到了如何向 PDF 文檔中添加純文本。接下來,需要向文檔中添加一些復(fù)雜的元素。我們開始創(chuàng)建一個(gè)新的章節(jié)。章節(jié)是一個(gè)特殊的小節(jié),默認(rèn)情況下,章節(jié)從一個(gè)新的頁面開始,并顯示一個(gè)默認(rèn)的編號。

  清單 4. 創(chuàng)建章節(jié)對象

Paragraph title1 = new Paragraph("Chapter 1",
FontFactory.getFont(FontFactory.HELVETICA, \
18, Font.BOLDITALIC, new Color(0, 0, 255)));
Chapter chapter1 = new Chapter(title1, 1);
chapter1.setNumberDepth(0);

  在上面的代碼中,創(chuàng)建了一個(gè)新的章節(jié)對象,chapter1,其標(biāo)題為 “This is Chapter 1”,將編號級別設(shè)為 0 就不會在頁面上顯示章節(jié)編號。

  小節(jié)是章節(jié)的子元素。在下面的代碼中,創(chuàng)建了一個(gè)標(biāo)題為 “This is Section 1 in Chapter 1” 的小節(jié)。為在該小節(jié)下添加一些文本,創(chuàng)建了另一個(gè)段落對象,someSectionText,并將其添加到小節(jié)對象中。

  清單 5. 創(chuàng)建小節(jié)對象

Paragraph title11 = new Paragraph("This is Section 1 in Chapter 1",
FontFactory.getFont(FontFactory.HELVETICA, 16, \
Font.BOLD, new Color(255, 0, 0)));
Section section1 = chapter1.addSection(title11);
Paragraph someSectionText = new Paragraph("This \
text comes as part of section 1 of chapter 1.");
section1.add(someSectionText);
someSectionText = new Paragraph("Following is a 3 X 2 table.");
section1.add(someSectionText);

  在添加表格之前,我們先看一下文檔的樣子。添加下面兩行代碼以關(guān)閉文檔,然后編譯并執(zhí)行程序以生成 PDF 文檔:document.add(chapter1);document.close();。

章節(jié)輸出示例
圖 2. 章節(jié)輸出示例

  接下來,創(chuàng)建一個(gè)表格對象。創(chuàng)建一個(gè)包含行列矩陣的表格。行中的單元格可以跨多個(gè)列。同樣地,列中的單元格也可以跨多個(gè)行。因此,一個(gè) 3 x 2 的表格實(shí)際上不一定有 6 個(gè)單元格。

  清單 6. 創(chuàng)建表格對象

Table t = new Table(3,2);
t.setBorderColor(new Color(220, 255, 100));
t.setPadding(5);
t.setSpacing(5);
t.setBorderWidth(1);
Cell c1 = new Cell("header1");
c1.setHeader(true);
t.addCell(c1);
c1 = new Cell("Header2");
t.addCell(c1);
c1 = new Cell("Header3");
t.addCell(c1);
t.endHeaders();
t.addCell("1.1");
t.addCell("1.2");
t.addCell("1.3");
section1.add(t);

  在上面的代碼中,創(chuàng)建了一個(gè)表格對象,t,它有三列、兩行。然后設(shè)置表格的邊框顏色。填充用于設(shè)置單元格中文本間的間隔以及單元格的邊界。間隔指的是相鄰單元格間的邊界。接下來,將創(chuàng)建三個(gè)單元格對象,每個(gè)單元格中的文本都各不相同。接下來,將它們添加到表格中。將它們添加到第一行中,從第一列開始,移到同一行中的下一列。一旦該行創(chuàng)建完成,就將下一個(gè)單元格添加到下一行的第一列中。也可以通過只提供單元格的文本將單元格添加到表格中,例如,t.addCell("1.1");。最后,將表格對象添加到小節(jié)對象中。

  最后,我們來看一下如何將列表添加到 PDF 文檔中。列表包含一定數(shù)量的 ListItem??梢詫α斜磉M(jìn)行編號,也可以不編號。將第一個(gè)參數(shù)設(shè)置為 true 表明想創(chuàng)建一個(gè)要進(jìn)行編號的列表。

  清單 7. 創(chuàng)建列表對象

List l = new List(true, false, 10);
l.add(new ListItem("First item of list"));
l.add(new ListItem("Second item of list"));
section1.add(l);

  我們已經(jīng)向 chapter1 對象中添加了所需的對象。因此,已經(jīng)沒有其他要添加到 chapter1 中的元素了,現(xiàn)在可以將 chapter1 添加到主 document 中了。與在示例應(yīng)用程序中所做的一樣,還要在這時(shí)關(guān)閉文檔對象。

  清單 8. 向主文檔中添加章節(jié)

document.add(chapter1);
document.close();

  運(yùn)行示例應(yīng)用程序

  下載示例應(yīng)用程序,j-itextsample.jar(參見 下載)。

  在某個(gè)目錄中解壓縮 j-itextsample.jar。例如,如果將其解壓縮到 C:\temp,則會將源碼和類文件放到 C:\temp\com\itext\test 目錄下。

  打開一個(gè)命令提示,將目錄更改為 C:\temp。

  在這個(gè)命令提示中設(shè)置系統(tǒng)的類路徑。將 C:\temp\itext-1.3.jar 包括在系統(tǒng)的類路徑中。在 Windows? 上,執(zhí)行命令 set classpath=C:\temp\itext-1.3.jar;%classpath%。

  使用命令 java com.itext.test.ITextTest 運(yùn)行應(yīng)用程序。

  程序會在 C:\ 目錄下生成一個(gè) ITextTest.pdf 文檔。下面顯示了這個(gè) PDF 文檔第二頁的屏幕圖。

PDF 文檔的屏幕圖
圖 3. PDF 文檔的屏幕圖

  結(jié)束語

  您已經(jīng)看到了一些生成 PDF 的基本元素。iText 的美妙之處是相同元素的語法可以供不同類型的寫入器使用。而且,寫入器的輸出可以重定向到控制臺(當(dāng)寫入器類型是 XML 和 HTML 時(shí))、servlet 的輸出流(在對 PDF 文檔的 Web 請求作出響應(yīng)時(shí))或者是其他類型的 OutputStream。當(dāng)響應(yīng)相同,但其類型隨所請求的是 PDF、RTF、HTML 或 XML 文檔而有所不同時(shí),使用 iText 是非常方便的。iText 允許用戶創(chuàng)建水印,對文檔進(jìn)行加密以及設(shè)置其他輸出細(xì)節(jié).