1. はじめに
プロジェクトを進める中で、ユーザーが見積書や文書データをPDF形式でダウンロードできる機能が必要になりました。
当初は単純にPDFファイルを生成すればよいと考えていましたが、実際に検討を進めると、さまざまな考慮事項がありました。
-
ハングル出力対応
-
レイアウト修正のしやすさ
-
ライセンスの問題
-
開発生産性
-
保守性
特に、文書様式の変更依頼が頻繁に発生する業務の特性上、PDF生成そのものよりも、レイアウトをどれだけ容易に修正できるかが重要な要件でした。
そこで、複数のPDFライブラリを検討し、プロジェクトに適した技術を選定するプロセスを進めました。
2. ライブラリの検討
iText
iTextは、Java分野で最も広く知られているPDFライブラリです。
機能が豊富で参考資料も多いため、実装の難易度は比較的低いものでした。
しかし、商用利用時にはライセンス上の制約があるため、プロジェクトへの適用に際しては別途検討が必要でした。
OpenPDF
OpenPDFはiTextをベースとしたオープンソースライブラリで、無料で利用できました。
しかし、スタイルをオブジェクト単位で直接記述する必要がありました。
文書構造が複雑になるほどコード量が増え、保守の負担も大きくなると判断しました。
Apache PDFBox
PDFBoxは、性能と安定性に優れていました。
ただし、レイアウトの大部分を座標ベースで記述する必要があるため、開発工数が大きくなりました。
簡単な位置変更であっても座標の修正が必要となるため、画面デザインの変更に柔軟に対応するのは難しいと判断しました。
OpenHTMLtoPDF
OpenHTMLtoPDFは、HTMLをPDFに変換する方式のライブラリです。
HTMLとCSSをそのまま活用できる点が最大のメリットでした。
特に、既存のパブリッシング資産を再利用でき、HTMLレベルでレイアウトを修正できるため、保守性が高いと判断しました。
ただし、ブラウザレベルのCSSをすべてサポートしているわけではないため、一部の高度なレイアウトには制約があります。
3. 最終選定
最終的に、OpenPDFとOpenHTMLtoPDFを中心に比較しました。
|
項目 |
OpenPDF |
OpenHTMLtoPDF |
|---|---|---|
|
学習難易度 |
普通 |
低い |
|
レイアウト修正 |
難しい |
簡単 |
|
HTMLの活用 |
不可能 |
可能 |
|
無料利用 |
可能 |
可能 |
|
保守性 |
普通 |
高い |
プロジェクトの特性上、PDFの様式が頻繁に変更される可能性があったため、開発生産性と保守性を重視して検討しました。
その結果、OpenHTMLtoPDFを最終的に採用しました。
4. 実装プロセス
実装は大きく3つの段階で構成しました。
-
ビジネスデータを取得する。
-
データを基にHTMLテンプレートを生成する。
-
OpenHTMLtoPDFを使用してPDFファイルに変換する。
この構成を適用することで、PDF生成ロジックと画面表示ロジックを分離でき、今後新しい帳票が追加されてもHTMLテンプレートだけを追加すれば、同じ生成ロジックを再利用できるようにしました。
5. 課題およびセキュリティ上の考慮事項
OpenHTMLtoPDFはデフォルトフォントでは韓国語をサポートしていません。
そのため、韓国語の文字化けが発生する可能性があります。これを解決するため、韓国語をサポートするフォントをリソースに追加し、builder.useFont()メソッドを使用して、ビルダーの生成時にフォントを明示的にマッピングすることで、この問題を解決できます。
また、OpenHTMLtoPDFはHTMLをレンダリングしてPDFを生成するライブラリです。
そのため、ユーザー入力値をHTMLにそのまま挿入すると、意図しないHTMLタグが含まれ、ドキュメントの構造が変更される可能性があります。
これを防ぐため、HTML生成時にすべてのユーザー入力値に対してHtmlUtils.htmlEscape()を適用し、HTMLタグを文字列に変換することで、ユーザー入力がHTML構造に影響を与えないようにしました。
また、HTMLテンプレートはサーバーで管理し、ユーザー入力はテンプレート内部の指定された位置にのみ挿入するよう設計しました。
特に、画像(img)、スタイル(style)、外部リソースURLなど、HTMLのレンダリング過程で外部リソースを参照できる領域にはユーザー入力値が反映されないようにし、意図しないリソースへのアクセスが発生しないよう構成しました。
これにより、ユーザー入力によるHTML構造の変更可能性を最小限に抑え、PDF生成過程におけるセキュリティリスクを低減できました。
6. 適用結果
OpenHTMLtoPDFの導入後、次のような効果を得ることができました。
-
HTML/CSSベースで迅速な開発が可能
-
レイアウト修正のコストを削減
-
パブリッシング資産の再利用が可能
-
無料のオープンソースを使用することでライセンス負担を軽減
特に、帳票の変更依頼が発生した場合、Javaコードを修正せずにHTMLテンプレートだけを修正すればよい点が、保守性の面で最大のメリットでした。
7. おわりに
PDF生成機能そのものは、比較的単純な要件のように見えるかもしれません。
しかし実際には、ライセンス、保守性、セキュリティ、韓国語サポートなど、さまざまな要素を同時に考慮する必要がありました。
今回の作業を通じて、技術を選定する際には単に機能だけを見るのではなく、長期的な保守コストや運用のしやすさまで含めて考慮することが重要だと、改めて実感しました。
参考
1. https://github.com/danfickle/openhtmltopdf
Novin