從Java應用程序動態生成PDF文件(轉)
從Java應用程序動態生成PDF文件(轉)[@more@]如果應用程序需要動態生成 PDF 文檔,則需要 iText 庫。開放源碼的 iText 庫使 PDF 文檔的創建能夠在瞬間完成。本文介紹了 iText 并提供了使用它從 Java ? 技術應用程序生成 PDF 文檔的由淺入深的指南。我們創建了一個示例應用程序以更好地理解 iText。
很多應用程序要求動態生成 PDF 文檔。這類應用程序包括銀行生成用于電子郵件投遞的客戶報表,到讀者購買特定圖書章節并以 PDF 格式接收這些文檔。例子羅列下去是很多的。在本文中,將使用 iText Java 庫生成 PDF 文檔,并引導您完成一個示例應用程序,以使您能夠更好地理解和使用 iText。
熟悉 iText iText 是 Lowagie.com 站點(請參閱 參考資料)免費提供的 Java 庫。iText 庫的功能很強大,支持 HTML、RTF 和 XML 文檔的生成,此外還能夠生成 PDF 文檔。可以從多種字體中選擇文檔中所使用的字體。同時,iText 的結構允許使用相同的代碼生成以上任意類型的文檔。
iText 庫中的類用于以各種字體來生成 PDF 文本、在 PDF 文檔中生成表格、為頁添加水印等。iText 還提供許多功能。在一篇文章中不可能一一演示。本文中將介紹生成 PDF 文檔的基本需求。
我們將使用 Eclipse 來進行示例應用程序開發。作為一個開放源碼的 IDE,可以免費獲得 Eclipse,而且其功能非常強大。現在就可以下載 Eclipse。
iText API:近距離觀察 com.lowagie.text.Document 是生成 PDF 的主要的類。它是需要使用的第一個類。一旦開始創建文檔,將需要一個寫入器向文檔中寫入內容。 com.lowagie.text.pdf.PdfWriter 就是一個 PDF 寫入器。下面列出了通常需要使用的類:
com.lowagie.text.Paragraph —— 這個類表示一個縮進的段落。
com.lowagie.text.Chapter —— 這個類表示 PDF 文檔中的章節。使用 Paragraph 作為題目并使用 int 作為章節號碼來創建它。
com.lowagie.text.Font —— 這個類包含了全部的字體規范,例如字體、大小、樣式和顏色。各種字體都在這個類中聲明為靜態常數。
com.lowagie.text.List —— 這個類表示一個列表,按順序包含許多 ListItems。
com.lowagie.text.Table —— 這個類表示包含單元格的表,單元格有序地排列在矩陣中。
下載 iText 并在 Eclipse 中進行配置
作為一個純粹的 Java 庫,iText 是以 JAR 文件的形式出現的(請參閱 參考資料)。一旦下載了這個庫(在路徑 C: emp 下),執行下列步驟將會在 Eclipse 環境中配置 iText 庫:
在 Eclipse 中創建一個新的 Java 項目,將其命名為 iText。
在 Package Explorer 視圖中右擊 iText 項目,然后選擇 Properties。
單擊 Java Build Path。在 Libraries 選項卡中,單擊 Add External JARs。
瀏覽到 C: emp 目錄,選擇該目錄下的 itext-1.3.jar。
單擊 OK。
現在已經配置好 iText,Eclipse 已經準備好創建 Java 應用程序以生成動態 PDF 文檔。
示例應用程序 還有什么能夠比自己動手創建一個工作示例更好地演示技術了?現在有了所需的工具(Eclipse IDE)和庫(iText 庫),可以開始設計和開發一個示例應用程序了。
讓我們創建一個簡單的 PDF 文檔,其中包含一些基本元素,如純文本、非默認字體的彩色文本、表格、列表、章節和小節等。此應用程序的目的是讓您熟悉 iText 庫的使用方式。有很多與幫助生成 PDF 文檔有關的類。在這里不可能介紹所有這些類。iText 的 javadoc 是介紹如何使用這些類的很好的資料。下面讓我們來開始編寫代碼。
第一步是創建一個文檔。文檔是 PDF 文檔的所有元素的容器。
清單 1. 實例化文檔對象
Document document = new Document(PageSize.A4, 50, 50, 50, 50);
第一個參數是頁面大小。接下來的參數分別是左、右、上和下頁邊距。但是還沒有定義該文檔的類型。它取決于所創建的寫入器的類型。對于我們的示例,選擇了 com.lowagie.text.pdf.PdfWriter。其他寫入器為 HtmlWriter、RtfWriter、XmlWriter 等等。它們的名稱解釋了它們的實際用途。
清單 2. 創建 PdfWriter 對象
PdfWriter writer = PdfWriter.getInstance(document,
new FileOutputStream("C:ITextTest.pdf"));
document.open();
第一個參數是對文檔對象的引用,第二個參數是文件的實際名稱,在該名稱中還會給出其輸出路徑。接下來,打開文檔以寫入內容。
現在,將在文檔的第一頁上添加一些文本。通過 com.lowagie.text.Paragraph 來添加文本。可以用文本及其默認的字體、顏色、大小等等設置來創建一個默認段落。或者,也可以設置自己的字體。下面讓我們來看看這兩種做法。
清單 3. 創建段落對象
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))));
下面是上面代碼的輸出示例。在上面代碼的結尾處添加 document.close(); 以關閉文檔。
400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" border=0 resized="true">
圖 1. 上面代碼的輸出示例
您已經看到了如何向 PDF 文檔中添加純文本。接下來,需要向文檔中添加一些復雜的元素。我們開始創建一個新的章節。章節是一個特殊的小節,默認情況下,章節從一個新的頁面開始,并顯示一個默認的編號。
清單 4. 創建章節對象
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);
在上面的代碼中,創建了一個新的章節對象,chapter1,其標題為 “This is Chapter 1”,將編號級別設為 0 就不會在頁面上顯示章節編號。
小節是章節的子元素。在下面的代碼中,創建了一個標題為 “This is Section 1 in Chapter 1” 的小節。為在該小節下添加一些文本,創建了另一個段落對象,someSectionText,并將其添加到小節對象中。
清單 5. 創建小節對象
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);
在添加表格之前,我們先看一下文檔的樣子。添加下面兩行代碼以關閉文檔,然后編譯并執行程序以生成 PDF 文檔:document.add(chapter1);document.close();。
400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" border=0 resized="true">
圖 2. 章節輸出示例
接下來,創建一個表格對象。創建一個包含行列矩陣的表格。行中的單元格可以跨多個列。同樣地,列中的單元格也可以跨多個行。因此,一個 3 x 2 的表格實際上不一定有 6 個單元格。
清單 6. 創建表格對象
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);
在上面的代碼中,創建了一個表格對象,t,它有三列、兩行。然后設置表格的邊框顏色。填充用于設置單元格中文本間的間隔以及單元格的邊界。間隔指的是相鄰單元格間的邊界。接下來,將創建三個單元格對象,每個單元格中的文本都各不相同。接下來,將它們添加到表格中。將它們添加到第一行中,從第一列開始,移到同一行中的下一列。一旦該行創建完成,就將下一個單元格添加到下一行的第一列中。也可以通過只提供單元格的文本將單元格添加到表格中,例如, t.addCell("1.1");。最后,將表格對象添加到小節對象中。
最后,我們來看一下如何將列表添加到 PDF 文檔中。列表包含一定數量的 ListItem。可以對列表進行編號,也可以不編號。將第一個參數設置為 true 表明想創建一個要進行編號的列表。
清單 7. 創建列表對象
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);
我們已經向 chapter1 對象中添加了所需的對象。因此,已經沒有其他要添加到 chapter1 中的元素了,現在可以將 chapter1 添加到主 document 中了。與在示例應用程序中所做的一樣,還要在這時關閉文檔對象。
清單 8. 向主文檔中添加章節
document.add(chapter1);
document.close();
運行示例應用程序 下載示例應用程序,j-itextsample.jar(參見 下載)。
在某個目錄中解壓縮 j-itextsample.jar。例如,如果將其解壓縮到 C: emp,則會將源碼和類文件放到 C: empcomitext est 目錄下。
打開一個命令提示,將目錄更改為 C: emp。
在這個命令提示中設置系統的類路徑。將 C: empitext-1.3.jar 包括在系統的類路徑中。在 Windows? 上,執行命令 set classpath=C: empitext-1.3.jar;%classpath%。
使用命令 java com.itext.test.ITextTest 運行應用程序。
程序會在 C: 目錄下生成一個 ITextTest.pdf 文檔。下面顯示了這個 PDF 文檔第二頁的屏幕圖。
400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" border=0 resized="true">
圖 3. PDF 文檔的屏幕圖
結束語 您已經看到了一些生成 PDF 的基本元素。iText 的美妙之處是相同元素的語法可以供不同類型的寫入器使用。而且,寫入器的輸出可以重定向到控制臺(當寫入器類型是 XML 和 HTML 時)、servlet 的輸出流(在對 PDF 文檔的 Web 請求作出響應時)或者是其他類型的 OutputStream。當響應相同,但其類型隨所請求的是 PDF、RTF、HTML 或 XML 文檔而有所不同時,使用 iText 是非常方便的。iText 允許用戶創建水印,對文檔進行加密以及設置其他輸出細節。