如何使用DynamicJasper API在Footer中显示图像以获取pdf报告?

时间:2012-12-20 09:39:51

标签: java jasper-reports dynamic-jasper

我正在使用 DynamicJasper API 开发 pdf 报告。

根据要求,我必须在页眉处显示一个徽标,在页脚处显示其他徽标。我可以使用 DynamicReportBuilder.addImageBanner 方法在标题处显示徽标。但我没有找到一种在页脚添加图像的方法。

我在dynamic-jasper论坛中看到了一些关于这个问题的线索,其中一个解决方法是使用 pageFooter band创建一个 jrxml 模板。

我尝试了这个,但没有成功。我有以下例外:

org.xml.sax.SAXParseException: The processing instruction target matching "[xX][mM][lL]" is not allowed

以下是生成报告的代码。

  1. 创建 dynamiceReport 对象
  2. 创建 jasperPrint 对象
  3. 调用基于格式类型创建报告的方法。在这里,我必须传递 jasperPrint 对象,它具有 jrxml 表示,目标文件位置和报告格式类型。
  4. // ...
        DynamicReport dynamicReport = buildDynamicReport(reportTemplate, grpFields);
    
        // build jrxml <br/>
        JasperPrint jasperPrint = buildJRXML(dynamicReport, dataSource, reportFormat);
    
        // export the report into specific target format <br/>
        exportReport(jasperPrint, targetReportFile, reportFormat);
    // ...
    
    private DynamicReport buildDynamicReport(Template reportTemplate,
                                             Vector<String[]> groupFields) throws ServiceException {
        /** code to generate DynamicReport object. */
        dynamicReportBuilder.setTemplateFile("jrxml/report-footer.jrxml");
        DynamicReport dynamicReport = dynamicReportBuilder.build();
    
        return dynamicReport;
    }
    

    任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:3)

由于dynamicjasper的ClassicLayoutManager类默认情况下仅将所有图像横幅应用于标题带,因此似乎没有直接的方法来实现此目的。

一种解决方法是使用自定义布局管理器实现 - 扩展ClassicLayoutManager并覆盖applyBanners()方法。

public class CustomLayoutManager extends ClassicLayoutManager {

    protected void applyBanners() {
        super.applyBanners(); //let the ClassicLayoutManager apply header banners

        // explicitly add banner to footer band..
        JRDesignBand pageFooter = (JRDesignBand)getDesign().getPageFooter();

        // if there is no footer band we create one
        if(pageFooter == null) {
            pageFooter = new JRDesignBand();
            getDesign().setPageFooter(pageFooter);
        }

        Vector<ImageBanner> vImageBanner = new Vector<ImageBanner>();
        vImageBanner.add(new ImageBanner("yourlogoimage.ext", 120, 50, ImageBanner.ALIGN_LEFT));

        applyImageBannersToBand(pageFooter, vImageBanner, null);
    }
}

然后在生成报告时使用自定义类..

JasperPrint jasperPrint = DynamicJasperHelper.generateJasperPrint(dynamicReport, new CustomLayoutManager(), parameters);