繁体   English   中英

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

[英]How to show image in Footer for pdf report using DynamicJasper API?

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

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

我在dynamic-jasper论坛中看到了有关此问题的一些主题,其中提到的一项工作是使用pageFooter带创建一个jrxml模板。

我尝试过,但没有解决。 我得到以下异常:

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

以下是生成报告的代码。

  1. 创建一个dynamiceReport对象
  2. 创建一个jasperPrint对象
  3. 调用一种基于格式类型创建报告的方法。 在这里,我必须传递jasperPrint对象,该对象具有jrxml表示形式,目标文件位置和报告格式类型。
// ...
    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;
}

任何帮助将不胜感激。

由于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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM