Webアプリケーションから帳票を発行しようとした場合、皆さんはどのような方法を用いているでしょうか。もちろん、CSS(Cascading StyleSheet)で精緻(せいち)なレイアウトを設計してブラウザ上から印刷させるという方法も可能でしょう。また、「POIを使用してJavaからExcel出力を行う」でも紹介したようにPOIでExcel帳票を作成するという方法もあるかもしれません。そして、それほど厳密でない帳票であれば、おそらくこれらの方法で十分なはずです。
しかし、これらのアプローチには「帳票の改ざんができてしまう」という問題点があります。CSS+HTMLにせよ、Excelにせよ、これをクライアント側で編集・更新するのは容易です。特に、確証としての意味がある帳票などでは、帳票が正規の発行者から提供されたオリジナルであることを保証できなければいけませんから、CSSやExcel帳票ではそもそもの用途を満たし得ないということになります。
しかし、PDF(Portable Document Format)を利用すれば、これらの問題は解決します。PDF文書ならば基本的に改変はできませんし、その他、印刷やコピーを禁止するなどセキュリティ的な制御も可能です。また、PDF文書を参照するには、フリーで提供されているAdobe Readerさえあればよいので、クライアント環境にもほぼ依存しないと思ってよいでしょう。
このPDF文書を動的に生成するために、Javaの世界ではPDFLibというライブラリが提供されています。PDFLibは有償のライブラリですが、取りあえずダウンロードして試してみることはできますので、まずは使ってみたいという方も気軽に試用できます。また、PDFLibのうれしいところは、Javaをはじめ、.NET(C#、VB.NET)、COM(VB、ASP、WSH)、C、PHPなど主要な言語/環境に対応しているという点です。PDFLibを利用することで、Javaだけでなく、その他の環境でもほとんど同じ感覚でプログラミングを行うことができます。
それでは早速、具体的なコードを眺めてみることにしましょう。
解説
(1)PDFLibライブラリをインストールする
PDFLibライブラリは、以下のサイトからダウンロードすることができます。
ダウンロードしたpdflib-X.X.X-Windows.zip(X.X.Xはバージョン番号)を解凍します。解凍された「pdflib-X-X-X-Windows/bind/java」フォルダ配下にはpdf_java.dll、pdflib.jarがありますので、pdf_java.dllをシステムフォルダ(Windows XPならば「c:\windows\system32」など)に、pdflib.jarをアプリケーションルート配下の「/WEB-INF/lib」フォルダに、それぞれコピーしてください。
(2)サーブレットクラスを作成する
環境の準備が整ったところで、PDF文書を生成するためのサーブレットクラスを定義してみましょう。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
(3)デプロイメント・ディスクリプタにサーブレットクラスを登録する
本サーブレットクラスを実行するに当たっては、あらかじめデプロイメント・ディスクリプタ(web.xml)に対して、サーブレットの登録を行っておく必要があります。<url-pattern>要素に「/simple.pdf」のように指定しておくことで、サーブレットクラスをあたかも静的なPDFファイルであるかのように見せることができます(拙稿「JSPとサーブレットの違いを明らかにする」も併せて参照してください)。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
このコードの実行結果は、以下のようになります。
ロジックの詳細な流れについては、コード内のコメントを参照いただくとして、ここではPDFLibを利用したコーディングの大まかな流れを押さえてみてください。
- 新規PDF文書の生成(赤字部分)
- 基本情報(メタ情報、フォントなど)の設定(黄字部分)
- 文字列データの出力(緑字部分)
- PDF文書としてクライアントに出力(紫字部分)
これがすべての流れではありませんが、基本的なPDF文書を生成する程度ならば、ほとんど共通だと思っていただければよいでしょう。本稿ではあらかじめハードコーディングされた文字列を出力しているだけですが、もちろん、この部分をリクエスト・パラメータなどから生成することも可能です。PDFLibライブラリに関する詳細については、上記のダウンロードサイトからも確認することができますので、興味のある方はご覧になってみるとよいでしょう。
Copyright © ITmedia, Inc. All Rights Reserved.