我试图导出一个PDF基于一个动态贾斯珀报告,使用分级设置。
build.gradle:
compile (group: 'net.sf.jasperreports', name: 'jasperreports', version: '6.18.1')
implementation group: 'ar.com.fdvs', name: 'DynamicJasper', version: '5.3.3'
implementation group: 'org.apache.poi', name: 'poi', version: '4.1.1'
// compile group: 'com.lowagie', name: 'itext', version:'2.1.7.js9'
runtime files('libs/itext-2.1.7.js9.jar')下面的Java代码,总是导出一个空白的PDF页面,如果我导出到CSV (从Japser),我可以看到生成的报告与正确的字段。如何修复以正确生成PDF?提前谢谢。
private void setupPdfExport(String format, HttpServletResponse response, ActivePatientsData data, ReportCriteriaFormSupport support, String currencySymbol, ReportCriteriaForm reportCriteriaForm, PortalSecurityPrinciple principle) throws Exception {
String csvFileName = "Active_patients."+format;
// response.setContentType(format.equals("pdf")?"application/pdf":
// format.equals("xsls")? "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" : "application/vnd.oasis.opendocument.spreadsheet");
response.setContentType("application/octet-stream");
String headerKey = "Content-Disposition";
String headerValue = String.format("attachment; filename=\"%s\"", csvFileName);
response.setHeader(headerKey, headerValue);
List<List<String>> outputRows = getCsv(false, data, support, reportCriteriaForm, principle, codesToNames);
List<String> headers = createHeadings(data, false);
FastReportBuilder drb = new FastReportBuilder();
String[] columnNames = headers.toArray(new String[0]);
Style headerStyle = new Style();
Font font = new Font(10, "Arial", true, false, false);
headerStyle.setFont(font);
headerStyle.setHorizontalAlign(HorizontalAlign.CENTER);
headerStyle.setVerticalAlign(VerticalAlign.TOP);
headerStyle.setBorder(Border.PEN_1_POINT());
headerStyle.setBackgroundColor(Color.WHITE);
headerStyle.setBorderColor(Color.BLACK);
headerStyle.setTextColor(Color.BLACK);
headerStyle.setTransparency(Transparency.OPAQUE);
drb .setDetailHeight(30)
.setReportName("Active Patients")
.setTitle("Active Patients")
.setSubtitle("This report was generated at " + new Date())
.setPageSizeAndOrientation(Page.Page_A4_Landscape())
.setWhenNoData("No Data", headerStyle)
.setUseFullPageWidth(true)
.setDetailHeight(15) //defines the height for each record of the report
.setMargins(30, 20, 30, 15) //define the margin space for each side (top, bottom, left and right)
.setDefaultStyles(headerStyle, headerStyle, headerStyle, headerStyle)
;
// drb.setTemplateFile(file.getAbsolutePath(), true, true, true, true);
for(int i=0; i<columnNames.length; i++){
drb.addColumn(columnNames[i],"COLUMN_"+i, String.class.getName(), 70,false );
}
List<Map<String, String>> dataRows = new LinkedList<>();
for(int j=0; j<outputRows.size(); j++){
List<String> row = outputRows.get(j);
Map<String, String> dataMap = new HashMap<>();
for(int i=0; i<columnNames.length; i++){
dataMap.put("COLUMN_"+i, row.get(i));
}
dataRows.add(dataMap);
}
DynamicReport dr = drb.build();
JasperPrint jasperPrint = DynamicJasperHelper.generateJasperPrint(dr, new ClassicLayoutManager(), new JRBeanCollectionDataSource(dataRows), params);
// JasperPrint jasperPrint = JasperFillManager.fillReport(
// jasperReport, params, dataSource);
ByteArrayOutputStream out = new ByteArrayOutputStream();
if (format.equals("pdf")) {
JRPdfExporter exporter = new JRPdfExporter();
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
SimplePdfReportConfiguration reportConfig
= new SimplePdfReportConfiguration();
reportConfig.setSizePageToContent(false);
reportConfig.setForceLineBreakPolicy(true);
SimplePdfExporterConfiguration exportConfig
= new SimplePdfExporterConfiguration();
exportConfig.setMetadataAuthor("Our Company");
exportConfig.setEncrypted(false);
exportConfig.setAllowedPermissionsHint("PRINTING");
exporter.setConfiguration(reportConfig);
exporter.setConfiguration(exportConfig);
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(out));
exporter.exportReport();
out.close();
}
// ... Also code in if blocks for XLS
byte[] binData = out.toByteArray();
OutputStream out1 = response.getOutputStream();
out1.write(binData);
out1.close();
response.setContentLength(binData.length);
}发布于 2022-03-21 13:02:02
文件下载已损坏。当我通过fileOutputStream将输出直接写入文件时,上面的代码可以工作,并生成一个报告表。
有关损坏的下载,请参见此处,How to return binary data instead of base64 encoded byte[] in spring mvc rest controller
https://stackoverflow.com/questions/71495136
复制相似问题