從Java應用程式動態產生PDF檔案

來源:互聯網
上載者:User
pdf|程式|動態   如果應用程式需要動態產生 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:\temp 下),執行下列步驟將會在 Eclipse 環境中配置 iText 庫:

  在 Eclipse 中建立一個新的 Java 項目,將其命名為 iText。

  在 Package Explorer 視圖中右擊 iText 項目,然後選擇 Properties。

  單擊 Java Build Path。在 Libraries 選項卡中,單擊 Add External JARs。

  瀏覽到 C:\temp 目錄,選擇該目錄下的 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(); 以關閉文檔。


圖 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();。


圖 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:\temp,則會將源碼和類檔案放到 C:\temp\com\itext\test 目錄下。

  開啟一個命令提示,將目錄更改為 C:\temp。

  在這個命令提示中設定系統的類路徑。將 C:\temp\itext-1.3.jar 包括在系統的類路徑中。在 Windows? 上,執行命令 set classpath=C:\temp\itext-1.3.jar;%classpath%。

  使用命令 java com.itext.test.ITextTest 運行應用程式。

  程式會在 C:\ 目錄下產生一個 ITextTest.pdf 文檔。下面顯示了這個 PDF 文檔第二頁的螢幕圖。


圖 3. PDF 文檔的螢幕圖
  結束語

  您已經看到了一些產生 PDF 的基本元素。iText 的美妙之處是相同元素的文法可以供不同類型的寫入器使用。而且,寫入器的輸出可以重新導向到控制台(當寫入器類型是 XML 和 HTML 時)、servlet 的輸出資料流(在對 PDF 文檔的 Web 請求作出響應時)或者是其他類型的 OutputStream。當響應相同,但其類型隨所請求的是 PDF、RTF、HTML 或 XML 文檔而有所不同時,使用 iText 是非常方便的。iText 允許使用者建立浮水印,對文檔進行加密以及設定其他輸出細節。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.