2.2 iText を使うための環境設定

odecalmΛογισμικό & κατασκευή λογ/κού

2 Ιουλ 2012 (πριν από 5 χρόνια και 3 μήνες)

985 εμφανίσεις

10


Chapter2 iText とは
2.1 iText の歴史
1998 年米国、ソフトウェア開発会社で働いていたBruno Lowagie とMario Maccarini は、ある
大学のアプリケーションを再構築する仕事に取り組むことになりました。この大学の中では、学
生の成績管理などのアプリケーションが特定のコンピュータでしか使えない、一方、大学内では
Windows、Mac、Unix など各種のコンピュータが使われてドキュメントの受け渡しが容易にでき
ないといった問題がありました。これを改善するために、クライアントに依存しにくいWeb アプ
リケーションを作ることにしました。Web アプリケーションは Java サーブレットで開発しまし
た。そのときに最後に残った問題が帳票出力でした。
2.1.1 iText の誕生
Web アプリケーションでどのように学生の成績表を出すのか問題でした。ブラウザーからプリン
トすれば、プラットフォームやブラウザーによってプリント結果が少し違います。当時すでに
PDF1.3 はリリースされていて、プリント結果がプラットフォームに依存しないPDF が良いので
はないかということで、二人はこれを使うことにしました。しかし、サーブレットから使えるよ
うなPDF ライブラリはなく、仕方なく二人はAdobe のPDF リファレンスを読んで、独自のPDF
ライブラリを開発したのです。それをオープンソースとして公開したのがiText です。
現 在 、 iText は 多 く の PDF を 使 っ た 帳 票 ソ フ ト 製 品 、 た と え ば
JasperReport(http://www.jasperforge.org/) や Eclipse
BIRT(http://www.eclipse.org/birt/phoenix/
)に組み込まれています。NASA は地球画像のPDF を
作るために使用しています。Google カレンダーではカレンダー生成に使用しています。
2.1.2 iText の特徴
iText は、Java アプリケーションからPDF ファイルをダイナミックに生成、操作するためにあり
ます。iText を.NET で使えるようにしたiText#というものもあります。これはC#で書かれてい
ます。
iText は、スタンドアローンのアプリケーションでも、サーブレットなどのWeb アプリケーショ
ンでも利用できます。iText は次のような用途に向いています。
① 決まりきったPDF ではなく、その都度PDF を作らなければならない用途。つまり、PDF の
内容がケースバイケースで変わる。
② データベースやXML からコンテンツを取得してPDF 作成する。
③ Web ブラウザーに対してPDF をその場で作成し出力したい。
④ 手動でPDF ファイルを作成できない場合。たとえば、サーブレットでPDF を自動応答で返
したい、手動で作るにはページ数が多すぎる、コンテンツが事前に用意できない。
⑤ 既存のPDF ファイルを自動で操作したい。
なお、iText は、PHP、Python、Ruby には対応していませんが、PHP/Java ブリッジやRuby/Java
ブリッジを使用すればiText の利用は可能です。
マクロメディアのColdFusion にはiText.jar ファイルがバンドルされて配布されています。その
ため、ColdFusion では iText を使用することができます。ColdFusion はマクロメディアの製品
でしたが、Adobe がマクロメディアを買収しましたので、今ではAdobe 製品です。
11

2.1.3 iText のライセンス
iText は無料ですが、以下に示すようにMPLまたはLGPLライセンスに従わなければなりません。
MPLは Mozilla Public License です。MPLは顧客にFOSSライブラリ iText (by Bruno Lowagie
and Paulo Soares)を使用していること、ライブラリのソースコードの入手場所を明示しなければ
なりません。ライブラリを変更した場合には、変更した箇所を明示し、バグ修正にも対応する必
要があります。もうひとつは、GNU Public License (LGPL)です。いずれにしても、ルールを守
れば自社製品に組み込んで販売することも可能です。詳しくは iText サイト
(http://www.lowagie.com/iText/MPL-1.1.txt) をご覧ください。

2.2 iText を使うための環境設定
ここでは、開発環境としてEclipse を使用します。もちろん、JDKを使ってコマンドラインで開
発し、実行することもできますが、Eclipse を使えばコーディングやデバッグが格段に効率化でき
ます。
iText ライブラリのダウンロードとインストールの仕方を説明します。ここでは、Windows Vista
Business を OS として、Eclipse3.2、JDK1.6 を使用します。また、サーブレットコンテナは
Tomcat6.0.13 を使用しています。これらのソフトウェアのインストール方法については、読者の
皆さんはすでにご存知だと思いますし、インターネット上、書籍などでも沢山解説されています
ので省略します。
2.2.1 iText のダウンロードとインストール
もし、付属のサンプルプログラム(作成中)を Eclipse にインポートする場合には、ここで説明
するセッティングは不要です。サンプルの中には iText のライブラリも含まれていますので、イ
ンポートをすればiText をインストールする必要はありません。
それ以外での一般的な手順を説明します。まず、次の手順で iText を入手します。
http://www.lowagie.com/iText/の Download というリンクをクリックして、現れたページの
Current Release のコーナーのDownload the library の表の中のCompiled code のjar ファイル
をダウンロードします。いくつかjar ファイルがありますが、iText core のiText-2.1.2u.jar を使
います(執筆時点)。
12


▲iText のホームページ 002

▲iText のjar ファイル 003
また、PDF で日本語を使用ために、日本語フォントなどが入っているiTextAsian.jar を入手する
13

必要があります。
iTextAsian.jar はhttp://prdownloads.sourceforge.net/itext/iTextAsian.jar?downloadからダウン
ロードします。
Eclipse を使用する場合には、これらのjar ファイルはコンピュータ上のどのディレクトリに置い
てもかまいません。筆者の場合には、Windows Vista 環境で、C:¥Users¥User¥Downloads にあ
ります。
次に Eclipse を起動し、サンプルプログラム用に適当にワークスペースを作ります。私の場合
C:¥Users¥User¥mypdf としました。
Eclipse でプロジェクトitext を作ります。この名前は任意です。このitext プロジェクトを右ク
リックしプロパティを実行し、Java のビルドパスをメニューから表示します。ライブラリーのタ
ブを選択し[外部jar の追加]ボタンを押して、ダウンロードしたiText-2.1.2u.jar とiTextAsian.jar
をビルドパスに加えます。

▲Eclipse でiText 関係のjar をビルドパスに追加 004
ビルドパスに正常に追加できたら次のようになりますので、OKボタンを押します。
10


Chapter2 iText とは
2.1 iText の歴史
1998 年米国、ソフトウェア開発会社で働いていたBruno Lowagie とMario Maccarini は、ある
大学のアプリケーションを再構築する仕事に取り組むことになりました。この大学の中では、学
生の成績管理などのアプリケーションが特定のコンピュータでしか使えない、一方、大学内では
Windows、Mac、Unix など各種のコンピュータが使われてドキュメントの受け渡しが容易にでき
ないといった問題がありました。これを改善するために、クライアントに依存しにくいWeb アプ
リケーションを作ることにしました。Web アプリケーションは Java サーブレットで開発しまし
た。そのときに最後に残った問題が帳票出力でした。
2.1.1 iText の誕生
Web アプリケーションでどのように学生の成績表を出すのか問題でした。ブラウザーからプリン
トすれば、プラットフォームやブラウザーによってプリント結果が少し違います。当時すでに
PDF1.3 はリリースされていて、プリント結果がプラットフォームに依存しないPDF が良いので
はないかということで、二人はこれを使うことにしました。しかし、サーブレットから使えるよ
うなPDF ライブラリはなく、仕方なく二人はAdobe のPDF リファレンスを読んで、独自のPDF
ライブラリを開発したのです。それをオープンソースとして公開したのがiText です。
現 在 、 iText は 多 く の PDF を 使 っ た 帳 票 ソ フ ト 製 品 、 た と え ば
JasperReport(http://www.jasperforge.org/) や Eclipse
BIRT(http://www.eclipse.org/birt/phoenix/
)に組み込まれています。NASA は地球画像のPDF を
作るために使用しています。Google カレンダーではカレンダー生成に使用しています。
2.1.2 iText の特徴
iText は、Java アプリケーションからPDF ファイルをダイナミックに生成、操作するためにあり
ます。iText を.NET で使えるようにしたiText#というものもあります。これはC#で書かれてい
ます。
iText は、スタンドアローンのアプリケーションでも、サーブレットなどのWeb アプリケーショ
ンでも利用できます。iText は次のような用途に向いています。
① 決まりきったPDF ではなく、その都度PDF を作らなければならない用途。つまり、PDF の
内容がケースバイケースで変わる。
② データベースやXML からコンテンツを取得してPDF 作成する。
③ Web ブラウザーに対してPDF をその場で作成し出力したい。
④ 手動でPDF ファイルを作成できない場合。たとえば、サーブレットでPDF を自動応答で返
したい、手動で作るにはページ数が多すぎる、コンテンツが事前に用意できない。
⑤ 既存のPDF ファイルを自動で操作したい。
なお、iText は、PHP、Python、Ruby には対応していませんが、PHP/Java ブリッジやRuby/Java
ブリッジを使用すればiText の利用は可能です。
マクロメディアのColdFusion にはiText.jar ファイルがバンドルされて配布されています。その
ため、ColdFusion では iText を使用することができます。ColdFusion はマクロメディアの製品
でしたが、Adobe がマクロメディアを買収しましたので、今ではAdobe 製品です。
11

2.1.3 iText のライセンス
iText は無料ですが、以下に示すようにMPLまたはLGPLライセンスに従わなければなりません。
MPLは Mozilla Public License です。MPLは顧客にFOSSライブラリ iText (by Bruno Lowagie
and Paulo Soares)を使用していること、ライブラリのソースコードの入手場所を明示しなければ
なりません。ライブラリを変更した場合には、変更した箇所を明示し、バグ修正にも対応する必
要があります。もうひとつは、GNU Public License (LGPL)です。いずれにしても、ルールを守
れば自社製品に組み込んで販売することも可能です。詳しくは iText サイト
(http://www.lowagie.com/iText/MPL-1.1.txt) をご覧ください。

2.2 iText を使うための環境設定
ここでは、開発環境としてEclipse を使用します。もちろん、JDKを使ってコマンドラインで開
発し、実行することもできますが、Eclipse を使えばコーディングやデバッグが格段に効率化でき
ます。
iText ライブラリのダウンロードとインストールの仕方を説明します。ここでは、Windows Vista
Business を OS として、Eclipse3.2、JDK1.6 を使用します。また、サーブレットコンテナは
Tomcat6.0.13 を使用しています。これらのソフトウェアのインストール方法については、読者の
皆さんはすでにご存知だと思いますし、インターネット上、書籍などでも沢山解説されています
ので省略します。
2.2.1 iText のダウンロードとインストール
もし、付属のサンプルプログラム(作成中)を Eclipse にインポートする場合には、ここで説明
するセッティングは不要です。サンプルの中には iText のライブラリも含まれていますので、イ
ンポートをすればiText をインストールする必要はありません。
それ以外での一般的な手順を説明します。まず、次の手順で iText を入手します。
http://www.lowagie.com/iText/の Download というリンクをクリックして、現れたページの
Current Release のコーナーのDownload the library の表の中のCompiled code のjar ファイル
をダウンロードします。いくつかjar ファイルがありますが、iText core のiText-2.1.2u.jar を使
います(執筆時点)。
12


▲iText のホームページ 002

▲iText のjar ファイル 003
また、PDF で日本語を使用ために、日本語フォントなどが入っているiTextAsian.jar を入手する
13

必要があります。
iTextAsian.jar はhttp://prdownloads.sourceforge.net/itext/iTextAsian.jar?downloadからダウン
ロードします。
Eclipse を使用する場合には、これらのjar ファイルはコンピュータ上のどのディレクトリに置い
てもかまいません。筆者の場合には、Windows Vista 環境で、C:¥Users¥User¥Downloads にあ
ります。
次に Eclipse を起動し、サンプルプログラム用に適当にワークスペースを作ります。私の場合
C:¥Users¥User¥mypdf としました。
Eclipse でプロジェクトitext を作ります。この名前は任意です。このitext プロジェクトを右ク
リックしプロパティを実行し、Java のビルドパスをメニューから表示します。ライブラリーのタ
ブを選択し[外部jar の追加]ボタンを押して、ダウンロードしたiText-2.1.2u.jar とiTextAsian.jar
をビルドパスに加えます。

▲Eclipse でiText 関係のjar をビルドパスに追加 004
ビルドパスに正常に追加できたら次のようになりますので、OKボタンを押します。
14


▲ビルドパスに追加後 005
Eclipse のパッケージエクスプローラでitext プロジェクトの下にこれから作るコード用にとりあ
えずchapter03 ディレクトリを作ります。以上の作業を行うと次のような状態になります。これ
でプログラムを作る準備が整いました。

▲準備完了の状態 006
サーブレットを使ったサンプルの場合には、さらに設定が必要ですので、また後で説明します。
なお、Eclipse を使わず、JDKだけで開発する場合には、これら2 つのjar ファイルをC:¥Program
Files¥Java¥jdk1.6.0_01¥jre¥lib¥ext に入れれば自動的に認識してくれます。他のディレクトリ
に置く場合には、Windows の環境変数の中のCLASSPATH を使ってその場所がわかるように設
定します。
15


Chapter3 はじめてのiText
まずは、iText を使ってみることが学習の近道です。ここでは、PDF ドキュメントの作成の基本
ステップについて説明します。また、iText を使って既存のPDF を少し操作してみます。
3.1 PDF を作る基本5 ステップ
次の5つのステップによってPDF ファイルを作成します。
ステップ1 Document を作る
ステップ2 DocWriter インスタンスを取得する(この場合はPdfWriter インスタンス)
ステップ3 Document をオープンする
ステップ4 Document に文字や図などコンテンツを追加する
ステップ5 Document をクローズする
このステップにしたがって「iText first try.」という文字を書いたPDF を作ってみます。
3.1.1 HelloWorld
次のコードを見てください。最初に必要なクラスをインポートします。com.lowagie.text.*はiText
の文字を扱うクラスたちです。PdfWriter は、PDF の内容であるDocument をファイルシステム
やネットワークに出力するクラスです。この例の場合、HelloWorld.pdf というファイルに
FileOutputStreamで書き出しています。
ステップ1ではDocument インスタンスを作りますが、次のステップでDocumentException や
IOException が発生する可能性がありますから、try 句で囲みます。ステップ2では、スタティッ
クメソッドgetInstance()でdocument をHelloWorld.pdf に結び付けてPdfWriterを取得します。
ステップ3でdocument をオープンします。ステップ4では、"iText first try."という文字列で段
落、つまりParagraph を作り、それをdocument にadd します。ステップ5でdocument をclose
するとdocument がHelloWorld.pdf に書き出されます。
★chapter03/HelloWorld.java
package chapter03;
import java.io.FileOutputStream;
import java.io.IOException;
import com.lowagie.text.*;
import com.lowagie.text.pdf.PdfWriter;
public class HelloWorld {
public static void main(String[] args) {
//ステップ1(Document を作る)
Document document = new Document();
try {
//ステップ2(PdfWriter インスタンスを取得する)
PdfWriter.getInstance(document,
new FileOutputStream("HelloWorld.pdf"));
//ステップ3(Document をオープンする)
document.open();
16

//ステップ4(Document にコンテンツを追加する)
document.add(new Paragraph("iText first try."));
} catch (DocumentException de) {
System.err.println(de.getMessage());
} catch (IOException ioe) {
System.err.println(ioe.getMessage());
}
//ステップ5(Document をクローズする)
document.close();
}
}
HelloWorld.pdf は書き出し先のディレクトリは指定しませんでしたが、どこに出力されたのでし
ょう。PDF ファイルはEclipse のワークスペースmypdf の下のitext プロジェクトの中、つまり
C:¥Users¥User¥mypdf¥itext です。

▲PDF の場所 007
HelloWorld.pdf をAdobe Reader で開いてみると、次のようにちゃんとしたPDF になっている
ことがわかります。
17


▲HelloWorld.pdf 008
PDF の書き出しディレクトリを指定する場合には、ステップ2のFileOutputStreamのところで
指定します。Windows のいわゆる(マイ)ドキュメントに出力する場合には次のようにします。
Vista では C ドライブ直下にプログラムから書き込みをしようとするとセキュリティの観点から
エラーになりますのでご注意ください。バックスラッシュは日本語キーボードでは¥キーです。
¥はエスケープしなければなりませんから合計2 個になります。

▲PDF の書き出しディレクトリ指定 009
3.1.2 日本語の出力
先ほどの例では英語だけしか書きませんでしたが、我々日本人としては、日本語が使えないと困
ります。当然それはできますのでご安心ください。日本語で書くための変更点は次のとおりです。
作成するPDF のファイル名はHelloWorldJ.pdf に変更しました。①から④はコードの中にも記入
してあり、それと対応しています。
① BaseFont クラスのインポート
② BaseFont の取得。createFont()メソッドは次のように使用します。
BaseFont.createFont(String name, String encoding, boolean embedded)
フォント名name、エンコーディングencoding、フォント埋め込みembedded について指定しま
す。
name は、ゴシックがHeiseiKakuGo-W5、明朝がHeiseiMin-W3 が指定できます。
encoding は、以下のものが指定できます。
UniJIS-UCS2-H ・・・Adobe-Japan1 のUnicode エンコーディング
UniJIS-UCS2-V ・・・UniJIS-UCS2-Hの縦書きエンコーディング
UniJIS-UCS2-HW-H・・・UniJIS-UCS2-Hと同じ、ただし英文字を半角に置き換える
UniJIS-UCS2-HW-V・・・UniJIS-UCS2-HW-Hの縦書きエンコーディング
18

③ Font を作ります。コンストラクタとしては、fontfamily、size、style、color が指定できるよ
うになっていますが、ここでは最初の2 つを指定しています。
④ Paragraph をコンストラクトするときに③で作ったFont を指定しています。

★chapter03/HelloWorldJ.java
package chapter03;
import java.io.FileOutputStream;
import java.io.IOException;
import com.lowagie.text.*;
import com.lowagie.text.pdf.PdfWriter;
import com.lowagie.text.pdf.BaseFont;・・・・・・・①
public class HelloWorldJ {
public static void main(String[] args) {
//ステップ1(Document を作る)
Document document = new Document();
try {
//ステップ2(DocWriter インスタンスを取得する)
PdfWriter.getInstance(document,
new FileOutputStream("HelloWorldJ.pdf"));
//ステップ3(Document をオープンする)
document.open();
//ステップ4(Document にコンテンツを追加する)
BaseFont bf =
BaseFont.createFont("HeiseiKakuGo-W5",
"UniJIS-UCS2-HW-H",false); ・・・・・・・②
Font font = new Font(bf,12); ・・・・・・・③
document.add(new Paragraph("iText ファースト トライ。",font));
・・・・・・・④
} catch (DocumentException de) {
System.err.println(de.getMessage());
} catch (IOException ioe) {
System.err.println(ioe.getMessage());
}
//ステップ5(Document をクローズする)
document.close();
}
}
このコードを実行した結果のPDF は次のようになり、日本語が書き込まれています。
19


▲日本語のPDF 010

次に、ステップ1から5までについてもう少し詳しく見ていきます。
3.1.3 ステップ1:Document を作る
◆ サイズ
com.lowagie.text.Document オブジェクトは、PDF ファイルにするコンテンツを書き込む用紙の
ようなオブジェクトです。最初のHelloWorld.java の例ではDocument オブジェクトを作る際に
何も指定せずにお任せで作りました。デフォルトで用紙サイズはいくつになっているのか確認し
てみます。Adobe Reader の[ファイル]-[文書のプロパティ]で概要タブのところを見ると次のよう
になっています。210×297mmです。これはよく使われるA4 サイズですから、通常の使い方で
はデフォルトでほとんど問題ないことがわかります。ついでですが、PDF に変換したのが
iText-2.1.2u で、PDF のバージョンが1.4 であることもわかります。

▲PDF のプロパティ 011
デフォルトコンストラクタのほかに、Document のコンストラクタには次のようなものもありま
す。
■Document(Rectangle pageSize)
com.lowagie.text.Rectangle オブジェクトを引数で渡します。Rectangle のコンストラクタは 3
種類ありますが、Document でよく使うのはRectangle(float urx, float ury) です。これは四角形
の左下角が座標(0,0)、右上角が座標(urx, ury)にある四角形を作ります。urx を幅、ury を高さと
20

する四角形と考えて問題ありません。したがって、幅595 ポイント、高さ842 ポイントの用紙を
作るなら次のようにします。ここで1 ポイント=1/72 インチ=1/72*25.4mm(約0.3528mm)で
す。
Rectangle pageSize = new Rectangle(595f, 842f);
Document document = new Document(pageSize);
この2 行を一緒にして、次のようにすることもできます。
Document document = new Document(new Rectangle(595f, 842f));
また、Rectangle には背景色を設定するsetBackgroundColor(Color value) メソッド、枠線の色
を設定するsetBorderColor(Color value)メソッド 、用紙を回転させるrotate()メソッドなど便利
なメソッドもあります。これらについては、あとで説明します。
■Document(Rectangle pageSize, float marginLeft, float marginRight, float marginTop, float
marginBottom)
このコンストラクタは、第1 引数がページサイズ、第2 引数から第5 引数までがマージン(余白)
の設定です。それぞれ左、右、上、下のマージンを指定します。これについては、マージンのと
ころで説明します。

用紙サイズをいろいろな単位で表してみました。A 判用紙サイズはヨーロッパ、アジア、ラテン
アメリカでは一般的なもので、ISOでも定められたサイズです。A 判もB判も、高さは幅の1.4142
倍、つまり2 の平方根になっています。
▲用紙サイズ 004.xls
■mm 単位のサイズ表

A 判
B 判
サイズ
幅(mm)
高さ(mm)
サイズ
幅(mm)
高さ(mm)
A0
841
1189
B0
1030
1456
A1
594
841
B1
728
1030
A2
420
594
B2
515
728
A3
297
420
B3
364
515
A4
210
297
B4
257
364
A5
148
210
B5
182
257
A6
105
148
B6
128
182
A7
74
105
B7
91
128
A8
52
74
B8
64
91
A9
37
52
B9
45
64
A10
26
37
B10
32
45
■インチ単位のサイズ表
1 インチ = 25.4 mm

A 判
B 判
サイズ
幅(インチ)
高さ(インチ)
サイズ
幅(インチ)
高さ(インチ)
A0
33.11
46.81
B0
40.55
57.32
21

A1
23.39
33.11
B1
28.66
40.55
A2
16.54
23.39
B2
20.28
28.66
A3
11.69
16.54
B3
14.33
20.28
A4
8.27
11.69
B4
10.12
14.33
A5
5.83
8.27
B5
7.17
10.12
A6
4.13
5.83
B6
5.04
7.17
A7
2.91
4.13
B7
3.58
5.04
A8
2.05
2.91
B8
2.52
3.58
A9
1.46
2.05
B9
1.77
2.52
A10
1.02
1.46
B10
1.26
1.77
■ポイント単位のサイズ表 1 インチ = 72 ポイント
A 判


B 判
サイズ
幅(インチ)
高さ(イン
チ)
サイズ
幅(インチ)
高さ(イン
チ)
A0
2,384
3,370
B0
2,920
4,127
A1
1,684
2,384
B1
2,064
2,920
A2
1,191
1,684
B2
1,460
2,064
A3
842
1,191
B3
1,032
1,460
A4
595
842
B4
729
1,032
A5
420
595
B5
516
729
A6
298
420
B6
363
516
A7
210
298
B7
258
363
A8
147
210
B8
181
258
A9
105
147
B9
128
181
A10
74
105
B10
91
128

Adobe のPDF リファレンスによれば、PDF のバージョンによってドキュメントの大きさには制
限があります。PDF1.3 以前では最小72×72 ポイント(つまり1×1 インチ)、最大3,240×3,240
ポイント(つまり45×45 インチ)、PDF1.4 以降では最小3×3 ポイント(約0.04×0.04 インチ)、
最大14,400×14,400 ポイント(200×200 インチ)です。
iText では、サイズ指定の単位をポイントからインチ、ミリメートル、メートルに変更することは
できませんので、必要に応じてプログラムの中で、1 in = 2.54 cm = 72 ポイントという換算方法
で自分で計算しなければなりません。
しかし、毎回このような数値を扱うのは面倒ですから、よく使用する用紙サイズは
com.lowagie.text.PageSize クラスの中でstatic final の定数として定義されています。定義され
ているのは以下のとおりです。


22

_11X17 B2 LARGE_CROWN_QUARTO
A0 B3 LEDGER
A1 B4 LEGAL
A10 B5 LETTER
A2 B6 NOTE
A3 B7 PENGUIN_LARGE_PAPERBACK
A4 B8 PENGUIN_SMALL_PAPERBACK
A5 B9 POSTCARD
A6 CROWN_OCTAVO ROYAL_OCTAVO
A7 CROWN_QUARTO ROYAL_QUARTO
A8 DEMY_OCTAVO SMALL_PAPERBACK
A9 DEMY_QUARTO TABLOID
ARCH_A EXECUTIVE
ARCH_B FLSA
ARCH_C FLSE
ARCH_D HALFLETTER
ARCH_E ID_1
B0 ID_2
B1 ID_3
B10 LARGE_CROWN_OCTAVO
これらはRectangle タイプの値を持っています。たとえば、A4 サイズを指定するなら次のように
します。
Document document = new Document(PageSize. A4);
◆ 用紙の向き
用紙の向きはデフォルトではポートレート(縦長)ですが、次のように rotate()メソッドを使っ
てランドスケープ(横長)に設定することも可能です。もちろん、Rectangle オブジェクトのコ
ンストラクタで縦横寸法を指定して横長の用紙を作ってもかまいません。できたPDF の用紙サイ
ズはAdobe Reader の文書プロパティで確認することができます。
Document document = new Document(PageSize.A4.rotate());
◆ ページマージン(余白)
サンプルのステップ4で、” iText first try.”という文字列をcom.lowagie.text.Paragraph に入れ
て、それをDocument オブジェクトに加えました。このとき、用紙のマージン(余白)について
は何も設定しませんでしたので、iText はデフォルトのマージン 36 ポイント(1/2 インチ)を自
動的に設定してくれたのです。
マージンを指定する場合には、Document のコンストラクタの第2 引数から第5 引数で指定しま
す。第2 引数から順に、左マージン、右マージン、上マージン、下マージンです。これまでに作
ったHello World はデフォルトマージンです。デフォルトマージンの36 ポイントから上下まーじ
んだけを72 ポイントに変更するには次のようにします。
23


Document document = new Document(PageSize.A4, 36, 36, 72, 72);
もし、左右見開きのページを作成する場合には、奇数ページと偶数ページで左右のマージンを変
えたいことがあります。このような場合には、true を引数にしてsetMarginMirroring()メソッド
を使います。
document.setMarginMirroring(true);
◆ 背景色
ページに背景色をつける場合には、Rectangle オブジェクトのsetBackgroundColor()メソッドを
使います。引数にはjava.awt.Color を使い、RGで色指定ます。もし、CMYKで指定したい場合
には、com.lowagie.text.pdf.ExtendedColor クラスを使ってください。
★chapter03/HelloWorldColor.java
Rectangle pagesize = new Rectangle(PageSize. A4);
pagesize.setBackgroundColor(new Color(0x99, 0x99, 0xff));
Document document = new Document(pagesize);
できたPDF は次のようにブルーの用紙になります。

▲用紙に色をつける 012

3.1.4 ステップ2:DocWriter インスタンスの取得
ステップ2は、どのフォーマットで、どこにファイルを出力するかを決めるところです。
Document インスタンスを作ったら、それをローカルのファイルに出力するか、メモリに出力す
るか、サーブレットのPrintWriter の出力ストリームに出力するか決める必要があります。また、
フォーマットもPDF か、iText がサポートしているその他のフォーマットにするか決めなければ
なりません。 他のフォーマットというのは、RTF とHTML です。
これらのことを決めてDocWriter クラスを取得します。DocWriter クラスはabstract クラスで、
実際のサブクラスは、HtmlWriter, PdfWriter, RtfWriter, RtfWriter2 です。
24

ステップ2は、書き出すフォーマット、つまり PDF、RTF、HTML によって次のいずれかの命
令文になります。ここでは、ほとんどPdfWriter を使っていきます。
PdfWriter.getInstance(document, new FileOutputStream("HelloWorld.pdf"));
RtfWriter2.getInstance(document, new FileOutputStream("HelloWorld.rtf"));
HtmlWriter.getInstance(document, new FileOutputStream("HelloWorld.htm"));
なお、RtfWriter クラスというものもありますが、これはバグフィックスのための古いクラスな
ので、RTF フォーマットで書き出す場合には RtfWriter2 クラスを使います。RtfWriter クラス
はいずれ無くなります。このRtfWriter2 はiText-2.1.2u.jar ではなく iText-rtf-2.1.2u.jar の中に
含まれていていますので、iText のホームページから別にダウンロードしてEclipse でこのプロジ
ェクトのビルドパスに加えます。
RTF のサンプルを作ってみました。
★chapter03/ HelloWorldRTF.java
Document document = new Document();
try {
//ステップ2(DocWriter インスタンスを取得する)
RtfWriter2.getInstance(document,
new FileOutputStream("HelloWorldRTF.rtf"));
//ステップ3(Document をオープンする)
document.open();
//ステップ4(Document にコンテンツを追加する)
BaseFont bf = BaseFont.createFont("HeiseiKakuGo-W5",
"UniJIS-UCS2-HW-H",false);
Font font = new Font(bf,12);
document.add(new Paragraph("RTF への書き出し。",font));
・・・
できた HelloWorldRTF.rtf をダブルクリックで開くと、Word が起動してつぎのように正常に表
示されます。

▲RTF への書き出し 013
25

このように、iText では、PDF に書き出すのも、Word のRTF に書き出すのも、HTML に書き出
すのも簡単に切り替えることができます。同じコンテンツをフォーマットを変えて出力できます。
ただし、すべての要素がファイルに書き出されるとは限らず、いくつかの要素は表示されないこ
ともあるかもしれません。
なお、ステップ2の部分に次のようにPdfWriter とRtfWriter2 の2 つを入れると、コードのほか
の部分をまったく変更しなくても、同時にフォーマットの異なる2 つのファイルを出力すること
ができます。
//ステップ2(DocWriter インスタンスを取得する)
PdfWriter.getInstance(document, new FileOutputStream("HelloWorldRTF.pdf"));
RtfWriter2.getInstance(document, new FileOutputStream("HelloWorldRTF.rtf"));
次の図のように、HelloWorldRTF.pdf とHelloWorldRTF.rtf ができています。

▲異フォーマットで同時にファイル出力 014
Web アプリケーションにおける PDF の使い方については興味があると思います。
javax.servlet.ServletOutputStream は java.io.OutputStream を拡張したものです。PdfWriter
を取得するときに第2 引数にresponse.getOutputStream()を指定すればよいだけです。
しかし、これはブラウザーによってはうまく動作しない場合があります。サーブレットにおける
使用法については、また後で詳しく説明します。この問題は iText 側の問題ではなく、ブラウザ
ー側が原因です。
3.1.5 ステップ3:ドキュメントを開く
通常の Java プログラミングでは、ファイルに書き込むデータが用意できてからストリームを開
いてすぐに書き込みます。しかし、iText では、ドキュメントの初期化をいろいろと行うために、
最初にドキュメントをオープンする必要があります。ドキュメントがオープンされたとき、iText
は多くの初期化作業を行います。
次のコードは、Document をデフォルトで取得してから、その後にページをrotate()したり、マー
ジンを設定しています。このようにプログラミングすると最初のページはデフォルトで作られて、
2ページ目から変更した設定が適用されます。
26

Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("HelloWorld.pdf"));
document.setPageSize(PageSize.A4.rotate());
document.setMargins(72, 36, 90, 36);
document.open();
1ページ目から同じ設定を適用するには、次のようにDocument のコンストラクタですべて設定
を済ませるようにします。多くのドキュメントはファイルのヘッダー部分にバージョン情報やメ
タデータを持っています。ドキュメントをオープンする前に必ずPDF をバージョンとメタデータ
を設定しなければなりません。
Document document = new Document(PageSize. A4.rotate(),72, 36, 90, 36);
PdfWriter.getInstance(document, new FileOutputStream("HelloWorld.pdf"));
document.open();
document.open()が実行されたとき、iText の DocWriter は OutputStream に最初のバイト列を
書き出します。PdfWriter の場合、PDF ヘッダーが書かれ、次のような値が書き込まれます。
%PDF-1.4
%矣腕
この最初の行はPDF のバージョンです。2 行目の%はPDF ではコメントを意味しますので、こ
の情報は機能的な意味を持ちませんが、付けることが推奨されています。これがファイルの先頭
付近にあると、アプリケーションはPDF ファイルの中身をバイナリーとして確実に認識できます。
PDF リファレンスによれば、ファイルの先頭付近に少なくとも4 個のバイナリーキャラクターを
含めれば回避できると書かれています。テキストエデェタでは文字化けしたようになりますが、
気にしないでください。
現在、iText はデフォルトでPDF のバージョン1.4 を生成しますが、ほかのバージョンにするに
は setPdfVersion(PdfWriter.VERSION_1_7)のようにして変更します。使用できる iText の定数
は次のとりです。
制定年
PDF バージョン
対応しているAcrobat バージョン
iText の定数
1993 PDF1.0 Acrobat1
1994 PDF1.1 Acrobat2
1996 PDF1.2 Acrobat3 PdfWriter.VERSION_1_2
1999 PDF1.3 Acrobat4 PdfWriter.VERSION_1_3
2001 PDF1.4 Acrobat5 PdfWriter.VERSION_1_4
2003 PDF1.5 Acrobat6 PdfWriter.VERSION_1_5
2004 PDF1.6 Acrobat7 PdfWriter.VERSION_1_6
2007 PDF1.7 Acrobat8 PdfWriter.VERSION_1_7
次に例を示します。
★chapter03/HelloWorld17.java
//ステップ2
PdfWriter writer = PdfWriter.getInstance(document,
new FileOutputStream("HelloWorld17.pdf"));
27

writer.setPdfVersion(PdfWriter.VERSION_1_7);
//ステップ3
document.open();
PDF のバージョンはドキュメントを開く前なら変更することができます。ヘッダーは
OutputStream で書き込みが行われると二度と変更ができないので、ドキュメントを開く前でな
いと変更はできません。

▲バージョン1.7 で作ったPDF 015

▲PDF のプロパティ 016
PDF ドキュメントに作成者やタイトルの情報を付け加えてみます。このメタデータは info
dictionary に保存されます。このdictionary はPDF の中のどこにでも置くことができるPDF オ
ブジェクトです。HTML においては、これら全ての情報は<head>部分に保存されます。PDF に
おいては、addHeader メソッドに渡されたメタデータは、キーと値のペアで PDF の info
dictionary に付加されます。
例のHelloWorld17.java にメタデータを追加してみます。
★chapter03/HelloWorldMeta.java
//ステップ3
document.addTitle("iText サンプル");
document.addSubject("入門のためのサンプル");
document.addKeywords("iText,pdf");
document.addCreator("Java program with iText");
document.addAuthor("川崎克巳");
28

document.addHeader("Expires", "0");
document.open();

▲メタデータを付加したPDF のプロパティ 016
3.1.6 ステップ4:コンテンツを加える
コンテンツを追加する方法は以下の3 つです。
1.もっとも簡単な方法は、iText のベーシック・ビルディング・ブロックを使う
2.PDF エキスパートならPDF オペレータとオペランドに対応したiText のメソッドを使う
3.Java エキスパートならGraphics2D メソッドとSwing コンポーネントのpaint メソッドを
使う
◆ベーシック・ビルディング・ブロックを使う方法:
これまでの例では文字を描くためにParagraph オブジェクトを使いました。このParagraph も
ベーシック・ビルディング・ブロックのひとつです。
ベーシック・ビルディング・ブロックを使うと、レイアウトなどわずらわしいことを考えずに簡
単にドキュメントを作ることができます。それぞれのビルディングブロックは、字下げ、インデ
29

ント、フォント、色、ボーダー幅などをパラメーターとして指定することができます。ベーシッ
ク・ビルディング・ブロックの詳細については後で説明します。ベーシック・ビルディング・ブ
ロックを使う場合には、PDF に関する知識は全く必要ありません。しかし、ニーズが満たせない
場合には次に説明する方法を使います。
◆低レベルのPDF 生成
PDF ファイルの全てのコンテンツはcontent streamの内部に定義されています。content stream
はstreamタイプのPDF オブジェクトです。PDF の中身を覗いてみるために、HelloWorld.java
で次のように少し命令を加えて、PDF 出力を非圧縮にします。
・・・
Document document = new Document();
Document.compress = false;
・・・
このようにして作ったHelloWorld.pdf をテキストエディタ(私の場合には秀丸です)で開くと次
のようになっています。これがPDF の実体です。
%PDF-1.4
%矣腕
2 0 obj <</Length 67>>stream
q
BT
36 806 Td
0 -18 Td
/F1 12 Tf
(iText first try.)Tj
0 0 Td
ET
Q

endstream
endobj
4 0 obj<</Parent 3 0 R/Contents 2 0 R/Type/Page/Resources<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]/Font<</F1 1
0 R>>>>/MediaBox[0 0 595 842]>>
endobj
1 0 obj<</BaseFont/Helvetica/Type/Font/Encoding/WinAnsiEncoding/Subtype/Type1>>
endobj
3 0 obj<</Type/Pages/Count 1/Kids[4 0 R]>>
endobj
5 0 obj<</Type/Catalog/Pages 3 0 R>>
endobj
6 0 obj<</Producer(iText 2.1.2u ¥(by
lowagie.com¥))/ModDate(D:20080518184227+09'00')/CreationDate(D:20080518184227+09'00')>>
endobj
xref
0 7
0000000000 65535 f
0000000285 00000 n
0000000015 00000 n
0000000372 00000 n
0000000129 00000 n
0000000422 00000 n
0000000466 00000 n
trailer
<</Root 5 0 R/ID [<0ce906fc851d8e76e4cd64b58968ad1b><ed17cc66a5f88bb87d2d2089e9c7f67a>]/Info 6 0 R/Size 7>>
startxref
598
%%EOF
「iText first try.」という文字はすぐにわかるでしょう。streamとendstreamの間に挟まれてい
るその他のPDF オペレータとオペランドの意味については後で説明します。ベーシック・ビルデ
ィング・ブロックを使った場合には、これらのオペレータとオペランドは PdfContentByte オブ
ジェクトが自動的に変換して作り出してくれます。
30

PdfContentByte オブジェクトは、PdfWriter.getDirectContent()を使って取得することができま
す。
HelloWorld.java を改造して、PdfContentByte を使うようにします。コンテンツを Document
に追加するステップ4は次のように置き換えることができます。やや複雑になります。
★HelloWorldDirect.java
・・・
//ステップ2(DocWriter インスタンスを取得する)
PdfWriter writer = PdfWriter.getInstance(document,
new FileOutputStream("HelloWorldDirect.pdf"));
//ステップ3(Document をオープンする)
document.open();
//ステップ4(Document にコンテンツを追加する)
PdfContentByte cb = writer.getDirectContent();
BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA,
BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
cb.saveState(); // q
cb.beginText(); // BT
cb.moveText(36, 806); // 36 806 Td・・・・・①
cb.moveText(0, -18); // 0 -18 Td・・・・・②
cb.setFontAndSize(bf, 12); // /F1 12 Tf
cb.showText("iText first try."); // (iText first try.)Tj・・・・・③
cb.moveText(0, 0); // 0 0 Td
cb.endText(); // ET
cb.restoreState(); // Q
・・・
各行のコメントには、対応するPDF のオペレータとオペランドを意味しています。
① カーソルをスタートポジションに置きます。デフォルトの右マージンは36 ポイントです。デ
フォルトでは、ページの左下のコーナーが座標の原点となっています。ページの縦寸法は842
ポイントです。上マージン36 ポイントを引くと有効部分は842-36 = 806 ポイントとなりま
す。したがって、左上のスタート座標はx = 36、 y = 806 です。
② 続いて、下方向に18 ユニット移動します。これはラインスペースといいます。これは行のベ
ースラインと次の行のベースラインとの間の距離です。PDF リファレンスでは、このライン
スペースのことをleading と呼びます。iText も同じです。
③ ShowText によって、この位置に「iText first try.」というparagraph が表示されます

その他のメソッドは状態を設定したり、テキストブロックを定義したり、フォントやフォントサ
イズを設定するものです。
この方法はかなり手間がかかるので、実際にはあまり使用しません。時々、PdfContentByte オ
ブジェクトを使って、ページ番号、ページヘッダー、フッターを指定した場所に追加することは
31

あります。このPdfContentByte オブジェクトは最高のフレキシビリティ、PDF パワーを提供し
ますが、これを使う時には、PDF の文法を知っている必要があります。
この方法で作成したPDF もAdobe Reader でちゃんと表示できます。

▲PdfContentByte を使った場合 018
◆java.awt.Graphics2D を使う
次に3 番目の方法として、java.awt.Graphics2Dを使う方法を紹介します。
PdfContentByte クラスは createGraphics()メソッドを備えており、java.awt.Graphics2 のサブ
クラスであるcom.lowagie.text.pdf.PdfGraphics2Dクラスを生成することができます。このクラ
スはGraphics2Dの全てのメソッドをオーバーライドしているので便利です。
HelloWorld.java のステップ4を次のように変更します。
★chapter03/HelloWorldG2D.java
・・・
//ステップ4(Document にコンテンツを追加する)
PdfContentByte cb = writer.getDirectContent();
Graphics2D g = cb.createGraphics(PageSize.A4.getWidth(), PageSize.A4.getHeight());
g.drawString("iText first try by Graphics2D", 36, 54);
g.dispose();
・・・

▲Graphics2Dを使ったPDF 019
低レベルの方法に比べると分かりやすくなります。Swing コンポーネントに慣れている人には適
32

しています。
3.1.7 ステップ5:ドキュメントを閉じる
Document を閉じるときには、メモリ上のPDF オブジェクトはOutputStream に書き出されま
す。以下の内容を含みます。
■PDF のクロスリファレンステーブル
これはPDF オブジェクトのバイト位置を含んでいるものです。
■PDF のトレーラー
これはアプリケーションがスムーズにクロスリファレンステーブルのスタート位置を見つけられ
るようにするためや、info ディクショナリのような特別なオブジェクトを入れるためのものです。

最後に %%EOF (End of File)を加えます。これらが全て終わると、OutputStreamがフラッシュ
され、クローズされます。これでPDF 作成が成功です。

A3 ページのサンプル