JasperReport 导出PDF不能加载。
项目JasperReport模板导出PDF,最近在浏览器不能打开了。
提示【未能加载PDF文档】,但不是JasperReport导出的PDF却正常。
一、调查:
1、调查发现,通过代码生成的PDF版本为1.4
而能正常显示的PDF版本为1.7。
2、新问题:发现直接打开pdf文件能显示,但是使用项目中还是有问题。
项目中加载PDF是通过controller读取文件后,用ResponseEntity返回,
修改为reponse直接返回。
二、对策:
1、代码中生成PDF时,指定PDF版本,如下:
String outputFile = "c://jasper//test.pdf";
String templateFile = "c://jasper//template.jrxml"
Map<String, Object> params = new HashMap<Sring, Object>();
List<Object> dataList = new ArrayList<Object>();
// 加载模板
JasperDesign design = JRXmlLoader.load(templateFile);
JasperReport report = JasperCompileManager.compileReport(design);
// 填充数据
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(dataList);
JasperPrint print = JasperFillManager.fillReport(report, params, dataSource);
// 设置样式,支持中文
JRStyle style = new JRBaseStyle();
style.setPdfEmbedded(Boolean.TRUE);
style.setPdfFontName("STSong-Light");
style.setPdfEncoding("UniGB-UCS2-H");
print.setDefaultStyle(style);
// 构建PDF导出对象
JRPdfExporter exporter = new JRPdfExporter();
SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration();
configuration.setPdfVersion(PdfVersionEnum.VERSION_1_7); // 指定pdf版本
exporter.setConfiguration(configuration);
// 指定输入对象
ExporterInput exporterInput = new SimpleExporterInput(print);
exporter.setExporterInput(exporterInput);
// 指定导出对象
OutputStreamExporterOutput exporterOutput = new SimpleOutputStreamExporterOutput(outputFile);
exporter.setExporterOutput(exporterOutput);
// 导出PDF
exporter.exportReport();
2、修改返回pdf流的方式。
response.setContentType("application/pdf");
File file = new File("c://jasper//test.pdf");
FileInputStream in = new FileInputStream(file);
OutputStream out = response.getOutputStream();
byte[] b = new byte[512];
while ((in.read(b)) != -1) {
out.write(b);
}
out.flush();
in.close();
out.close();
注意:一定不要加response.setHeader(“content-disposition”,“attachment;filename=”+filename);