Blog ブログ
2026.02.27

【エンジニアブログ】グラフ付きWebページの一括出力について

エンジニアブログ

はじめに


こんにちは、株式会社エヌ・エイ・シー・ケア システムインテグレーション事業部です。
本記事では、グラフを含むWebページの帳票をPDFデータで一括出力するための手段の一例をご紹介いたします。

本記事における背景


担当しているプロジェクトにて、グラフが使用されているWeb画面の情報を、帳票形式のPDFとして一括出力する要件がありました。

具体的には、複数件のデータをそれぞれExcelテンプレートに反映し、画面レイアウトを崩すことなく、グラフを含む複数ページの帳票を1つのPDFファイルにまとめて出力する必要がありました。

今回は複数ページのグラフ付き帳票を扱う必要があったため、LibreOffice、jodconverter、Apache PDFBoxを組み合わせた方式を採用しました。

以降、実装フローと実装時の注意点をご紹介いたします。

実装フロー


例として下記の帳票を出力してみます。

※置換対象の一覧の変数名を「list」として説明します。

Excelテンプレートの準備

ひな形となるExcelファイルはモジュール内に配置し、バックエンドで配置パスを取得できるようにしています。

テンプレートはWeb画面を参考にデザインを形成し、以下の要素を含めるように設定します。

  ・置換文字:${list.カラム名}形式でデータ挿入箇所を定義
  ・グラフ:Excelの標準グラフ機能で作成し、データ範囲を指定
  ・グラフ用データ:印刷範囲外のセルに配置

※処理効率を考慮し、1つのxlsxファイルに複数シートを用意して、複数件分のデータを一括で処理できるようにしています。

以上を踏まえて、下記画像のようなExcelデータを複数シート作成します。

Javaでの置換処理

a.対象データを抽出

b.置換文字${list.カラム名}を実データに置換

※1つのxlsxファイル(複数シート構成)に複数件分のデータをまとめて配置してからPDF変換を行います。
※ここではDTO形式のデータを「list」としてバインドしています。

Web画面で表示/非表示がある項目の制御は、xlsxデータ内の行を非表示にすることで対応できます。
※たとえば36行目を非表示とする場合、Apache POIは0始まりのインデックスのため、35を指定します。

c.PDF変換に使用する仮xlsxファイルの作成

jxlsライブラリを使用し、以下の手順で実行します。

  1. PoiTransformerを使用してworkbookを取得
  2. XlsAreaで適用範囲を指定
  3. applyAt()で変数をセルに適用
  4. workbook.write()で仮xlsxファイルを生成

d.PDF変換と結合
jodconverterを使用して、置換後のxlsxファイルをPDFに変換します。
※下記コードで実行します。

複数回の変換処理で生成されたPDFは、Apache PDFBoxのPDFMergerUtilityを使用して順次結合し、最終的に1つのPDFファイルにまとめます。

※一時ファイル(仮xlsx、仮PDF)は処理の都度削除し、リソースを適切に管理しています。
このような処理を実施すると、下記の通りのPDFデータを出力することができます。
※1ページ目

※2ページ目

実装時の注意点

  • LibreOfficeのサーバーインストール
    jodconverterはLibreOfficeをエンジンとして利用するため、サーバー環境にLibreOfficeをインストールする必要があります。
    バージョンの互換性にも注意が必要です。
  • 排他制御
    複数のリクエストが同時に実行される可能性があるため、synchronizedブロックで排他制御を行い、ファイルの競合を防いでいます。
  • メモリ管理
    大量データを処理する際は、PDFBoxのMemoryUsageSetting.setupTempFileOnly()等を活用し、メモリ使用量を抑える工夫が必要です。
  • エラーハンドリング
    ファイル変換やPDFマージ処理で例外が発生する可能性があるため、適切なtry-catchブロックでエラーハンドリングを行う必要があります。
  • 最後に


    簡単にご紹介させていただきましたが、いかがでしたでしょうか。
    Webページと同様の帳票の出力は、様々な工夫により実現できますので、その場面にあった方法で実装をすることが大切だと思います。