JAVA純代碼導出PDF文件實現方式
JAVA純代碼導出PDF文件
突發(fā)奇想,發(fā)布一篇生成pdf的博客。最初做導出pdf文件還是剛接觸項目的時候,從最邊緣的功能開始..........
想要實現導出PDF文件,但是當時已經生成了對應的Word文件,就想著直接把Word文件轉為PDF就好了,還方便格式什么的都實現了,最后花了很大力氣是實現了,但是效果不盡人意,就想著要不然直接生成PDF得了,后續(xù)就是看了一些博客,仿照著實現了導出PDF文件,但是自己最終實現效果有一點小瑕疵,一直沒有空去有哈一下,最近有點空閑時間查了一下資料,把這個小瑕疵修復掉了。
好了....到此上效果圖:
(1)這是正常情況:
(2)這是特殊情況
會出現第二種情況是因為一旦第二行的數據太多,第一頁放不下的時候,就會強制分頁。
其實在table對象上設置一個屬性就好:
// 這個方法可以告訴iText在遇到需要分頁的情況時,不要延遲分頁,而是立即分頁。這樣可以避免表格的一部分內容被拆分到兩頁之間。 table2.setSplitLate(false);
接下來最主要的代碼部分
1.首先是導入依賴
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.10</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency>
2.下載接口
@GetMapping("/download") public void download(HttpServletResponse response, HttpServletRequest request) throws UnsupportedEncodingException { // 防止日志記錄獲取session異常 request.getSession(); // 設置編碼格式 response.setContentType("application/pdf;charset=UTF-8"); response.setCharacterEncoding("utf-8"); String fileName = URLEncoder.encode("下載的PDF名稱", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".pdf"); download1(response); }
3.下載方法實現
public void download1(HttpServletResponse response) { //要下載的數據查詢數據部分我去掉了有需要自己根據業(yè)務取 ArrayList<Map<String, Object>> list = new ArrayList<>(); HashMap<String, Object> resultMap = new HashMap<>(); HashMap<String, Object> resultMap1 = new HashMap<>(); resultMap1.put("xm", "002"); resultMap1.put("zw", "李四"); resultMap1.put("zyzg","男"); resultMap1.put("stzk", "2001-12-36"); resultMap1.put("xyrwfg", "150269200110292012"); resultMap1.put("sfwb", "18722061569"); list.add(resultMap1); // 測試數據---實際將數據換為業(yè)務數據就ok HashMap<String, Object> resultMap2 = new HashMap<>(); resultMap2.put("xm", "001"); resultMap2.put("zw", "張三"); resultMap2.put("zyzg", "在一片寧靜的山谷之中,有一座古老的小鎮(zhèn),鎮(zhèn)上的人們過著與世無爭的生活。每當春天來臨,山谷里的桃花便會競相開放,將整個小鎮(zhèn)裝扮得如同仙境一般。小鎮(zhèn)的居民們會在這個時候舉行盛大的花節(jié),慶祝春天的到來。孩子們穿著節(jié)日的盛裝,在花叢中嬉戲;老人們則坐在樹下,享受著溫暖的陽光,講述著過去的故事。這里的每一磚一瓦,每一草一木,都承載著歲月的記憶,讓人感受到一種悠然自得的生活態(tài)度。隨著時間的流逝,雖然外界的世界日新月異,但這座小鎮(zhèn)依舊保持著它獨有的寧靜與美好,成為了一個遠離喧囂的理想之地。在一片寧靜的山谷之中,有一座古老的小鎮(zhèn),鎮(zhèn)上的人們過著與世無爭的生活。每當春天來臨,山谷里的桃花便會競相開放,將整個小鎮(zhèn)裝扮得如同仙境一般。小鎮(zhèn)的居民們會在這個時候舉行盛大的花節(jié),慶祝春天的到來。孩子們穿著節(jié)日的盛裝,在花叢中嬉戲;老人們則坐在樹下,享受著溫暖的陽光,講述著過去的故事。這里的每一磚一瓦,每一草一木,都承載著歲月的記憶,讓人感受到一種悠然自得的生活態(tài)度。隨著時間的流逝,雖然外界的世界日新月異,但這座小鎮(zhèn)依舊保持著它獨有的寧靜與美好,成為了一個遠離喧囂的理想之地。"); resultMap2.put("stzk", "2000-01-01"); resultMap2.put("xyrwfg", "185214563257994512"); resultMap2.put("sfwb", "13546235689"); list.add(resultMap2); resultMap.put("xm", "006"); resultMap.put("zw", "老六"); resultMap.put("zyzg","男"); resultMap.put("stzk", "2003-01-09"); resultMap.put("xyrwfg", "120229186902101236"); resultMap.put("sfwb", "15935262569"); list.add(resultMap); // 定義全局的字體靜態(tài)變量 Font content = null; BaseFont bf; try { // 不同字體(這里定義為同一種字體:包含不同字號、不同style) BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); content = new Font(bfChinese, 10, Font.NORMAL); //創(chuàng)建字體 bf = BaseFont.createFont( "STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); } catch (Exception e) { e.printStackTrace(); } // 創(chuàng)建文檔對象 Document document = new Document(new RectangleReadOnly(842F, 595F)); //設置頁邊距 60:左邊距,60:右邊距,72:上邊距,72:下邊距 document.setMargins(60, 60, 72, 72); try { PdfWriter writer = PdfWriter.getInstance(document,response.getOutputStream()); //添加頁碼 //添加頁碼 PdfHeaderFooterEvent event = new PdfHeaderFooterEvent(); writer.setPageEvent(event); //打開生成的pdf文件 document.open(); PdfPCell cell = null; // 設置表格的列寬和列數 float[] widths2 = {25f,25f,25f,25f,25f,25f}; PdfPTable table2 = new PdfPTable(widths2); table2.setSpacingBefore(20f); // 設置表格寬度為100% table2.setWidthPercentage(100.0F); table2.setHeaderRows(1); table2.getDefaultCell().setHorizontalAlignment(1); // 創(chuàng)建表頭 content: 字體 tableHeader(content, table2); // 填充內容 setContentData(list, content, table2); document.add(new Paragraph("\n")); document.add(new Paragraph("▋ 基本信息",content)); document.add(new Paragraph("\n")); // 設置分頁策略 table2.setSplitLate(false); document.add(table2); //關閉文檔 document.close(); } catch (DocumentException | IOException e) { e.printStackTrace(); } }
設置表頭信息:
private static void tableHeader(Font content, PdfPTable table2) { PdfPCell cell; cell = new PdfPCell(new Paragraph("學號", content)); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setFixedHeight(20); table2.addCell(cell); cell = new PdfPCell(new Paragraph("姓名", content)); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_CENTER); table2.addCell(cell); cell = new PdfPCell(new Paragraph("性別", content)); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_CENTER); table2.addCell(cell); cell = new PdfPCell(new Paragraph("出生日期", content)); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_CENTER); table2.addCell(cell); cell = new PdfPCell(new Paragraph("身份證號碼", content)); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_CENTER); table2.addCell(cell); cell = new PdfPCell(new Paragraph("聯系電話", content)); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_CENTER); table2.addCell(cell); }
填充表中數據:
private static void setContentData(ArrayList<Map<String, Object>> list, Font content, PdfPTable table2) { if(list.size() > 0){ for (Map<String, Object> map : list) { PdfPCell cell1 = new PdfPCell(new Paragraph(map.get("xm").toString(), content)); PdfPCell cell2 = new PdfPCell(new Paragraph(map.get("zw").toString(), content)); PdfPCell cell3 = new PdfPCell(new Paragraph(map.get("zyzg").toString(), content)); PdfPCell cell4 = new PdfPCell(new Paragraph(map.get("stzk").toString(), content)); PdfPCell cell5 = new PdfPCell(new Paragraph(map.get("xyrwfg").toString(), content)); PdfPCell cell6 = new PdfPCell(new Paragraph(map.get("sfwb").toString(), content)); //單元格對齊方式 cell1.setHorizontalAlignment(Element.ALIGN_CENTER); cell1.setVerticalAlignment(Element.ALIGN_MIDDLE); cell1.setFixedHeight(20); //單元格垂直對齊方式 cell2.setHorizontalAlignment(Element.ALIGN_CENTER); cell2.setVerticalAlignment(Element.ALIGN_MIDDLE); cell3.setHorizontalAlignment(Element.ALIGN_CENTER); cell3.setVerticalAlignment(Element.ALIGN_MIDDLE); cell4.setHorizontalAlignment(Element.ALIGN_CENTER); cell4.setVerticalAlignment(Element.ALIGN_MIDDLE); cell5.setHorizontalAlignment(Element.ALIGN_CENTER); cell5.setVerticalAlignment(Element.ALIGN_MIDDLE); cell6.setHorizontalAlignment(Element.ALIGN_CENTER); cell6.setVerticalAlignment(Element.ALIGN_MIDDLE); table2.addCell(cell1); table2.addCell(cell2); table2.addCell(cell3); table2.addCell(cell4); table2.addCell(cell5); table2.addCell(cell6); } } }
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
springcloud?feign服務之間調用,date類型轉換錯誤的問題
這篇文章主要介紹了springcloud?feign服務之間調用,date類型轉換錯誤的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03使用Java實現系統(tǒng)托盤功能的介紹(附源碼以及截圖)
本篇文章介紹了,在Java中實現系統(tǒng)托盤功能的詳解,文中附源碼以及截圖介紹。需要的朋友參考下2013-05-05SpringMVC 重新定向redirect請求中攜帶數據方式
這篇文章主要介紹了SpringMVC 重新定向redirect請求中攜帶數據方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12