iTextとは
iTextはJavaプログラムにおいてPDF文書を生成するためのオープンソースのライブラリである。iTextを利用することでJavaアプリケーションに対して容易にPDFファイルの出力機能を組み込むことができるようになる。たとえばデータベースやXML文書から取り出したデータをもとに帳票を生成したり、ユーザの入力に対して動的にPDF文書を作成するといった利用シーンが考えられる。
iTextの利用方法は、XMLなどの他の構造化されたドキュメントを扱うライブラリと同様のスタイルになっているため、Javaプロラグミングに慣れたユーザであれば大きな違和感はなく使いこなすことができるだろう。基本的な手順は、まずベースとなるドキュメントオブジェクトを生成した上で、そこにコンテンツを追加していき、最期に出力ストリームを介してそれをファイルなどに書き込むという形になる。出力先にファイル以外のストリームを指定することも可能で、例えばウェブアプリケーションに組み込んでウェブブラウザにPDF文書を送るといった処理にも利用できる。
その他、ブックマークやページ番号の挿入、電子透かしの挿入、ページ分割、PDFフォーム、電子書名の付加など、PDFに用意されたさまざまな機能をサポートしている。QRコードを生成して出力することもできる。また、Java用だけでなくC#用ライブラリのiTextSharpなども配布されている。
なおiTextのライセンスはGNU AGPLv3(GNU Affero General Public License, version 3)であり、Webアプリケーションとして利用する場合でもソースコードの公開が義務付けられている。
iTextを利用してPDFファイルを出力する
本稿執筆時点でのiTextの最新版はバージョン5.0.2であり、このサイトよりダウンロードできる。関連するライブラリは下部の「extrajars」ディレクトリに収められているので、必要に応じてこれらもダウンロードする(本稿の例では利用しない)。あとはダウンロードしたJARファイルをクラスパスに含めてコンパイル/実行すればよい。iText公式サイトではAPIドキュメントも公開されているので、そちらもあわせて参照していただきたい。
iTextを利用してPDF文書を生成する簡単な例を以下に示す。
リスト1
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.*;
public class ITextSample1 {
public static void main(String[] args) {
// ドキュメントオブジェクトを作成
Document document = new Document(PageSize.A4, 30, 30, 40, 50);
try {
// 出力ストリームを作成
PdfWriter.getInstance(document,
new FileOutputStream("output1.pdf"));
// フォントの作成
BaseFont ipaMincho =
BaseFont.createFont("/usr/local/share/font-ipa/ipam.otf",
BaseFont.IDENTITY_H, true);
Font ipam12 = new Font(ipaMincho , 12);
// ドキュメントへの文字の書き込み
document.open();
document.add(new Paragraph("これはiTextを利用して出力されたPDF文書です。", ipam12));
document.close();
} catch (DocumentException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
DocumentクラスはPDFを含む汎用的なドキュメントを表すクラスである。コンストラクタには紙面のサイズと、左右上下のマージンを指定できる。紙面のサイズはRectangleオブジェクトで指定するが、PageSizeクラスにはA4をはじめとするさまざまな紙面サイズが定義されているので、これを利用すると便利だ。
リスト2
Document document = new Document(PageSize.A4, 30, 30, 40, 50);
ファイルなどへの出力には、出力ストリームクラスであるPdfWriterを利用する。このクラスのインスタンスはgetInstanceメソッドで取得できるが、第2引数には出力ストリームを指定するので、ここではFileOutputStreamを指定することでファイルに出力されるようにしている。
リスト3
PdfWriter.getInstance(document,
new FileOutputStream("output1.pdf"));
日本語を利用するには日本語フォントを生成し、それを設定したFontオブジェクトを用意しておく必要がある。フォントの生成はBaseFontクラスのcreateFontメソッドで行う。この第1引数には使用するフォント名またはフォントファイルへのパスを、第2引数にはエンコーディング名を設定する。また第3引数にはフォントをファイルに埋め込むかどうかを設定できる。この例では、サイズ12ptのIPA明朝フォントを設定したFontオブジェクトを用意してある。
リスト4
BaseFont ipaMincho =
BaseFont.createFont("/usr/local/share/font-ipa/ipam.otf",
BaseFont.IDENTITY_H, true);
Font ipam12 = new Font(ipaMincho , 12);
Documentオブジェクトへコンテンツを追加する場合には、最初にopenメソッドを呼び出しておく。openが呼ばれた以降は、Documentに対してヘッダ情報やメタ情報を追加することができなくなる。コンテンツの追加はaddメソッドを用いて行う。ここではParagraphオブジェクトを渡している。Paragraphは段落を表すクラスであり、内部に文章や図表を埋め込むことができる。ここでは一行のテキストを、前述のIPA明朝フォントを指定して渡している。すべてのコンテンツを追加したらcloseメソッドを呼び出す。
リスト5
document.open();
document.add(new Paragraph("これはiTextを利用して出力されたPDF文書です。", ipam12));
document.close();
このプログラムを実行すると、図1のようなPDFファイルが生成される。
コンテンツの追加部分については、次回もう少し詳しく解説したい。