JAVA純代碼導(dǎo)出PDF文件實(shí)現(xiàn)方式
JAVA純代碼導(dǎo)出PDF文件
突發(fā)奇想,發(fā)布一篇生成pdf的博客。最初做導(dǎo)出pdf文件還是剛接觸項(xiàng)目的時(shí)候,從最邊緣的功能開始..........
想要實(shí)現(xiàn)導(dǎo)出PDF文件,但是當(dāng)時(shí)已經(jīng)生成了對(duì)應(yīng)的Word文件,就想著直接把Word文件轉(zhuǎn)為PDF就好了,還方便格式什么的都實(shí)現(xiàn)了,最后花了很大力氣是實(shí)現(xiàn)了,但是效果不盡人意,就想著要不然直接生成PDF得了,后續(xù)就是看了一些博客,仿照著實(shí)現(xiàn)了導(dǎo)出PDF文件,但是自己最終實(shí)現(xiàn)效果有一點(diǎn)小瑕疵,一直沒有空去有哈一下,最近有點(diǎn)空閑時(shí)間查了一下資料,把這個(gè)小瑕疵修復(fù)掉了。
好了....到此上效果圖:
(1)這是正常情況:

(2)這是特殊情況

會(huì)出現(xiàn)第二種情況是因?yàn)橐坏┑诙械臄?shù)據(jù)太多,第一頁放不下的時(shí)候,就會(huì)強(qiáng)制分頁。
其實(shí)在table對(duì)象上設(shè)置一個(gè)屬性就好:
// 這個(gè)方法可以告訴iText在遇到需要分頁的情況時(shí),不要延遲分頁,而是立即分頁。這樣可以避免表格的一部分內(nèi)容被拆分到兩頁之間。 table2.setSplitLate(false);
接下來最主要的代碼部分
1.首先是導(dǎo)入依賴
<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();
// 設(shè)置編碼格式
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.下載方法實(shí)現(xiàn)
public void download1(HttpServletResponse response) {
//要下載的數(shù)據(jù)查詢數(shù)據(jù)部分我去掉了有需要自己根據(jù)業(yè)務(wù)取
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);
// 測(cè)試數(shù)據(jù)---實(shí)際將數(shù)據(jù)換為業(yè)務(wù)數(shù)據(jù)就ok
HashMap<String, Object> resultMap2 = new HashMap<>();
resultMap2.put("xm", "001");
resultMap2.put("zw", "張三");
resultMap2.put("zyzg", "在一片寧靜的山谷之中,有一座古老的小鎮(zhèn),鎮(zhèn)上的人們過著與世無爭(zhēng)的生活。每當(dāng)春天來臨,山谷里的桃花便會(huì)競(jìng)相開放,將整個(gè)小鎮(zhèn)裝扮得如同仙境一般。小鎮(zhèn)的居民們會(huì)在這個(gè)時(shí)候舉行盛大的花節(jié),慶祝春天的到來。孩子們穿著節(jié)日的盛裝,在花叢中嬉戲;老人們則坐在樹下,享受著溫暖的陽光,講述著過去的故事。這里的每一磚一瓦,每一草一木,都承載著歲月的記憶,讓人感受到一種悠然自得的生活態(tài)度。隨著時(shí)間的流逝,雖然外界的世界日新月異,但這座小鎮(zhèn)依舊保持著它獨(dú)有的寧靜與美好,成為了一個(gè)遠(yuǎn)離喧囂的理想之地。在一片寧靜的山谷之中,有一座古老的小鎮(zhèn),鎮(zhèn)上的人們過著與世無爭(zhēng)的生活。每當(dāng)春天來臨,山谷里的桃花便會(huì)競(jìng)相開放,將整個(gè)小鎮(zhèn)裝扮得如同仙境一般。小鎮(zhèn)的居民們會(huì)在這個(gè)時(shí)候舉行盛大的花節(jié),慶祝春天的到來。孩子們穿著節(jié)日的盛裝,在花叢中嬉戲;老人們則坐在樹下,享受著溫暖的陽光,講述著過去的故事。這里的每一磚一瓦,每一草一木,都承載著歲月的記憶,讓人感受到一種悠然自得的生活態(tài)度。隨著時(shí)間的流逝,雖然外界的世界日新月異,但這座小鎮(zhèn)依舊保持著它獨(dú)有的寧靜與美好,成為了一個(gè)遠(yuǎ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 {
// 不同字體(這里定義為同一種字體:包含不同字號(hào)、不同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)建文檔對(duì)象
Document document = new Document(new RectangleReadOnly(842F, 595F));
//設(shè)置頁邊距 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;
// 設(shè)置表格的列寬和列數(shù)
float[] widths2 = {25f,25f,25f,25f,25f,25f};
PdfPTable table2 = new PdfPTable(widths2);
table2.setSpacingBefore(20f);
// 設(shè)置表格寬度為100%
table2.setWidthPercentage(100.0F);
table2.setHeaderRows(1);
table2.getDefaultCell().setHorizontalAlignment(1);
// 創(chuàng)建表頭 content: 字體
tableHeader(content, table2);
// 填充內(nèi)容
setContentData(list, content, table2);
document.add(new Paragraph("\n"));
document.add(new Paragraph("▋ 基本信息",content));
document.add(new Paragraph("\n"));
// 設(shè)置分頁策略
table2.setSplitLate(false);
document.add(table2);
//關(guān)閉文檔
document.close();
} catch (DocumentException | IOException e) {
e.printStackTrace();
}
}設(shè)置表頭信息:
private static void tableHeader(Font content, PdfPTable table2) {
PdfPCell cell;
cell = new PdfPCell(new Paragraph("學(xué)號(hào)", 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("身份證號(hào)碼", content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table2.addCell(cell);
cell = new PdfPCell(new Paragraph("聯(lián)系電話", content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table2.addCell(cell);
}填充表中數(shù)據(jù):
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));
//單元格對(duì)齊方式
cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell1.setFixedHeight(20);
//單元格垂直對(duì)齊方式
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);
}
}
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springcloud?feign服務(wù)之間調(diào)用,date類型轉(zhuǎn)換錯(cuò)誤的問題
這篇文章主要介紹了springcloud?feign服務(wù)之間調(diào)用,date類型轉(zhuǎn)換錯(cuò)誤的問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
使用Java實(shí)現(xiàn)系統(tǒng)托盤功能的介紹(附源碼以及截圖)
本篇文章介紹了,在Java中實(shí)現(xiàn)系統(tǒng)托盤功能的詳解,文中附源碼以及截圖介紹。需要的朋友參考下2013-05-05
SpringMVC 重新定向redirect請(qǐng)求中攜帶數(shù)據(jù)方式
這篇文章主要介紹了SpringMVC 重新定向redirect請(qǐng)求中攜帶數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
利用Java+MySQL實(shí)現(xiàn)附近功能實(shí)例
現(xiàn)在很多手機(jī)軟件都用附近搜索功能,但具體是怎么實(shí)現(xiàn)的呢?下面這篇文章就來給大家介紹關(guān)于利用Java+MySQL實(shí)現(xiàn)附近功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-12-12

