每片文章前來首小詩:
需求:
項目里面有需要java動態生成 PDF 文件,提供下載。今天我找了下有關了,系統得學習了解下。
開源的 iText 庫使得 PDF 的創建變得輕松易行。下面介紹下
方案:
-----------------------
iText V5.X.X 版
-----------------------
第一步學習:
了解下:
- 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 可能是一個引用,或是一個引用的目標。
這里我用的是這兩個包,我分享下。
鏈接: http://pan.baidu.com/s/1koKaq 密碼:q2vy
清單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:\\Test.pdf")); document.open();
第一個參數是文檔對象的引用,第二個參數是輸出將寫入的文件的絕對名稱。接下來,我們打開文檔開始編寫。
現 在,我們將在文檔的第一頁上添加一些文本。任何文本都借助 com.itextpdf.text.Paragraph 來進行添加。您可使用您的文本以及字體、顏色、字號等默認設置創建一個默認段落。否則,您可提供自己的字體。 在本文中,我們還將討論 PDF 文檔的定位符(鏈接)。在此 PDF 中,我們使用 backToTop 作為鏈接。當單擊 backToTop 鏈接時,它會將您帶到文檔的第一頁。您需要將該文本設置為第一頁的定位目標。讓我們看看如何將定位目標和字體設置到所添加的段落中。
清單3. 創建段落對象
Anchor anchorTarget = new Anchor("ccccccccccccccccc"); anchorTarget.setName("bbbbbbbbbbbbbbbb"); Paragraph paragraph1 = new Paragraph(); paragraph1.setSpacingBefore(50); paragraph1.add(anchorTarget); document.add(paragraph1); document.add(new Paragraph("aaaaaaaaaaaaaaaaaaaaaa", FontFactory.getFont(FontFactory.COURIER, 14, Font.BOLD, new CMYKColor(0, 255, 0, 0))));
顯示了清單 3 中的代碼的樣例輸出。要關閉文檔,將 document.close();
添加到清單 3 中的代碼末尾。
這就是一個簡單的pdf 生成了。
第二步學習:
細心的同學們,詳細可以看幫助文檔。
鏈接: http://pan.baidu.com/s/15n2BX 密碼:kary
第三步學習:
再細心的同學,會問“干嘛用 aaaaaa bbbbbb cccccc”。中文呢?
這時候我們,需要解決。用幫助jar。我上面給你們分享了。
下面給個案例(超級簡單)。
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Font; import com.itextpdf.text.PageSize; import com.itextpdf.text.Paragraph; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfWriter; public class makePDF { /** * @param args * @throws DocumentException * @throws FileNotFoundException */ public static void main(String[] args) throws FileNotFoundException, DocumentException { // TODO Auto-generated method stub Document document = new Document(PageSize.A4, 50, 50, 50, 50);// 是用於生成 PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("D:\\pdftest.pdf")); document.open(); Paragraph par = new PDFParagraph("你好");// 此類表示段落。 par.add("這是我們第一個pdftext。"); document.add(par); document.close(); } } class PDFParagraph extends Paragraph { /** * */ private static final long serialVersionUID = 1L; public PDFParagraph(String content) { super(content, getChineseFont()); } private static final Font getChineseFont() { Font FontChinese = null; try { BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); FontChinese = new Font(bfChinese, 12, Font.NORMAL); } catch (DocumentException de) { System.err.println(de.getMessage()); } catch (IOException ioe) { System.err.println(ioe.getMessage()); } return FontChinese; } }
下面仔細解釋下:
Paragraph par = new PDFParagraph("你好");// 此類表示一個縮進的段落。
-->調用方法:
PDFParagraph(String content)
-->
super(content, getChineseFont());//實現父類,成功創造出我們需要的 段落。
-->
getChineseFont()//中文幫助jar幫我們解決,中文顯示。
總結:
iText是一個非常著名的能夠快速產生PDF文件的Java類庫。支持文本,表格,圖形的操作,可以方便的跟 Servlet 進行結合。
快去使用下。