許多應用程序都要求動態生成 PDF 文檔。這些應用程序涵蓋從生成客戶對帳單並通過電子郵件交付的銀行到購買特定的 圖書章節並以 PDF 格式接收這些圖書章節的讀者。這個列表不勝枚舉。在本文中,我們將使用 iText Java 庫生成 PDF 文 檔。我們將向您演示一個樣例應用程序,以便您可自行完成它並能更好地理解它。
熟悉 iText V5.3.0 版
iText 是一個可從 http://itextpdf.com/ 免費獲取的 Java 庫。iText 庫非常強大,且支持生成 HTML、RTF 和 XML 文檔,還支持生成 PDF 文檔。您可以選擇各種各樣的字體來用於文檔中。另外,iText 的結構允許您使用相同代碼生 成上面提及的任何類型的文檔。
iText 庫包含使用各種字體生成 PDF 文本、在 PDF 文檔中生成表格、向頁面中添 加水印等的類。iText 還提供了其他許多特性。在一篇文章中無法演示所有這些特性。我們將介紹生成 PDF 所需的基本知 識。有關更多詳細信息,請參閱供應商提供的文檔。
我們將使用 Eclipse 開發我們的樣例應用程序。作為一個開源 IDE,Eclipse 可免費獲取且非常強大。您可立即下載 Eclipse。
iText API:詳細了解
com.itextpdf.text.Document 是用於生成 PDF 文檔的主要類。這是第一個需要實例化的類。創建文檔之後,您需 要一個編寫器來向其中寫入信息。com.itextpdf.text.pdf.PdfWriter 是一個 PDF 編寫器。下面提供了其他一些常用的類 :
com.itextpdf.text.Paragraph:此類表示一個縮進的段落。
com.itextpdf.text.Chapter:此類表示 PDF 文檔中的一章。使用 Paragraph 作為標題、int 作為章節編號來創建該類 。
com.itextpdf.text.Font:此類包含一種字體的所有規范,比如字體集、字號、樣式和顏色。各種字體都在此類中聲明 為靜態常量。
com.itextpdf.text.List:此類表示一個列表,反過來,該列表又包含許多 ListItems。
com.itextpdf.text.pdf.PDFPTable:這是一個表格,可放在一個絕對位置上,也可作為類 Table 添加到文檔中。
com.itextpdf.text.Anchor:一個 Anchor 可能是一個引用,或是一個引用的目標。
在 Eclipse 中下載和配置 iText
作為一個純 Java 庫,iText 以 JAR 文件的形式提供。下載該庫之後(假設下載到路徑 C:\temp),使用以下步驟在 Eclipse 環境中配置 iText 庫:
在 Eclipse 中創建一個名為 iText 的新 Java 項目。
右鍵單擊 Package Explorer 視圖中的 iText 項目,選擇 Properties。
單擊 Java Build Path。在 Libraries 選項卡上,單擊 Add External JARs。
找到 C:\temp 目錄並選擇此目錄中的 itext-5.3.0.jar。
單擊 OK。
iText 現在已配置,Eclipse 已准備好創建 Java 應用程序來生成動態的 PDF 文檔。
樣例應用程序
還有 什麼能比您親自創建的一個有效樣例能更好地演示任何技術呢?現在您已擁有所需的工具 (Eclipse IDE) 和庫 (iText library),我們已准備好設計和開發一個有效的樣例程序。
首先創建一個簡單的 PDF 文檔,該文檔包含一些基本元 素,比如純文本、具有非默認字體的彩色文本、表格、列表、章、節等。此應用程序的用途是讓您熟悉使用 iText 庫的方 式。有許多類為您執行了與 PDF 文檔生成相關的大量工作。本文不可能介紹所有這些類。iText 的 javadocs 是有關如何 使用這些類的一個不錯的信息來源。接下來我們開始編碼。
第一步是創建一個文檔。文檔是一個 PDF 文檔的所有元 素的容器。
清單 1. 實例化文檔對象
Document document = new Document(PageSize.A4, 50, 50, 50, 50);
第一個參數是頁面大小。接下來的幾個參數分別是左邊距、右邊距、上邊距和下邊距。此文檔的類型還未定義 。它依賴於您創建的編寫器類型。對於我們的樣例,我們選擇 com.itextpdf.text.pdf.PdfWriter。其他編寫器包括 HtmlWriter、RtfWriter、XmlWriter 等。它們的名稱說明了它們的實際用途。
清單 2. 創建 PdfWriter 對象
PdfWriter writer = PdfWriter.getInstance(document, \ new FileOutputStream("C:\\ITextTest.pdf")); document.open();
第一個參數是文檔對象的引用,第二個參數是輸出將寫入的文件的絕對名稱。接下來,我們打開文檔開始編寫。
現在,我們將在文檔的第一頁上添加一些文本。任何文本都借助 com.itextpdf.text.Paragraph 來進行添加。您可使用您 的文本以及字體、顏色、字號等默認設置創建一個默認段落。否則,您可提供自己的字體。在本文中,我們還將討論 PDF 文檔的定位符(鏈接)。在此 PDF 中,我們使用 backToTop 作為鏈接。當單擊 backToTop 鏈接時,它會將您帶到文檔的 第一頁。您需要將該文本設置為第一頁的定位目標。讓我們看看如何將定位目標和字體設置到所添加的段落中。
清 單 3. 創建段落對象
Anchor anchorTarget = new Anchor("First page of the document."); anchorTarget.setName("BackToTop"); Paragraph paragraph1 = new Paragraph(); paragraph1.setSpacingBefore(50); paragraph1.add(anchorTarget); document.add(paragraph1); 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 CMYKColor(0, 255, 0, 0))));
圖 1 顯示了 清單 3 中的代碼的樣例輸出。要關閉文檔,將 document.close(); 添加到清單 3 中的代碼末尾。
圖 1. 清單 3 中的代碼的樣例輸出
您剛才看到了如何將純文本添加到 PDF 文檔 中。接下來,我們需要向文檔中添加一些復雜的元素。首先創建一個新章。章是一種特殊的節,它從一個新頁開始且默認會 顯示一個編號。
清單 4. 創建章對象
Paragraph title1 = new Paragraph("Chapter 1", FontFactory.getFont(FontFactory.HELVETICA, 18, Font.BOLDITALIC, new CMYKColor(0, 255, 255,17))); Chapter chapter1 = new Chapter(title1, 1); chapter1.setNumberDepth(0);
在 清單 4 中的代碼中,我們創建了一個新的章對象 chapter1,它的標題為 “This is Chapter 1”。將編號深度設置為 0,這樣就不會在頁面上顯示章編號。
節是章的子元素。在 清單 5 中 的代碼中,我們創建一個標題為 “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 CMYKColor(0, 255, 255,17))); 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);
在添加表格之前,讓我們看看該文檔的外觀。添加以下兩行代碼以關閉 圖 2 中的文檔。然後編譯和執行程序,以生成 PDF 文檔:document.add(chapter1);document.close();。
圖 2. 章的樣 例輸出
接下來,我們創建一個表格對象。一個表格包含一個行和列的矩陣。一行中的一個單元格可占據多於一列。類似地,一列中 的一個單元格可占據多於一行。
清單 6. 創建表格對象
PdfPTable t = new PdfPTable(3); t.setSpacingBefore(25); t.setSpacingAfter(25); PdfPCell c1 = new PdfPCell(new Phrase("Header1")); t.addCell(c1); PdfPCell c2 = new PdfPCell(new Phrase("Header2")); t.addCell(c2); PdfPCell c3 = new PdfPCell(new Phrase("Header3")); t.addCell(c3); t.addCell("1.1"); t.addCell("1.2"); t.addCell("1.3"); section1.add(t);
在 清單 6 中的代碼中,我們創建了一個 PDFPTable 對象 t,它包含 3 列且在不斷地 添加行。接下來,我們創建 3 個 PDFPcell 對象,每個對象包含不同的文本。我們不斷地將它們添加到表格中。它們會添 加到第一行中,從第一列開始,移動到同一行中的下一列。該行完成後,將下一個單元格添加到下一行的第一列中。也可通 過提供單元格的文本來將它添加到表格中,比如 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 對象中。現在我們將一個圖像添加到該 Java 對象中。 我們可使用以下一個 Image 方法縮放圖像:
scaleAbsolute()
scaleAbsoluteWidth()
scaleAbsoluteHeight()
scalePercentage()
scaleToFit()
在 清單 8 中,我們使用了 scaleAbsolute。然後將圖像對象添加到 Section 中。
清單 8. 將 Image 添加到主 Document 中
Image image2 = Image.getInstance("IBMLogo.bmp"); image2.scaleAbsolute(120f, 120f); section1.add(image2);
iText 中的 com.itextpdf.text.Anchor 類表示一個外部網站或文檔內部的一個鏈 接。定位符(鏈接)可像網頁中的一個鏈接一樣單擊。要添加定位符,我們需要創建一個新定位符並將引用設置為 清單 3 中創建的 Anchor 目標。然後將定位符添加到節中,並將該節添加到文檔中。
清單 9. 將定位符添加到主文檔中
Paragraph title2 = new Paragraph("Using Anchor", FontFactory.getFont(FontFactory.HELVETICA, 16, Font.BOLD, new CMYKColor(0, 255, 0, 0))); section1.add(title2); title2.setSpacingBefore(5000); Anchor anchor2 = new Anchor("Back To Top"); anchor2.setReference("#BackToTop"); section1.add(anchor2);
沒有需要添加到 chapter1 中的元素後,就該是將 chapter1 添加到主 document 中的 時候了。在這裡,當我們完成樣例應用程序後,也將關閉文檔對象。
清單 10. 將一章添加到主文檔中
document.add(chapter1); document.close();
運行樣例應用程序
1.下載樣例應用程序 j-itextsample.jar(參見 下載)。
2.將 j-itextsample.jar 解壓到一個目錄中,舉例而言,如果將它解壓到 C:\temp 中,這會將源代碼和類文件放在 C:\temp\com\itext\test 中。
3.打開一個命令提示符,並將目錄更改為 C:\temp。
4.在此命令提示符上設置您的系統的類路徑。將 C:\temp\itext-5.3.0.jar 包含在系統的類路徑中。在 Windows 上, 執行命令 set classpath=C:\temp\itext-5.3.0.jar;%classpath%。
5.使用命令 java com.itext.test.ITextTest 運行應用程序。
該程序將在 C:\ 中生成 ITextTest.pdf 文檔。圖 3 顯示了 PDF 文檔的第一頁的屏幕截圖。
圖 3. PDF 文檔的屏幕截圖
圖 4 顯示了 PDF 文檔中的第 1 章和它的節 、文本、表格、列表和圖像的屏幕截圖。
圖 4. PDF 文檔的屏幕截圖
圖 5 顯示了 PDF 文檔中的 Anchor 鏈接的 屏幕截圖。
圖 5. PDF 文檔的屏幕截圖
結束語
您已了解了生成 PDF 所涉及 的一些基本元素。iText 的美妙之處在於,您可在不同類型的編寫器中使用同一個元素的語法。另外,您可將編寫器的輸出 重定向到控制台(對於 XML 和 HTML 編寫器)、servlet 的輸出流(對於對 PDF 文檔的 Web 請求的響應)或任何其他類 型的輸出流。在響應相同、但響應類型各不相同(PDF、RTF、HTML 或 XML)的情形中,iText 也可派上用場。iText 允許 您創建水印,加密文檔以及其他輸出細節。
下載