Apache PDFBoxを実際に使用するにあたってのTIPS

こんにちは、アーキテクトのQZ西垣です。
令和最初の開発者ブログです。
今回はApache PDFBoxを実際に運用中のシステムに組み込むにあたって得た知見をTIPSとして公開します。
少ないですけどね。

Apache PDFBoxとは

Apache PDFBox(以下PDFBox)とは、JavaでPDFファイルを扱うためのライブラリです。
PDFファイルを作成するために必要な一通りの機能が実装されています。
元々弊社では別のライブラリであるiTextを使用していたのですが、バージョン5から商用利用する場合有償となったため、PDFBoxに変更したという経緯があります。

ググってみたけれど

PDFBoxを使用するにあたりWebでいろいろググってみると、個々の機能については詳細な情報が見つかります。
しかしそれらは断片的で、実際にPDFファイルを生成するコードを完成させるまでには結構四苦八苦しました。

では、以下から実際にPDFファイルを作成するためのノウハウを紹介します。
なお、フレームワークとしてSpring Frameworkを使用する前提とします。

フォントの読込にはResourceLoaderを使用する

いきなり脱線します。
PDFBoxを使用するためには、まずフォントファイルが必要です。
プロジェクト内にフォントファイルを配置する必要がありますが、どこに配置すればいいのか、どうやって読み取ればいいのか、そこからつまづきました。
いろいろ調べた結果、 org.springframework.core.io.ResourceLoader をインジェクションして使用すればいいということが判明しました。

PDPageContentStream の生成は1ページにつき1回

複数のテキストをPDFに出力するテストをしていたのですが、1つしか出力されない現象が発生していました。
テキストをPDFに出力するたびに PDPageContentStream を生成していたのですが、それが間違いでした。
PDPageContentStream は、1ページにつき1回だけ生成するものです。

PDPageContentStreamclose しないと例外が発生する

自動で改ページする処理を作り込んだのですが、例外が発生していました。
何のことはない、改ページする際、元のページのために生成した PDPageContentStreamclose していないだけでした。

座標系はページの左下が (0, 0)

わりと混乱するのが座標系です。
左下が (0, 0) であるため、ページの高さとフォントサイズから逆算してy座標を決定する必要があります。

ページの座標範囲外にテキスト等を出力してもエラーにならない

出力したはずのテキスト等が表示されない場合、座標も疑ってみてください。

テキストを右寄せで出力する機能はない

テキストの幅を測るメソッドがあるので、そこから逆算してx座標を決定する必要があります。

まとめ

PDFBoxについては、まだ自分もその全機能を使用したわけではありませんが、必要な機能は網羅されている感があります。
また、最初はTIPSに挙げた例のように苦労はしましたが、分かってしまえばシンプルで使いやすいライブラリでもあります。
みなさんもPDFBoxのTIPSがあれば是非教えてください。