Spring Bootを使用したBIRTレポート

  • DevOps

  • link:/category/programming/ [プログラミング]

1. 前書き

このチュートリアルでは、BIRT(Business Intelligence and Reporting Tools)とSpring Boot MVCを統合して、HTMLおよびPDF形式の静的および動的レポートを提供します。

2. BIRTとは

  • BIRTは、Java Webアプリケーションに統合できるデータ視覚化*を作成するためのオープンソースエンジンです。

    Eclipse Foundation内のトップレベルのソフトウェアプロジェクトであり、IBMとInnovent Solutionsによる貢献を活用しています。 2004年末にActuateによって開始および支援されました。
    このフレームワークにより、幅広いデータソースと統合されたレポートを作成できます。

3. Mavenの依存関係

  • BIRTには2つの主要なコンポーネントがあります。レポートデザインファイルを作成するためのビジュアルレポートデザイナーと、それらのデザインを解釈およびレンダリングするためのランタイムコンポーネント*です。

    サンプルWebアプリケーションでは、Spring Boot上で両方を使用します。

3.1. BIRTフレームワークの依存関係

依存関係管理の観点から考えることに慣れているため、最初の選択肢はMaven CentralでBIRTを探すことです。
ただし、利用可能なコアライブラリの最新の公式バージョンはhttps://search.maven.org/search?q=a:org.eclipse.birt.runtime[2016年から4.6] *であり、https:// download.eclipse.org/birt/downloads/build_list.php[Eclipseダウンロードページ]には、少なくとも2つの新しいバージョンへのリンクがあります(*現在は4.8 *です)。
公式ビルドを選択する場合、https://www.eclipse.org/downloads/download.php?file = / birt / downloads / drops / Rをダウンロードするのがコードを実行する最も簡単な方法です。 -R1-4.8.0-201806261756 / birt-runtime-4.8.0-20180626.zip [BIRT Report Engine]パッケージ。学習にも役立つ完全なWebアプリケーションです。 次に、その_lib_フォルダーをプロジェクト(サイズが約68MB)にコピーし、IDEにすべてのjarを含めるように指示する必要があります。
言うまでもなく、このアプローチを使用すると、ローカルリポジトリで手動で(100以上のファイルを)構成およびインストールしない限り、Mavenはこれらのjarを見つけられないため、* IDEを介してのみコンパイルできます*。 。
幸いなことに、* Innovent Solutionsは問題を処理することを決定し、https://search.maven.org/search?q = a:%20org.eclipse.birt.runtime_4.8.0-20180626 [Maven Centralで独自のビルドを公開] *最新のBIRT依存関係。これは、必要な依存関係をすべて管理してくれるので素晴らしい。
オンラインフォーラムのコメントを読んで、これらのアーティファクトが本番環境に対応しているかどうかは不明ですが、Innovent Solutionsは開始以来Eclipseチームの隣のプロジェクトに取り組んでいたため、プロジェクトはそれらに依存しています。
BIRTの組み込みは非常に簡単になりました。
<dependency>
    <groupId>com.innoventsolutions.birt.runtime</groupId>
    <artifactId>org.eclipse.birt.runtime_4.8.0-20180626</artifactId>
    <version>4.8.0</version>
</dependency>

3.2. スプリングブートの依存関係

BIRTがプロジェクトにインポートされたので、pomファイルに標準のSpring Boot依存関係を追加するだけです。
ただし、BIRT jarには_Slf4J_の独自の実装が含まれているため、落とし穴が1つあります。
jarから削除できないため、この問題を修正するには、* Logbackを除外する必要があります*:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
    <exclusions>
        <exclusion>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </exclusion>
    </exclusions>
</dependency>
これでようやく開始する準備が整いました!

4. BIRTレポート

BIRTフレームワークでは、*レポートは拡張子_rptdesign_で識別される長いXML構成ファイル*です。
*これは、タイトルのスタイルからデータソースに接続するために必要なプロパティまで、何をどこに描画するかをエンジンに指示します。
基本的な動的レポートの場合、次の3つの設定が必要です。
  1. データソース(この例ではローカルCSVファイルを使用していますが、
    簡単にデータベーステーブルになります)

  2. 表示する要素(グラフ、表など)

  3. ページデザイン

    レポートは、ヘッダー、本文、フッター、スクリプト、スタイルを備えたHTMLページのように構成されています。
    *フレームワークは、主流のデータソース、レイアウト、チャート、およびテーブルへの統合を含む、すぐに使用できる*から選択する広範なコンポーネントのセットを提供します。 そして、それを拡張して独自のものを追加できます!
    レポートファイルを生成するには、視覚的方法とプログラム的方法の2つの方法があります。

5. Eclipseレポートデザイナー

レポートの作成を容易にするために、* Eclipseチームは、人気のあるIDE用のレポートデザインツール*プラグインを作成しました。
*このツールは、左側の_Palette_から簡単にドラッグアンドドロップできるインターフェイス*を備えており、ページに追加する新しいコンポーネントのセットアップウィンドウを自動的に開きます。 また、各コンポーネントで利用可能なすべてのカスタマイズを確認するには、ページ上でクリックしてから、_Property Editor_ボタン(下の画像で強調表示)をクリックします。
ツリービューでページ構造全体を視覚化するには、[アウトライン]ボタンをクリックするだけです。
  • _Data Explorer_タブには、レポート用に定義されたデータソースも含まれています。*

    画像:https://www.baeldung.com/uploads/birt1-100x54.png%20100w [image]
    画像に表示されるサンプルレポートは、パス_ <project_root> /reports/csv_data_report.rptdesign_にあります。
    ビジュアルデザイナーを選ぶもう1つの利点は、プログラムによるアプローチではなく、このツールに重点を置いたオンラインドキュメントです。
    *すでにEclipseを使用している場合は、事前定義されたパースペクティブとビジュアルエディターを含むBIRT Report Designプラグインをインストールするだけです。
    *現在Eclipseを使用しておらず、切り替えたくない開発者向けには、https://www.eclipse.org/downloads/download.php?file = / birt / downloads / drops / R-R1があります。 -4.8.0-201806261756 / birt-report-designer-all-in-one-4.8.0-20180626-win32.win32.x86_64.zip [Eclipse Report Designer]パッケージ*。BIRTを使用したポータブルEclipseインストールで構成されます。プラグインがプリインストールされています。
    レポートファイルが完成したら、プロジェクトに保存し、優先する環境でコーディングに戻ることができます。

6. プログラム的アプローチ

また、*コードのみを使用してレポートを設計する*こともできますが、このアプローチは利用可能なドキュメントが乏しいため、はるかに難しいので、ソースコードとオンラインフォーラムを掘り下げる準備をしてください。
また、考慮する価値があるのは、サイズ、長さ、グリッド位置などの*面倒なデザインの詳細*がすべて、デザイナーを使用して処理するのがはるかに簡単であることです*。
この点を証明するために、画像とテキストで簡単な静的ページを定義する方法の例を次に示します。
DesignElementHandle element = factory.newSimpleMasterPage("Page Master");
design.getMasterPages().add(element);

GridHandle grid = factory.newGridItem(null, 2, 1);
design.getBody().add(grid);

grid.setWidth("100%");

RowHandle row0 = (RowHandle) grid.getRows().get(0);

ImageHandle image = factory.newImage(null);
CellHandle cell = (CellHandle) row0.getCells().get(0);
cell.getContent().add(image);
image.setURL("\"link:/uploads/favicon-96x96.png\"");

LabelHandle label = factory.newLabel(null);
cell = (CellHandle) row0.getCells().get(1);
cell.getContent().add(label);
label.setText("Hello, Baeldung world!");
このコードは簡単な(そして見苦しい)レポートを生成します:
画像:https://www.baeldung.com/uploads/birt2-100x25.png%20100w [image]
上の画像に表示されているサンプルレポートは、次のパスにあります:_ <project_root> /reports/static_report.rptdesign._
レポートの表示方法と表示するデータをコーディングしたら、_ReportDesignApplication_クラスを実行してXMLファイルを生成できます。

7. データソースの接続

BIRTが多くの異なるデータソースをサポートすることを以前に述べました。
サンプルプロジェクトでは、3つのエントリを持つ簡単なCSVファイルを使用しました。 _reports_フォルダーにあり、3行の単純なデータ行とヘッダーで構成されています。
Student, Math, Geography, History
Bill, 10,3,8
Tom, 5,6,5
Anne, 7, 4,9

7.1. データソースの構成

BIRTがファイル(または他の種類のソース)を使用できるようにするには、* _ Data Source_ *を構成する必要があります。
ファイルの場合、レポートデザイナで_Flat File Data Source_を作成しました。すべての手順はわずかです。
  1. デザイナーパースペクティブを開き、右側のon_outline_を見てください。

  2. [データソース]アイコンを右クリックします。

  3. 目的のソースタイプ(この場合はフラットファイルソース)を選択します。

  4. フォルダ全体を読み込むか、1つのファイルのみを読み込むかを選択できるようになりました。 We
    2番目のオプションを使用しました(データファイルがCSV形式の場合、列名インジケーターとして最初の行を使用するようにします)。

  5. 接続をテストして、パスが正しいことを確認します。

    各ステップを示すためにいくつかの写真を添付し​​ました:
link:/uploads/birt_gallery_2-100x85.png%20100w []
+
link:/uploads/birt_gallery_3-100x73.png%20100w []
link:/uploads/birt_gallery_4-100x82.png%20100w []
+

7.2. データセット

データソースの準備はできていますが、レポートに表示される実際のデータであるデータセットを定義する必要があります。
  1. デザイナーパースペクティブを開き、右側のon_outline_を見てください。

  2. _Data Sets_アイコンを右クリックします。

  3. 目的の_Data Source_とタイプを選択します(この場合は
    1つのタイプのみ)。

  4. 次の画面は、データソースの種類とデータセットによって異なります
    selected:この場合、含める列を選択できるページが表示されます。

  5. セットアップが完了すると、いつでも構成を開くことができます
    データセットをダブルクリックします。

  6. _Output Columns_では、表示されるデータの正しいタイプを設定できます。

  7. _Preview Results._をクリックして、プレビューを見ることができます。

    繰り返しますが、これらの手順を明確にするためのいくつかの写真:
link:/uploads/birt_gallery_6-100x79.png%20100w []
+
link:/uploads/birt_gallery_7-100x63.png%20100w []
link:/uploads/birt_gallery_8-100x63.png%20100w []
+

7.3. 他のデータソースタイプ

_Data Set_構成のステップ4で述べたように、使用可能なオプションは、参照される_Data Source_に応じて変わる場合があります。
CSVファイルの場合、BIRTは、表示する列、データ型、およびファイル全体をロードするかどうかに関連するオプションを提供します。 一方、JDBCデータソースがある場合は、SQLクエリまたはストアドプロシージャを記述する必要があります。
_Data Sets_メニューから、* 2つ以上のデータセットを新しいデータセットに結合することもできます*。

8. レポートのレンダリング

レポートファイルの準備ができたら、レンダリングのためにエンジンに渡す必要があります。 これを行うには、実装することがいくつかあります。

8.1. エンジンの初期化

デザインファイルを解釈して最終結果を生成する_ReportEngine_クラスは、BIRTランタイムライブラリの一部です。
大量のヘルパーとタスクを使用してジョブを実行し、非常にリソースを消費します。
image:https://www.eclipse.org/birt/img/documentation/integrating/retask.jpg [image、width = 800、height = 600]
画像ソース:Eclipse BIRTドキュメント
*主に拡張機能のロードコストのため、エンジンインスタンスの作成に関連する多大なコストがあります。 したがって、* 1つの_ReportEngine_インスタンスを作成し、それを使用して複数のレポートを実行する必要があります*。
レポートエンジンは、_Platform_が提供するファクトリを介して作成されます。 エンジンを作成する前に、適切なプラグインをロードする_Platform_を開始する必要があります。
@PostConstruct
protected void initialize() throws BirtException {
    EngineConfig config = new EngineConfig();
    config.getAppContext().put("spring", this.context);
    Platform.startup(config);
    IReportEngineFactory factory = (IReportEngineFactory) Platform
      .createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);
    birtEngine = factory.createReportEngine(config);
    imageFolder = System.getProperty("user.dir") + File.separatorChar + reportsPath + imagesPath;
    loadReports();
}
不要になったら破棄できます。
@Override
public void destroy() {
    birtEngine.destroy();
    Platform.shutdown();
}

8.2. 出力形式の実装

  • BIRTはすでに複数の出力形式をサポートしています:* * HTML、PDF、PPT、ODT *。

    サンプルプロジェクトでは、_generatePDFReport_メソッドと_generateHTMLReport_メソッドを使用して、そのうちの2つを実装しました。
    出力形式や画像ハンドラーなど、必要な特定のプロパティに応じてわずかに異なります。
    実際、PDFは画像をテキストと一緒に埋め込みますが、HTMLレポートはそれらを生成および/またはリンクする必要があります。
    したがって、* PDFレンダリング関数は非常に簡単です*:
private void generatePDFReport(IReportRunnable report, HttpServletResponse response,
  HttpServletRequest request) {
    IRunAndRenderTask runAndRenderTask = birtEngine.createRunAndRenderTask(report);
    response.setContentType(birtEngine.getMIMEType("pdf"));
    IRenderOption options = new RenderOption();
    PDFRenderOption pdfRenderOption = new PDFRenderOption(options);
    pdfRenderOption.setOutputFormat("pdf");
    runAndRenderTask.setRenderOption(pdfRenderOption);
    runAndRenderTask.getAppContext().put(EngineConstants.APPCONTEXT_PDF_RENDER_CONTEXT, request);

    try {
        pdfRenderOption.setOutputStream(response.getOutputStream());
        runAndRenderTask.run();
    } catch (Exception e) {
        throw new RuntimeException(e.getMessage(), e);
    } finally {
        runAndRenderTask.close();
    }
}
  • HTMLレンダリング機能にはさらに設定が必要です:*

private void generateHTMLReport(IReportRunnable report, HttpServletResponse response,
  HttpServletRequest request) {
    IRunAndRenderTask runAndRenderTask = birtEngine.createRunAndRenderTask(report);
    response.setContentType(birtEngine.getMIMEType("html"));
    IRenderOption options = new RenderOption();
    HTMLRenderOption htmlOptions = new HTMLRenderOption(options);
    htmlOptions.setOutputFormat("html");
    htmlOptions.setBaseImageURL("/" + reportsPath + imagesPath);
    htmlOptions.setImageDirectory(imageFolder);
    htmlOptions.setImageHandler(htmlImageHandler);
    runAndRenderTask.setRenderOption(htmlOptions);
    runAndRenderTask.getAppContext().put(
      EngineConstants.APPCONTEXT_BIRT_VIEWER_HTTPSERVET_REQUEST, request);

    try {
        htmlOptions.setOutputStream(response.getOutputStream());
        runAndRenderTask.run();
    } catch (Exception e) {
        throw new RuntimeException(e.getMessage(), e);
    } finally {
        runAndRenderTask.close();
    }
}
最も注目に値するのは、デフォルトのハンドラーを残す代わりに、_HTMLServerImageHandler_ *を設定したことです。 この小さな違いは、生成される_img_タグに大きな影響を与えます。
  • デフォルトのハンドラは_img_タグをファイルシステムパスにリンクします
    多くのブラウザによってセキュリティのためにブロックされています

  • サーバーのURLへの_HTMLServerImageHandler_リンク

    _setImageDirectory_メソッドを使用して、生成された画像ファイルをエンジンが保存する場所を指定します。
    デフォルトでは、ハンドラーはリクエストごとに新しいファイルを生成するため、*キャッシュレイヤーまたは削除ポリシーを追加できます*。

8.3. 画像の公開

HTMLレポートの場合、画像ファイルは外部にあるため、サーバーパスでアクセスできる必要があります。
上記のコードでは、_setBaseImageURL_メソッドを使用して、_img_タグリンクで使用する相対パスをエンジンに指示するため、パスに実際にアクセスできることを確認する必要があります。
このため、_ReportEngineApplication_で、_images_フォルダーを公開するようにSpringを構成しました。
@SpringBootApplication
@EnableWebMvc
public class ReportEngineApplication implements WebMvcConfigurer {
    @Value("${reports.relative.path}")
    private String reportsPath;
    @Value("${images.relative.path}")
    private String imagesPath;

    ...

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry
          .addResourceHandler(reportsPath + imagesPath + "/**")
          .addResourceLocations("file:///" + System.getProperty("user.dir") + "/"
            + reportsPath + imagesPath);
    }
}
選択するパスが何であれ、ここと前のスニペットの_htmlOptions_で同じパスが使用されていることを確認する必要があります。そうでない場合、レポートは画像を表示できません。

9. レポートを表示する

アプリケーションを準備するために必要な最後のコンポーネントは、レンダリング結果を返す_Controller_です。
@RequestMapping(method = RequestMethod.GET, value = "/report/{name}")
@ResponseBody
public void generateFullReport(HttpServletResponse response, HttpServletRequest request,
  @PathVariable("name") String name, @RequestParam("output") String output)
  throws EngineException, IOException {
    OutputType format = OutputType.from(output);
    reportService.generateMainReport(name, format, response, request);
}
_output_パラメーターを使用して、ユーザーに目的の形式(HTMLまたはPDF)を選択させることができます。

10. レポートのテスト

_ReportEngineApplication_クラスを実行して、アプリケーションを起動できます。
起動時に、_BirtReportService_クラスは_ <project_root> / reports_フォルダーにあるすべてのレポートを読み込みます。
レポートの実際の動作を確認するには、ブラウザで以下を指定するだけです。
  • / report / csv_data_report?output = pdf

  • / report / csv_data_report?output = html

  • / report / static_report?output = pdf

  • / report / static_report?output = html

    _csv_data_report_レポートの外観は次のとおりです。
    画像:https://www.baeldung.com/uploads/birt4-100x64.png%20100w [image]
    設計ファイルを変更した後にレポートをリロードするには、ブラウザで_ / report / reload._を指定するだけです。

11. 結論

この記事では、BIRTとSpring Bootを統合し、落とし穴と課題だけでなく、その力と柔軟性も調査しました。
この記事のソースコードは、https://github.com/eugenp/tutorials/tree/master/spring-boot-mvc-birt [GitHub上]で入手できます。