首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试从Spring 1.5导出Dynamic-Jasper报告到PDF,但结果是空白PDF

尝试从Spring 1.5导出Dynamic-Jasper报告到PDF,但结果是空白PDF
EN

Stack Overflow用户
提问于 2022-03-16 10:08:44
回答 1查看 985关注 0票数 -2

我试图导出一个PDF基于一个动态贾斯珀报告,使用分级设置。

build.gradle:

代码语言:javascript
复制
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?提前谢谢。

代码语言:javascript
复制
   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);
}
EN

回答 1

Stack Overflow用户

发布于 2022-03-21 13:02:02

文件下载已损坏。当我通过fileOutputStream将输出直接写入文件时,上面的代码可以工作,并生成一个报告表。

有关损坏的下载,请参见此处,How to return binary data instead of base64 encoded byte[] in spring mvc rest controller

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71495136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档