0

DynamicJasper APIを使用してpdfレポートを作成しています。

要件に従って、1 つのロゴをヘッダーに、もう 1 つのロゴをフッターに表示する必要があります。DynamicReportBuilder.addImageBannerメソッドを使用してヘッダーにロゴを表示できます。しかし、フッターに画像を追加する方法が見つかりませんでした。

この問題に関するいくつかのスレッドを dynamic-jasper フォーラムで見ました。1 つの回避策は、 pageFooterバンドを使用してjrxmlテンプレートを作成することです。

これを試しましたが、うまくいきませんでした。次の例外が発生しました:

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

以下は、レポートを生成するコードです。

  1. dynamiceReportオブジェクトの作成
  2. jasperPrintオブジェクトの作成
  3. フォーマット タイプに基づいてレポートを作成するメソッドを呼び出します。ここでは、 jrxml表現、ターゲット ファイルの場所、およびレポート形式の種類を持つjasperPrintオブジェクトを渡す必要があります。
// ...
    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;
}

どんな助けでも感謝します。

4

1 に答える 1

3

dynamicjasperのClassicLayoutManagerクラスは、デフォルトですべての画像バナーをヘッダーバンドにのみ適用するため、これを実現する簡単な方法はないようです。

回避策の1つは、カスタムレイアウトマネージャーの実装を使用することです。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);
于 2013-01-17T10:44:05.343 に答える