こんにちは、株式会社エヌ・エイ・シー・ケア システムインテグレーション事業部です。
本記事では、グラフを含むWebページの帳票をPDFデータで一括出力するための手段の一例をご紹介いたします。
担当しているプロジェクトにて、グラフが使用されているWeb画面の情報を、帳票形式のPDFとして一括出力する要件がありました。
具体的には、複数件のデータをそれぞれExcelテンプレートに反映し、画面レイアウトを崩すことなく、グラフを含む複数ページの帳票を1つのPDFファイルにまとめて出力する必要がありました。
今回は複数ページのグラフ付き帳票を扱う必要があったため、LibreOffice、jodconverter、Apache PDFBoxを組み合わせた方式を採用しました。
以降、実装フローと実装時の注意点をご紹介いたします。
例として下記の帳票を出力してみます。
※置換対象の一覧の変数名を「list」として説明します。

ひな形となるExcelファイルはモジュール内に配置し、バックエンドで配置パスを取得できるようにしています。
テンプレートはWeb画面を参考にデザインを形成し、以下の要素を含めるように設定します。
・置換文字:${list.カラム名}形式でデータ挿入箇所を定義
・グラフ:Excelの標準グラフ機能で作成し、データ範囲を指定
・グラフ用データ:印刷範囲外のセルに配置
※処理効率を考慮し、1つのxlsxファイルに複数シートを用意して、複数件分のデータを一括で処理できるようにしています。
以上を踏まえて、下記画像のようなExcelデータを複数シート作成します。

a.対象データを抽出
b.置換文字${list.カラム名}を実データに置換
※1つのxlsxファイル(複数シート構成)に複数件分のデータをまとめて配置してからPDF変換を行います。
※ここではDTO形式のデータを「list」としてバインドしています。

Web画面で表示/非表示がある項目の制御は、xlsxデータ内の行を非表示にすることで対応できます。
※たとえば36行目を非表示とする場合、Apache POIは0始まりのインデックスのため、35を指定します。
![]()
c.PDF変換に使用する仮xlsxファイルの作成
jxlsライブラリを使用し、以下の手順で実行します。

d.PDF変換と結合
jodconverterを使用して、置換後のxlsxファイルをPDFに変換します。
※下記コードで実行します。
![]()
複数回の変換処理で生成されたPDFは、Apache PDFBoxのPDFMergerUtilityを使用して順次結合し、最終的に1つのPDFファイルにまとめます。

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

※2ページ目

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