本TIPSで紹介するiTextは、PDFをJavaで扱うためのライブラリです。これを使えば、PDFファイルを作成したり、ブラウザにPDFを出力したりすることができます。しかもiTextはオープンソースで開発されており、使用に際してはMPLまたはLGPLのいずれかのライセンスを選択できます。
iTextはjar形式のライブラリのため、必要なファイルをクラスパスへ追加するだけで利用できます。iTextの本体は、itext-x.x.jaです。これを以下のURLよりダウンロードしてください。
・ http://www.lowagie.com/iText/download.html
ダウンロードできたら、このjarファイルをクラスパスへ追加します(最も簡単な方法は、Javaの拡張ディレクトリへjarファイルをコピーすることです)。
これだけでiTextは利用可能ですが、本体には日本語フォント用の設定が含まれていません。日本語を扱うために、追加のライブラリiTextAsian.jarを以下のURLからダウンロードします。
・http://itextpdf.sourceforge.net/
ダウンロードしたら、これも同様にクラスパスへ追加します。以上でセットアップは完了です。
iTextを使うには、基本的に以下の5つのステップを踏みます。
- 汎用の文書オブジェクトを生成
- 文書の出力形式(PDF/RTF/HTML/XMLより選択可能)と出力先を設定
- 文書の出力を開始
- 文書にテキスト/表/画像などの要素を追加
- 文書の出力を終了
ここでは、動的に生成されたPDFをブラウザに表示する、ごく簡単なサーブレットをサンプルとして示します。
package net.mogra.wings.javatips;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfWriter;
public class PDFServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
// 汎用の文書オブジェクトを生成
Document doc = new Document();
(1)
try {
// 出力先を指定し、文書をPDFとして出力
PdfWriter.getInstance(doc, byteOut);
(2)
// 出力開始
doc.open(); (3)
// 日本語フォントの設定
Font font = new Font(BaseFont.createFont(
"HeiseiKakuGo-W5",
"UniJIS-UCS2-H",
BaseFont.NOT_EMBEDDED));
// 文書に要素を追加
doc.add(new Paragraph("こんにちは、世界。", font));
(4)
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
// 出力終了
doc.close(); (5)
// ブラウザへの出力
response.setContentType("application/pdf");
response.setContentLength(byteOut.size());
OutputStream out = response.getOutputStream();
out.write(byteOut.toByteArray());
out.close();
}
} |
なお、iTextをスタンドアロンのアプリケーションで用いることも可能です。例えばPDFファイルを直接ファイルシステム上に書き出したい場合は、(2)でgetInstanceメソッドの第2引数にファイル出力ストリーム(java.io.FileOutputStream)を指定します。
上記のサンプルサーブレットへアクセスすると、次のような結果が得られます。
サンプルコードの実行結果