這篇文章給大家分享的是有關(guān)Java使用itext5實(shí)現(xiàn)PDF表格文檔導(dǎo)出的示例分析的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
專(zhuān)注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)岱岳免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000+企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
最近拿到一個(gè)需求,需要導(dǎo)出PDF文檔,市面上可以實(shí)現(xiàn)的方法有很多,經(jīng)過(guò)測(cè)試和調(diào)研決定使用itext5來(lái)實(shí)現(xiàn),話不多說(shuō),說(shuō)干就干。
1.依賴(lài)導(dǎo)入
<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13.1</version> </dependency> <!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency>
這里說(shuō)明下:上面的依賴(lài)就是主要實(shí)現(xiàn)PDF生成的,下面的依賴(lài)是中文字體相關(guān)依賴(lài);
2.PDF表格導(dǎo)出實(shí)現(xiàn)
1.導(dǎo)出PDF
// 1.打開(kāi)文檔并設(shè)置基本屬性 Document document = new Document(); // 2.設(shè)置請(qǐng)求頭,encode文件名 response.setContentType("application/pdf;charset=UTF-8"); response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode("" + recordDto.getTitle() + ".pdf", "UTF-8")); // 3.通過(guò)流將pdf實(shí)例寫(xiě)出到瀏覽器 PdfWriter writer = PdfWriter.getInstance(document, response.getOutputStream());
至此導(dǎo)出PDF已經(jīng)實(shí)現(xiàn)了,只是這個(gè)PDF中什么內(nèi)容都沒(méi)有,明白這一點(diǎn),接下來(lái)做的就是給這個(gè)文檔“加料”咯(這里的response就是HttpServletResponse)。
2.頁(yè)面美化
// 這里的wirter就是上文的writer writer.setViewerPreferences(PdfWriter.PageModeUseThumbs); writer.setPageSize(PageSize.A4);
這里設(shè)置了文檔的顯示縮略圖以及文檔大小為A4;
3.中文字體設(shè)置
public static Font getPdfChineseFont() throws Exception { BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); Font fontChinese = new Font(bfChinese, 12, Font.NORMAL); fontChinese.setColor(BaseColor.BLACK); fontChinese.setSize(11); return fontChinese; }
這個(gè)方法設(shè)置了中文字體樣式,感興趣的同學(xué)可以試試其他的樣式,例如:字體顏色,大小,字體都可以修改;
4.輸出表格內(nèi)容到文檔
// 首先打開(kāi)文檔 document.open(); // 向文檔中添加表格數(shù)據(jù) private static void printBasicInfo(ShopApplyRecordDto recordDto, Document document, Font font) throws DocumentException { // 表格中的數(shù)據(jù) Object[][] basicDatas = { {"標(biāo)題","xxx申請(qǐng)", "審批編號(hào)","1234"}, {"申請(qǐng)人","小明", "申請(qǐng)商鋪","xxx商場(chǎng)"}, {"申請(qǐng)日期","2020/1/16", "審批結(jié)果","同意")}}; // 每個(gè)cell的寬度 float[] widthss = {50, 200, 50, 200}; // 創(chuàng)建一個(gè)表格,每一行有四個(gè)cell PdfPTable basicTable = new PdfPTable(widthss); // 外層循環(huán)表格的行 for (int i = 0; i < basicDatas.length; i++) { // 內(nèi)層循環(huán)每一行具體數(shù)據(jù) for (int j = 0; j < basicDatas[i].length; j++) { // 新建一個(gè)cell PdfPCell cell = new PdfPCell(); // 這個(gè)方法是統(tǒng)一設(shè)置表格和cell的樣式,下面會(huì)寫(xiě) setTableStyle(basicTable, cell); // cell中需要填充數(shù)據(jù)的格式 Paragraph paragraph = new Paragraph(StrUtil.toString(basicDatas[i][j]), font); // 設(shè)置cell的值 cell.setPhrase(paragraph); // 將cell添加到表格中 basicTable.addCell(cell); } } // 將表格添加到文檔中 document.add(basicTable); } // 結(jié)束時(shí)要關(guān)閉文檔 document.close();
大功告成,現(xiàn)在導(dǎo)出的PDF中已經(jīng)有了類(lèi)似這樣的表格了:
當(dāng)然你的樣式會(huì)很丑,接下來(lái)我們來(lái)設(shè)置下樣式。
5.表格和cell樣式設(shè)置
public static void setTableStyle(PdfPTable table, PdfPCell cell) { // 設(shè)置表格樣式 table.setLockedWidth(true); table.setTotalWidth(500); table.setHorizontalAlignment(Element.ALIGN_LEFT); // 設(shè)置單元格樣式 cell.setMinimumHeight(35); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setBackgroundColor(BaseColor.WHITE); cell.setBorder(0); cell.setBorderWidthTop(0.1f); cell.setBorderWidthBottom(0.1f); cell.setBorderWidthLeft(0.1f); cell.setBorderWidthRight(0.1f); cell.setBorderColorBottom(BaseColor.BLACK); cell.setBorderColorLeft(BaseColor.BLACK); cell.setBorderColorRight(BaseColor.BLACK); cell.setBorderColorTop(BaseColor.BLACK); cell.setPadding(3); }
api方法還是比較易懂的,這里就不多贅述了,不明白的自己設(shè)置試試就可以做出自己喜歡的樣式咯。
6.頁(yè)眉和頁(yè)碼的設(shè)置
這里說(shuō)明下,itext2和itext5的api有很大不同,2的版本有一個(gè)專(zhuān)門(mén)的HeaderFooter類(lèi)來(lái)設(shè)置樣式,5的版本沒(méi)有這樣的類(lèi),取而代之的是PdfPageEventHelper這樣一個(gè)事件處理類(lèi),這里大家千萬(wàn)別弄混了,這兩個(gè)版本的api互相不兼容;
這里首先寫(xiě)一個(gè)PdfPageEventHelper的子類(lèi)來(lái)實(shí)現(xiàn)頁(yè)眉頁(yè)碼的打印:
public class HeaderFooter extends PdfPageEventHelper { // 這里是業(yè)務(wù)相關(guān)的屬性可以無(wú)視 private ShopApplyRecordDto recordDto; private SysUserInfo userInfo; // 大部分情況下頁(yè)眉的值是動(dòng)態(tài)的,這里可以在初始化的時(shí)候進(jìn)行參數(shù)傳遞 public HeaderFooter(ShopApplyRecordDto recordDto, SysUserInfo userInfo) { this.recordDto = recordDto; this.userInfo = userInfo; } public HeaderFooter() { } public ShopApplyRecordDto getRecordDto() { return recordDto; } public void setRecordDto(ShopApplyRecordDto recordDto) { this.recordDto = recordDto; } public SysUserInfo getUserInfo() { return userInfo; } public void setUserInfo(SysUserInfo userInfo) { this.userInfo = userInfo; } // 這個(gè)方法就是實(shí)現(xiàn)頁(yè)眉和頁(yè)碼的關(guān)鍵:它的含義是每當(dāng)頁(yè)面結(jié)束會(huì)執(zhí)行該方法 @Override public void onEndPage(PdfWriter writer, Document document) { Font font = null; try { font = getPdfChineseFont(); } catch (Exception e) { e.printStackTrace(); } SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm"); // 設(shè)置頁(yè)眉:這里圖省事就用空格來(lái)實(shí)現(xiàn)左中右三個(gè)位置的頁(yè)眉,其實(shí)可以寫(xiě)三個(gè),通過(guò)Element.ALIGN_LEFT來(lái)控制頁(yè)眉的位置,document.left()/document.top()這兩個(gè)可以設(shè)置頁(yè)眉具體位置類(lèi)似于html的上下調(diào)整,大家可以多試試 ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_LEFT, new Phrase("所屬項(xiàng)目:" + recordDto.getMallName() + " 打印時(shí)間:" + format.format(new Date()) + " 打印人:" + userInfo.getUserName(), font), document.left(), document.top() + 3, 0); // 獲得一個(gè)名為“art”的盒子 Rectangle rect = writer.getBoxSize("art"); // 設(shè)置頁(yè)碼:這里的頁(yè)碼位置已經(jīng)設(shè)置好,大家可直接使用,至于1/20這種效果的頁(yè)碼實(shí)現(xiàn)則十分復(fù)雜,如有需求請(qǐng)自行百度/谷歌 ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase(String.format("%d", writer.getPageNumber())), (rect.getLeft() + rect.getRight()) / 2, rect.getBottom() - 18, 0); } public static Font getPdfChineseFont() throws Exception { BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); Font fontChinese = new Font(bfChinese, 12, Font.NORMAL); fontChinese.setColor(BaseColor.BLACK); fontChinese.setSize(11); return fontChinese; } } 接下來(lái)就很簡(jiǎn)單了,將我們的HeaderFooter設(shè)置給PdfWriter對(duì)象即可: // 新建HeaderFooter并傳遞需要的參數(shù) HeaderFooter headerFooter = new HeaderFooter(recordDto, userInfo); // 新建一個(gè)盒子 Rectangle rect = new Rectangle(36, 54, 559, 788); // 設(shè)置名稱(chēng)為“art”,上面get的就是這個(gè)盒子了 writer.setBoxSize("art", rect); writer.setPageEvent(headerFooter); // 這個(gè)可以設(shè)置內(nèi)容的margin document.setMargins(45f, 45f, 65f, 50f);
7.效果展示
感謝各位的閱讀!關(guān)于“Java使用itext5實(shí)現(xiàn)PDF表格文檔導(dǎo)出的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
網(wǎng)頁(yè)名稱(chēng):Java使用itext5實(shí)現(xiàn)PDF表格文檔導(dǎo)出的示例分析
URL鏈接:http://aaarwkj.com/article44/gjdoee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、云服務(wù)器、網(wǎng)站收錄、定制開(kāi)發(fā)、面包屑導(dǎo)航、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)