Java純代碼實(shí)現(xiàn)導(dǎo)出PDF功能
java導(dǎo)出pdf
在項(xiàng)目開發(fā)中,產(chǎn)品的需求越來越奇葩啦,開始文件下載都是下載為excel的,做著做著需求竟然變了,要求能導(dǎo)出pdf。導(dǎo)出pdf倒也不是特別大的問題關(guān)鍵就是麻煩。
導(dǎo)出pdf我知道的一共有3中方法:
方法一:利用模板導(dǎo)出,但是首先編輯模板的工具不好找,現(xiàn)有的國外的工具要收費(fèi),所以放棄了這個。
方法二:利用HTML頁面導(dǎo)出,奈何自己不會寫HTML,前端忙沒時間幫忙寫。本著求人不如靠己的想法就選擇了第三種比較麻煩的方法,自己用table畫。
方法三:自己用純代碼畫格式(可調(diào)字體大小,顏色,對復(fù)雜沒有規(guī)則的數(shù)據(jù)都可以)
首先必須導(dǎo)入的依賴有
<!--導(dǎo)出pdf所需包-->
<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>然后就是一頓代碼輸出先把效果貼上

然后是代碼部分
@ApiOperation(value = "導(dǎo)出")
@PostMapping("/download")
@SneakyThrows(Exception.class)
public void download(@RequestBody @Valid FumigationDTO fumigationDTO, HttpServletResponse response, HttpServletRequest request) {
// 防止日志記錄獲取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");
fumigationService.download(fumigationDTO, response);
}業(yè)務(wù)層
@Override
public void download(FumigationDTO fumigationDTO, HttpServletResponse response) throws IOException {
//要下載的數(shù)據(jù)查詢數(shù)據(jù)部分我去掉了有需要自己根據(jù)業(yè)務(wù)取
FumigationDowloadVO fumigationDowloadVO = new FumigationDowloadVO();
// 定義全局的字體靜態(tài)變量
Font titlefont;
Font headfont;
Font keyfont = null;
Font textfont = null;
Font content = null;
// 最大寬度
try {
// 不同字體(這里定義為同一種字體:包含不同字號、不同style)
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
titlefont = new Font(bfChinese, 16, Font.BOLD);
headfont = new Font(bfChinese, 14, Font.BOLD);
keyfont = new Font(bfChinese, 10, Font.BOLD);
textfont = new Font(bfChinese, 15, Font.NORMAL);
content = new Font(bfChinese, 10, Font.NORMAL);
} catch (Exception e) {
e.printStackTrace();
}
BaseFont bf;
Font font = null;
try {
//創(chuàng)建字體
bf = BaseFont.createFont( "STSong-Light", "UniGB-UCS2-H",
BaseFont.NOT_EMBEDDED);
//使用字體并給出顏色
font = new Font(bf,20,Font.BOLD,BaseColor.BLACK);
} catch (Exception e) {
e.printStackTrace();
}
Document document = new Document(new RectangleReadOnly(842F, 595F));
try {
PdfWriter.getInstance(document,response.getOutputStream());
//打開生成的pdf文件
document.open();
//設(shè)置內(nèi)容
Paragraph paragraph = new Paragraph("熏蒸備案回執(zhí)",font);
paragraph.setAlignment(1);
//引用字體
document.add(paragraph);
// 設(shè)置表格的列寬和列數(shù)
float[] widths = {25f,25f,25f,25f,25f,25f};
PdfPTable table = new PdfPTable(widths);
table.setSpacingBefore(20f);
// 設(shè)置表格寬度為100%
table.setWidthPercentage(100.0F);
table.setHeaderRows(1);
table.getDefaultCell().setHorizontalAlignment(1);
PdfPCell cell = null;
//第一行
cell = new PdfPCell(new Paragraph("熏蒸備案編碼",content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setFixedHeight(30);
table.addCell(cell);
cell = new PdfPCell(new Paragraph(fumigationDowloadVO.getXzbm()));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
cell = new PdfPCell(new Paragraph("熏蒸備案時間",content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
cell = new PdfPCell(new Paragraph(CheckVerifyUtil.dateToString4(fumigationDowloadVO.getSqxzrq())));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
cell = new PdfPCell(new Paragraph("申請備案單位",content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
cell = new PdfPCell(new Paragraph(fumigationDowloadVO.getDwmc(),content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
//第二行
cell = new PdfPCell(new Paragraph("熏蒸作業(yè)庫點(diǎn)",content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setFixedHeight(30);
table.addCell(cell);
cell = new PdfPCell(new Paragraph(fumigationDowloadVO.getKdmc(),content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
cell = new PdfPCell(new Paragraph("負(fù)責(zé)人",content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
cell = new PdfPCell(new Paragraph(fumigationDowloadVO.getFzr(),content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
cell = new PdfPCell(new Paragraph("聯(lián)系電話",content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
cell = new PdfPCell(new Paragraph(fumigationDowloadVO.getFzrdh(),content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
//第三行
cell = new PdfPCell(new Paragraph("單據(jù)狀態(tài)",content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setFixedHeight(30);
table.addCell(cell);
cell = new PdfPCell(new Paragraph(shzt(fumigationDowloadVO.getShzt()),content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
cell = new PdfPCell(new Paragraph("審核時間",content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
cell = new PdfPCell(new Paragraph(CheckVerifyUtil.dateToString5(fumigationDowloadVO.getShsj()),content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
cell = new PdfPCell(new Paragraph(" ",content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
cell = new PdfPCell(new Paragraph(" ",content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
// 設(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);
//人員列表-第四行
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("職務(wù)",content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table2.addCell(cell);
cell = new PdfPCell(new Paragraph("職業(yè)資格",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("熏蒸任務(wù)分工",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);
//人員列表數(shù)據(jù)-第五行
if(fumigationDowloadVO.getProples().size() > 0){
for (RecordFumigationPeople prople : fumigationDowloadVO.getProples()) {
PdfPCell cell1 = new PdfPCell(new Paragraph(prople.getXm(), content));
PdfPCell cell2 = new PdfPCell(new Paragraph(prople.getZw(), content));
PdfPCell cell3 = new PdfPCell(new Paragraph(prople.getZyzg(), content));
PdfPCell cell4 = new PdfPCell(new Paragraph(prople.getStzk(), content));
PdfPCell cell5 = new PdfPCell(new Paragraph(prople.getXzrwfg(), content));
PdfPCell cell6 = new PdfPCell(new Paragraph(prople.getSfwb(), 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);
}
}
// 設(shè)置表格的列寬和列數(shù)
float[] widths3 = {25f,25f,25f,25f,25f};
PdfPTable table3 = new PdfPTable(widths3);
table3.setSpacingBefore(20f);
// 設(shè)置表格寬度為100%
table3.setWidthPercentage(100.0F);
table3.setHeaderRows(1);
table3.getDefaultCell().setHorizontalAlignment(1);
//實(shí)施儲糧信息
cell = new PdfPCell(new Paragraph("倉房",content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setFixedHeight(20);
table3.addCell(cell);
cell = new PdfPCell(new Paragraph("貨位",content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table3.addCell(cell);
cell = new PdfPCell(new Paragraph("糧食品種",content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table3.addCell(cell);
cell = new PdfPCell(new Paragraph("計(jì)劃熏蒸開始時間",content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table3.addCell(cell);
cell = new PdfPCell(new Paragraph("計(jì)劃熏蒸結(jié)束時間",content));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table3.addCell(cell);
if(fumigationDowloadVO.getDtls().size() > 0){
for (RecordFumigationDtlVO dtl : fumigationDowloadVO.getDtls()) {
PdfPCell cell1 = new PdfPCell(new Paragraph(dtl.getCfmc(), content));
PdfPCell cell2 = new PdfPCell(new Paragraph(dtl.getHwmc(), content));
PdfPCell cell3 = new PdfPCell(new Paragraph(dtl.getLspzmc(), content));
PdfPCell cell4 = new PdfPCell(new Paragraph(CheckVerifyUtil.dateToString4(dtl.getJhxzksrq()), content));
PdfPCell cell5 = new PdfPCell(new Paragraph(CheckVerifyUtil.dateToString4(dtl.getJhxzjsrq()), content));
//設(shè)置居中
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);
table3.addCell(cell1);
table3.addCell(cell2);
table3.addCell(cell3);
table3.addCell(cell4);
table3.addCell(cell5);
}
}
document.add(new Paragraph("\n"));
document.add(new Paragraph("▋ 基本信息",content));
document.add(new Paragraph("\n"));
document.add(table);
document.add(new Paragraph("\n"));
document.add(new Paragraph("▋ 基本信息",content));
document.add(new Paragraph("\n"));
document.add(table2);
document.add(new Paragraph("\n"));
document.add(new Paragraph("▋ 熏蒸作業(yè)儲糧糧情",content));
document.add(new Paragraph("\n"));
document.add(table3);
//關(guān)閉文檔
document.close();
} catch (DocumentException e) {
e.printStackTrace();
log.error("導(dǎo)出pdf失敗:{}",e);
}
}然后就可以了直接導(dǎo)出pdf。
到此這篇關(guān)于Java純代碼實(shí)現(xiàn)導(dǎo)出PDF功能的文章就介紹到這了,更多相關(guān)Java導(dǎo)出PDF內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot 整合 Shiro 密碼登錄與郵件驗(yàn)證碼登錄功能(多 Realm 認(rèn)證)
這篇文章主要介紹了SpringBoot 整合 Shiro 密碼登錄與郵件驗(yàn)證碼登錄(多 Realm 認(rèn)證),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02
SpringBoot3.1.2 引入Swagger報(bào)錯Type javax.servlet.http
這篇文章主要介紹了SpringBoot3.1.2 引入Swagger報(bào)錯Type javax.servlet.http.HttpServletRequest not present解決辦法,文中通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03
springboot項(xiàng)目打包成jar包的圖文教程
有時候我們會用IDEA來開發(fā)一些小工具,需要打成可運(yùn)行的JAR包,這篇文章主要給大家介紹了關(guān)于springboot項(xiàng)目打包成jar包的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
Spring實(shí)戰(zhàn)之使用TransactionProxyFactoryBean實(shí)現(xiàn)聲明式事務(wù)操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之使用TransactionProxyFactoryBean實(shí)現(xiàn)聲明式事務(wù)操作,結(jié)合實(shí)例形式分析了spring使用TransactionProxyFactoryBean實(shí)現(xiàn)聲明式事務(wù)相關(guān)配置、接口設(shè)置與使用技巧,需要的朋友可以參考下2020-01-01
IntelliJ IDEA 部署 Web 項(xiàng)目,看這一篇夠了!
這篇文章主要介紹了IntelliJ IDEA 部署 Web 項(xiàng)目的圖文教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
java中File與MultipartFile互轉(zhuǎn)代碼示例
在Java開發(fā)中,當(dāng)需要將本地File對象轉(zhuǎn)換為MultipartFile對象以處理文件上傳時,可以通過實(shí)現(xiàn)MultipartFile接口或使用CommonsMultipartFile類來實(shí)現(xiàn),本文提供了詳細(xì)的轉(zhuǎn)換方法和代碼示例,需要的朋友可以參考下2024-10-10
Java 根據(jù)url下載網(wǎng)絡(luò)資源
這篇文章主要介紹了Java 根據(jù)url下載網(wǎng)絡(luò)資源的示例代碼,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-11-11
SpringBoot攔截器實(shí)現(xiàn)登錄攔截的方法示例
這篇文章主要介紹了SpringBoot攔截器實(shí)現(xiàn)登錄攔截的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
springboot響應(yīng)json?null值過濾方式
這篇文章主要介紹了springboot響應(yīng)json?null值過濾方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11

