java itext 导出pdf文件_【Java,PDF】使用Itext实现PDF文件生成
重要聲明:本文章僅僅代表了作者個人對此觀點的理解和表述。讀者請查閱時持自己的意見進行討論。
前言
有時候,業(yè)務系統(tǒng)要求提供一個PDF文件導出的功能,這時候我們就需要將數(shù)據(jù)庫的對應數(shù)據(jù)查詢出來,然后生成PDF并提供下載,這其中比較陌生的部分相信就是如何使用這些數(shù)據(jù)生成一個PDF文件了,本文講述了使用 Itext 在Java后端生成PDF的方法,不妨來看看一吧。
一、加入依賴
首要第一步則是加入Itext的依賴,然后才可以使用相關的操作類。Itext 的依賴不是都在一個包里,它分了許許多多模塊,但基本的生成PDF的依賴包只需要引入2個即可。
首先是核心包:
com.itextpdf
itextpdf
5.5.13
然后需要引入對中文支持的包,畢竟大部分文檔中都會有中文內(nèi)容的。
com.itextpdf
itext-asian
5.2.0
只需要引入這兩個包,就可以完成基本的生成PDF操作了。
二、開始使用
Itext 的用法十分簡單,大致可以分為下面幾步:
構建文檔
打開文檔編輯功能
插入文檔內(nèi)容
關閉文檔編輯功能
1、構建文檔
Itext 構建文檔是通過 Document 類進行構建,不過要注意,大多數(shù)項目里面應該存在許多個 Document 類了,這里一定要使用 com.itextpdf.text 包下面的 Document 類。這個類包含一個無參構造函數(shù),意味著可以十分方便的 new 一個空文檔出來:
Document document = new Document();
默認創(chuàng)建的是 A4 紙大小、內(nèi)邊距 36 的PDF文檔。如果你希望創(chuàng)建不同大小以及不同邊距的文檔,你可以使用帶參構造函數(shù):
Document documentA8 = new Document(PageSize.A8);
Document documentA8_2 = new Document(PageSize.A8, 10, 10, 10,10);
這里構建了 2 個文檔,第一個文檔設定了大小為 A8 紙張大小, 第二個文檔設定了邊距為 10,這些邊距值分別對應左, 右, 上, 下。構建好了文檔,就可以開始進行文檔編輯了。
2、 打開文檔編輯功能
在編輯之前,需要先認識一個類 PdfWriter,這個類幫助我們打開文檔的編輯功能,同時能指定將pdf文件輸出到對應的輸出流里面,意味著我們?nèi)绻褂梦募敵隽?#xff0c;它就可以將pdf文件輸出到文件中。
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("D:/test.pdf"));
document.open();
使用 PdfWriter.getInstance 方法可以將文件到指定輸出流,傳入文件輸出流可實現(xiàn)輸出到文件。然后調(diào)用 document.open 方法打開編輯功能,只有調(diào)用了此方法之后,才可以對 document 進行編輯。
3、 插入內(nèi)容及中文
現(xiàn)在,可以放心的向文檔中插入內(nèi)容了,不如先插入一個段落在文檔中試一試, 使用 com.itextpdf.text.Paragraph 類可以實現(xiàn)對段落的構建,先來看個效果:
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("D:/test.pdf"));
document.open();
// 新建一個段落,內(nèi)容 Hello Pdf.
Paragraph p1 = new Paragraph("Hello Pdf.");
document.add(p1);
document.close();
最后不要忘了執(zhí)行關閉。打開D盤,發(fā)現(xiàn)文件test.pdf,效果如圖:
似乎非常完美,但當我把 “Hello” 改成 “你好”后,再一次生成文檔:
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("D:/test.pdf"));
document.open();
Paragraph p1 = new Paragraph("你好 Pdf.");
document.add(p1);
document.close();
再次運行,得到效果:
發(fā)現(xiàn)中文并沒有被顯示出來,這時候就需要用到剛才添加的第二個依賴了。要讓中文顯示正常,需要借助中文字體來實現(xiàn)這個需求,itext-asian 包內(nèi)置了一個中文字體提供使用。建立使用 itext-asian 內(nèi)置中文支持:
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font mfont = new Font(bfChinese, 15, Font.NORMAL, BaseColor.BLACK);
首先使用內(nèi)置字體建立基本字體類型,然后建立段落可以使用的字體對象,最后,mfont 對象就可以傳遞給 Paragraph,從而實現(xiàn)中文支持。代碼如下:
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font mfont = new Font(bfChinese, 15, Font.NORMAL, BaseColor.BLACK);
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("D:/test.pdf"));
document.open();
Paragraph p1 = new Paragraph("你好 Pdf.", mfont);
document.add(p1);
document.close();
運行效果圖如下:
.
有時候這個字體并不能滿足需求,你可以自己使用自己的字體文件來實現(xiàn)個性化字體:
// 使用window內(nèi)置的等線字體
BaseFont.createFont("C:/Windows/Fonts/Deng.ttf", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
// 使用自己的字體文件
BaseFont.createFont("D:/思源黑體正常字體.ttf", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
三、Itext 提供的各種文檔組件
上面簡單的介紹了段落使用方法,其實Itext除了段落組件,還提供了許多其他的組件封裝,比較常用的組件見下表:
類介紹
com.itextpdf.text.Anchor功能類似錨點、超鏈接
com.itextpdf.text.Chapter章節(jié)
com.itextpdf.text.Chunk能添加到文檔里的最小文本塊
com.itextpdf.text.Header這個信息不會顯示到pdf,常常是編輯者自己定義的一些文檔先關信息
com.itextpdf.text.Image圖片
com.itextpdf.text.JpegJpeg的圖片,其實它繼承自Image
com.itextpdf.text.List列表,這里面放 ListItem
com.itextpdf.text.ListItem列表條目
com.itextpdf.text.Meta這個和Header類似,但這是固定的一些文檔信息,字段名只允許:subject,title,keywords,author,creationdate,producer
com.itextpdf.text.Paragraph文本段落
com.itextpdf.text.Phrase文本,這就好像html里面的span,它可以設定自己的樣式。
四、導出PDF
當你把你的各個數(shù)據(jù)全部寫入到了 document 里面后,就可以將這個 document 導出給請求端了,如果我們把這個文檔像這樣進行構建寫操作:
PdfWriter.getInstance(document, new FileOutputStream("D:/test.pdf"));
那么我們的pdf文件就會被保存到服務器里面,而我們的目標是導出給請求端,所以,只需要把 第二個參數(shù)從文件輸出流變成響應輸出流即可:
// ... 更多代碼
PdfWriter.getInstance(document, response.getOutputStream());
// ... 跟多代碼
總結
以上是生活随笔為你收集整理的java itext 导出pdf文件_【Java,PDF】使用Itext实现PDF文件生成的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java的成员方法_java编程中的成员
- 下一篇: java泛型怎么用反射生成_Java 之