溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

從Java應(yīng)用程序動態(tài)生成PDF文件(轉(zhuǎn))

發(fā)布時間:2020-08-13 09:08:23 來源:ITPUB博客 閱讀:237 作者:BSDLite 欄目:編程語言
從Java應(yīng)用程序動態(tài)生成PDF文件(轉(zhuǎn))[@more@]如果應(yīng)用程序需要動態(tài)生成 PDF 文檔,則需要 iText 庫。開放源碼的 iText 庫使 PDF 文檔的創(chuàng)建能夠在瞬間完成。本文介紹了 iText 并提供了使用它從 Java ? 技術(shù)應(yīng)用程序生成 PDF 文檔的由淺入深的指南。我們創(chuàng)建了一個示例應(yīng)用程序以更好地理解 iText。


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

  熟悉 iText

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

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

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

  iText API:近距離觀察

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

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

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

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

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

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

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

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

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

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

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

  瀏覽到 C: emp 目錄,選擇該目錄下的 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)建一個工作示例更好地演示技術(shù)了?現(xiàn)在有了所需的工具(Eclipse IDE)和庫(iText 庫),可以開始設(shè)計(jì)和開發(fā)一個示例應(yīng)用程序了。

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

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

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

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

  第一個參數(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();

  第一個參數(shù)是對文檔對象的引用,第二個參數(shù)是文件的實(shí)際名稱,在該名稱中還會給出其輸出路徑。接下來,打開文檔以寫入內(nèi)容。
  現(xiàn)在,將在文檔的第一頁上添加一些文本。通過 com.lowagie.text.Paragraph 來添加文本??梢杂梦谋炯捌淠J(rèn)的字體、顏色、大小等等設(shè)置來創(chuàng)建一個默認(rèn)段落。或者,也可以設(shè)置自己的字體。下面讓我們來看看這兩種做法。

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

document.add(new Paragraph("First page of the document."));
document.add(new Paragraph("Some more text o­n 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)閉文檔。




Click here to open new window400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" border=0 resized="true">

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

  您已經(jīng)看到了如何向 PDF 文檔中添加純文本。接下來,需要向文檔中添加一些復(fù)雜的元素。我們開始創(chuàng)建一個新的章節(jié)。章節(jié)是一個特殊的小節(jié),默認(rèn)情況下,章節(jié)從一個新的頁面開始,并顯示一個默認(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)建了一個新的章節(jié)對象,chapter1,其標(biāo)題為 “This is Chapter 1”,將編號級別設(shè)為 0 就不會在頁面上顯示章節(jié)編號。

  小節(jié)是章節(jié)的子元素。在下面的代碼中,創(chuàng)建了一個標(biāo)題為 “This is Section 1 in Chapter 1” 的小節(jié)。為在該小節(jié)下添加一些文本,創(chuàng)建了另一個段落對象,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();。




Click here to open new window400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" border=0 resized="true">

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

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

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

  最后,我們來看一下如何將列表添加到 PDF 文檔中。列表包含一定數(shù)量的 ListItem??梢詫α斜磉M(jìn)行編號,也可以不編號。將第一個參數(shù)設(shè)置為 true 表明想創(chuàng)建一個要進(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)用程序中所做的一樣,還要在這時關(guān)閉文檔對象。

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

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

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

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

  在某個目錄中解壓縮 j-itextsample.jar。例如,如果將其解壓縮到 C: emp,則會將源碼和類文件放到 C: empcomitext est 目錄下。

  打開一個命令提示,將目錄更改為 C: emp。

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

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

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




Click here to open new window400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" border=0 resized="true">

圖 3. PDF 文檔的屏幕圖

  結(jié)束語

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

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI