1、相关jar包引入
net.sf.jasperreports
jasperreports
4.5.1
commons-collections
commons-collections
commons-beanutils
commons-beanutils
org.apache.poi
poi-ooxml
com.itextpdf
itextpdf
5.5.6
net.sf.jasperreports
jasperreports-fonts
4.0.0
cn.lesper
iTextAsian
3.0
com.itextpdf
itext-asian
5.2.0
com.itextpdf
itext-pdfa
5.5.11
org.codehaus.groovy
groovy-all
2.4.13
2、工具类
/**
* @param response httpServletResponse
* @param fileName 显示/保存 的文件名,不需要(.pdf)后缀
* @param data Fields 数据集合
* @param params 其它 params参数
* @param downLoad 是否下载 true:下载 false:在线预览
*/
public static void printPDF(HttpServletResponse response, String fileName, InputStream templateStream, List data, Map params, boolean downLoad) throws IOException, JRException {
// 1. 获取数据源
JRDataSource jrDataSource = new JRBeanCollectionDataSource(data);
// 2. 获取模板文件
// File jasperFile = ResourceUtils.getFile("classpath:" + jrxmlTemplate);
// 3. 编译 jrxml
JasperReport jasperReport = JasperCompileManager.compileReport(templateStream);
// 4. 获取报表
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, jrDataSource);
// 通过outputStream输出
JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
// 5. 设置响应格式
response.setCharacterEncoding("utf-8");
response.setContentType("application/pdf");
if(downLoad){
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".pdf");
}else{
response.setHeader("content-disposition", "inline;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".pdf");
}
}
3、调用Demo
@RequestMapping(value = "/printTest", method = RequestMethod.GET)
public Result printTest(HttpServletResponse response) throws Exception {
List<Map> data = new ArrayList();
Map map = new HashMap();
map.put("name","张三");
map.put("phone","88888888");
data.add(map);
String objectName = "test.jrxml";
OSS ossClient = aliyunOssClient.createOssClient();
OSSObject ossObject = ossClient.getObject(bucketName, objectName);
InputStream templateStream = ossObject.getObjectContent();
iReportHelper.printPDF(response,"打印预览", templateStream,data,map,false);
return Result.setSucMsg("success");
}
4、模板注意点
a) 模板数据源:list对应Fields,map对应Parameters
b) 模板字体尽量选用默认字体,jasper内置自带,其他字体容易报错jvm找不到字体,需要服务器安装。
c) 打印PDF选中以下属性,中文字体方可正常显示。且注意引入jasperreports-fonts 包。