JasperReport是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDF,HTML,或者XML格式。该库完全由Java写成,可以用于在各种Java应用程序,包括J2EE,Web应用程序中生成动态内容。
首先我们需要在JasperSoft Studio创建一个我们需要生成的PDF模板,将模板放入我们的SpringBoot工程下。
下面是利用PDF模板生成binary文件的共通方法
private byte[] EmInfoReporting(HashMap<String, Object> param, List<EmInfo> data) {
InputStream input;
try {
input = new FileInputStream(resource.getResource("classpath:report/eminfo.jrxml").getFile());
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(data);
JasperReport jasperReport = JasperCompileManager.compileReport(input);
JasperPrint jasperPrint;
jasperPrint = JasperFillManager.fillReport(jasperReport, param, dataSource);
return JasperExportManager.exportReportToPdf(jasperPrint);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JRException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
前台Html使用Form表单进行post请求
<form id="exportPDF" th:method="POST" th:action="@{/nms/report}" target='_blank'>
<input type="text" style="display:none;" id="id" name="id" th:value="${eminfo.eminfoid}"/>
</form>
<a class="btn btn-link" href="javascript:exportPDF();">PDF生成</a>
function exportPDF(){
var action = $("#exportPDF").attr("action");
if(action.substring(action.length - 4, action.length) !== ".pdf"){
var curDate = new Date();
var curMonth = curDate.getMonth()+1;
var Current = curDate.getFullYear() + "-" + (curMonth < 10 ? "0" + curMonth : curMonth) + "-" + (curDate.getDate() < 10 ? "0" + curDate.getDate() : curDate.getDate()) + " " + (curDate.getHours() < 10 ? "0" + curDate.getHours() : curDate.getHours()) + ":" + (curDate.getMinutes() < 10 ? "0" + curDate.getMinutes() : curDate.getMinutes()) + ":" + (curDate.getSeconds() < 10 ? "0" + curDate.getSeconds() : curDate.getSeconds());
$("#exportPDF").attr("action", action + "/PDF_" + Current.replace(/-/g, "").replace(/:/g, "").replace(" ", "") + ".pdf");
}
$("#exportPDF").submit();
}
Server端接收到请求后调用生成binary文件的共通方法,利用HttpServletResponse类输出PDF
@PostMapping("report/{filename}")
public String emInfoPdfViewPost(@RequestParam("id") int id,@PathVariable String filename,HttpServletResponse response) {
HashMap<String,Object> params=new HashMap<String,Object>();
params.put("Client_name","makoto yagi");
List<EmInfo> datasource=new ArrayList<EmInfo>();
EmInfo eminfo=emInfoService.findOne(id);
datasource.add(eminfo);
params.put("eminfo",eminfo);
byte[] output=EmInfoReporting(params,datasource);
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "inline;filename=" + filename);//inline 在线预览;attachment 下载
response.setContentLength(output.length);
OutputStream os=null;
try {
os=response.getOutputStream();
os.write(output);
os.flush();
os.close();
}catch(IOException e) {
e.getStackTrace();
}
return null;
}
工程的pom.xml需要追加的jar包
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.13.0</version>
</dependency>
jasperreports_extension.properties
net.sf.jasperreports.extension.registry.factory.fonts=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.ireportfamily1513178418930=fonts/fontsfamily1513178418930.xml
fontsfamily1513178418930.xml
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
<fontFamily name="ipaexm">
<normal><![CDATA[fonts/ipaexm.ttf]]></normal>
<pdfEncoding><![CDATA[Identity-H]]></pdfEncoding>
<pdfEmbedded><![CDATA[true]]></pdfEmbedded>
<exportFonts/>
</fontFamily>
<fontFamily name="ipaexg">
<normal><![CDATA[fonts/ipaexg.ttf]]></normal>
<pdfEncoding><![CDATA[Identity-H]]></pdfEncoding>
<pdfEmbedded><![CDATA[true]]></pdfEmbedded>
<exportFonts/>
</fontFamily>
</fontFamilies>