Как показать изображение в нижнем колонтитуле для отчета в формате pdf с помощью DynamicJasper API?

Я разрабатываю отчет pdf с помощью DynamicJasper API.

В соответствии с требованием я должен отображать один логотип в заголовке, а другой в нижнем колонтитуле. Я могу отобразить логотип в заголовке с помощью метода DynamicReportBuilder.addImageBanner. Но я не нашел способ добавить изображение в нижний колонтитул.

Я видел несколько тем по этой проблеме на форуме dynamic-jasper, один из способов обхода, о котором упоминалось, заключается в создании шаблона jrxml с полосой pageFooter.

Я пробовал это, но не получилось. Я получил следующее исключение:

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;
}

Любая помощь будет оценена.


person Ajil Mohan    schedule 20.12.2012    source источник


Ответы (1)


Поскольку класс ClassicLayoutManager в dynamicjasper по умолчанию применяет все баннеры с изображениями только к полосе заголовка, кажется, что прямого способа добиться этого не существует.

Одним из обходных путей является использование пользовательской реализации диспетчера компоновки, расширяющей 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);
person emecheon    schedule 17.01.2013