CONTENT
大阪エンジニアのSです。
JavaでPDFファイルを扱う際に利用できる無償ライブラリである、PDFBoxについて紹介させていただきます。
PDFBoxはPDFファイルを扱う様々な機能を提供していますが、代表的な機能は以下の通りです。
・テキスト抽出
・分割&マージ
・データを抽出、埋め込み
・印刷
・画像として保存
・PDF生成
・電子署名
では、実際にどのような場面で使用するかの一例を紹介します。
例えば、別々のPDFファイル同士をつなげて1つのPDFファイルにしたい、その上で1つにしたPDFファイルにページ番号を振りたい、という要件があるとします。
別々のPDFファイルをマージする際にはPDFBoxの「PDFMergerUtility」が使えます。Javaの「FileInputStream」などを使用してPDFファイルを読み込み、PDFBoxの「PDFMergerUtility」を使用してマージするという方法です。
PDFファイルにページ番号を振るには、以下のような流れになります。
まずPDFBoxの「PDDocument」を使用してPDFファイルのオブジェクトを生成し、PDFBoxの「PDPageContentStream」を使用してPDFファイルの1ページずつに、ページ番号文字列、例えば「1/10」(10ページあるうちの1ページ目)を書き込んでいく、という処理の流れになります。
文字列を書き込む際に注意する点としては、文字列をPDFファイルの中央寄せにする、などの機能はないため、文字列を書き込む箇所の座標を計算する必要がある、ということです。座標がきちんと計算できていないと、PDFファイルの中央からずれたりすることになります。
PDFBoxを使用するにあたって、経験上困ったことも紹介します。
PDFファイルに使用している文字フォントが日本語の場合、PDFBoxを使用した後に作成されるPDFファイルの文字フォントがバグってしまう、という事象が発生しました。
詳細に説明すると、例えば「MSゴシック」という日本語の文字フォントが設定されている場合、PDFBoxでは「MS-Gothic」という英字の文字フォントしか対応していないため、文字フォントが読み込めず、出来上がったPDFファイルの文字フォントを確認すると、バグった文字フォントになってしまいました。
上記の解決手段としては、外付けの文字フォントを読み込むか、日本語の文字フォントを英字の文字フォントに変換する処理を自作する、というものになります。(私が経験した際は後者で対応しました。)
ちなみに、JavaでPDFファイルを扱うことが出来るライブラリはPDFBoxの他に、iTextというものがありますが、バージョン5から商用利用する場合有償となったため、iTextを利用する場合はライセンス料がかかる、というデメリットがあります。
上記の経緯から、PDFBoxを利用する機会が増えるかもしれないですね。
PDFBoxについて簡単ではありますが紹介させていただきました。
PDFBoxを利用する機会があれば、是非参考にしてみてください。