多くのアプリケーションでPDF文書の動的生成が必要になります。そうしたアプリケーションの対象としては、顧客の口座取引明細を電子メールで配信する銀行から、書籍の特定の章を購入しPDF形式で受け取るユーザーまで、広範囲に及び、限りがありません。この記事では、iText Javaライブラリーを使い、PDF文書を生成します。読者が理解を深め、実際にできるようにするため、サンプル・アプリケーションを使って説明します。
iTextはLowagie.comから無料で入手できるJavaライブラリーです(「 参考文献 」を参照)。iTextライブラリーは高機能であり、PDFの生成に加え、HTML、RTF、およびXMLの文書の生成もサポートしています。文書では、さまざまなフォントを選んで使用できます。また、iTextの構造を使うと、上記の種類の文書を同じコードで生成できます。
iTextライブラリーには、さまざまなフォントを使ったPDFテキストの生成、PDF文書の表の生成、ページへのウォーターマークの追加などの処理を行うクラスが含まれています。iTextではさらに多くの機能を利用できます。1つの記事の中ですべての機能を紹介することはできないため、ここではPDFの生成に必要な基本機能のみを取り上げます。
サンプル・アプリケーションの開発にはEclipseを使います。オープンソースIDEのEclipseは無料で入手でき、非常に高性能です。Eclipseは今すぐダウンロードできます(「 参考文献 」を参照)。
com.lowagie.text.DocumentはPDF文書生成用のメイン・クラスです。これは、最初にインスタンス化するクラスです。文書が作成されたら、ライターで書き込む必要があります。com.lowagie.text.pdf.PdfWriterはPDFライターです。ほかによく使うクラスを次に示します。
- com.lowagie.text.Paragraph -- このクラスはインデントされた段落を表します。
- com.lowagie.text.Chapter -- このクラスはPDF文書の章を表します。タイトルをParagraphで、章番号をintで作成します。
- com.lowagie.text.Font -- このクラスには、フォントのファミリー、サイズ、スタイル、色など、フォントの仕様がすべて含まれています。さまざまなフォントがこのクラスの静的定数として宣言されています。
- com.lowagie.text.List -- このクラスはリストを表します。リストは、いくつかのListItemsから構成されます。
- com.lowagie.text.Table -- このクラスは表を表します。表はマトリックス上に並んだセルから構成されます。
Pure JavaライブラリーのiTextは、JARファイル形式です(「 参考文献 」を参照)。ライブラリーをダウンロードした後(たとえば、パスはC:\temp)、次の手順を実行すると、Eclipse環境にiTextライブラリーが設定されます。
- EclipseにiTextという新しいプロジェクトを作成します。
- [Package Explorer]ビューでiTextプロジェクトを右クリックし、[ Properties ]を選択します。
- [ Java Build Path ]をクリックします。[Libraries]タブで、[ Add External JARs ]をクリックします。
- C:\tempディレクトリーを参照し、このディレクトリーのitext-1.3.jarを選択します。
- [ OK ]をクリックします。
iTextは設定され、Eclipseでは、PDF文書を動的に生成するJavaアプリケーションの作成準備が整いました。
正しく動作するサンプルを自分の手で作成すること以上に、技術の理解に役立つことはありません。必要なツール(Eclipse IDE)とライブラリー(iTextライブラリー)は用意できたので、サンプル・プログラムを設計し、開発する準備が整いました。
プレーン・テキスト、デフォルト以外のフォントが設定された色付きテキスト、表、リスト、章、セクションなどの基本要素がある簡単なPDF文書を作成してみましょう。このアプリケーションの目的は、iTextライブラリーの使い方に慣れることです。PDF文書の生成に関連したさまざまな作業を行うクラスはたくさんあります。これらすべてのクラスを取り上げることはできません。iTextのjavadocコメントは、クラスの使い方の情報源として優れています。では、コーディングを始めましょう。
まず、文書を作成します。文書は、PDF文書のすべての要素のコンテナーです。
リスト1.文書オブジェクトのインスタンス化
Document document = new Document(PageSize.A4, 50, 50, 50, 50);
|
最初の引数はページ・サイズを示します。次の引数はそれぞれ左、右、上、下のマージンを示します。このドキュメントのタイプはまだ定義されていません。ドキュメントのタイプは作成するライターによって異なります。このサンプルでは、com.lowagie.text.pdf.PdfWriterを選択します。ほかのライターとしては、HtmlWriter,、RtfWriter、XmlWriterなどがあります。その用途は、それぞれの名前から明らかです。
リスト2.PdfWriterオブジェクトの作成
PdfWriter writer = PdfWriter.getInstance(document, \
new FileOutputStream("C:\\ITextTest.pdf"));
document.open();
|
最初の引数は文書オブジェクトへの参照です。2番目の引数は出力を書き込む先のファイルの絶対名です。次に、書き込むために文書を開きます。
文書の最初のページにテキストを追加します。テキストは、com.lowagie.text.Paragraphを使って追加します。デフォルトの段落にテキストを入れ、フォント、色、サイズなどはデフォルト設定にすることができます。また、独自のフォントを設定することもできます。両方のオプションを見てみましょう。
リスト3.段落オブジェクトの作成
document.add(new Paragraph("First page of the document."));
document.add(new Paragraph("Some more text on the \
first page with different color and font type.",
FontFactory.getFont(FontFactory.COURIER, 14, Font.BOLD, new Color(255, 150, 200))));
|
上記コードのサンプル出力を次に示します。上記コードの最後にdocument.close();を加えると、文書は閉じます。
図1. 上記コードのサンプル出力
プレーン・テキストをPDF文書に追加する方法を説明しました。次に、複雑な要素を文書に追加する必要があります。まず、新しい章を作成しましょう。章は、新しいページで始まり、デフォルトで番号が表示される特殊なセクションです。
リスト4.章オブジェクトの作成
Paragraph title1 = new Paragraph("Chapter 1",
FontFactory.getFont(FontFactory.HELVETICA, \
18, Font.BOLDITALIC, new Color(0, 0, 255)));
Chapter chapter1 = new Chapter(title1, 1);
chapter1.setNumberDepth(0);
|
上記のコードで、「This is Chapter 1」というタイトルの新しい章オブジェクトchapter1を作成しました。番号の深さを0に設定すると、章番号はページに表示されません。
セクションは章の部分要素です。次のコードで、「This is Section 1 in Chapter 1」というタイトルのセクションを作成します。このセクションの下にテキストを追加するため、別の段落オブジェクトsomeSectionTextを作成し、セクション・オブジェクトに追加します。
リスト5.セクション・オブジェクトの作成
Paragraph title11 = new Paragraph("This is Section 1 in Chapter 1",
FontFactory.getFont(FontFactory.HELVETICA, 16, \
Font.BOLD, new Color(255, 0, 0)));
Section section1 = chapter1.addSection(title11);
Paragraph someSectionText = new Paragraph("This \
text comes as part of section 1 of chapter 1.");
section1.add(someSectionText);
someSectionText = new Paragraph("Following is a 3 X 2 table.");
section1.add(someSectionText);
|
表を追加する前に、文書がどのようになっているか見てみましょう。次の2行を追加して文書を閉じ、プログラムをコンパイルして実行すると、PDF文書が生成されます: document. add(chapter1);document.close();
図2. 章のサンプル出力
次に表オブジェクトを作成します。表は行と列のマトリックスから構成されます。行の1セルは複数の列にわたることができます。同様に、列の1セルは複数の行にわたることができます。したがって、3 x 2の表は必ずしも6個のセルがあるとは限りません。
リスト6.表オブジェクトの作成
Table t = new Table(3,2);
t.setBorderColor(new Color(220, 255, 100));
t.setPadding(5);
t.setSpacing(5);
t.setBorderWidth(1);
Cell c1 = new Cell("header1");
c1.setHeader(true);
t.addCell(c1);
c1 = new Cell("Header2");
t.addCell(c1);
c1 = new Cell("Header3");
t.addCell(c1);
t.endHeaders();
t.addCell("1.1");
t.addCell("1.2");
t.addCell("1.3");
section1.add(t);
|
上記のコードでは、3つの列と2つの行を持つ表オブジェクトtを作成します。次に、表の枠の色を設定します。セルのテキストとセルの境界の間のスペーシングにはパディングを使います。スペーシングとは隣り合うセルの境界にあるスペースです。次に、異なるテキストが入った3つのセル・オブジェクトを作成します。続けて表に追加します。先頭行で、まず最初の列に追加され、同じ行の次の列に移動します。その行が完了したら、次のセルは次の行の最初の列に追加されます。また、t.addCell("1.1");など、セルのテキストを指定して、表にセルを追加することもできます。最後に、表オブジェクトをセクション・オブジェクトに追加します。
最後に、PDF文書にリストを追加する方法を調べましょう。リストはいくつかのListItemsから構成されます。リストには番号を付けることも付けないこともできます。最初の引数としてtrueを渡すと、番号付きリストが作成されます。
リスト7.リスト・オブジェクトの作成
List l = new List(true, false, 10);
l.add(new ListItem("First item of list"));
l.add(new ListItem("Second item of list"));
section1.add(l);
|
chapter1オブジェクトにすべて追加しました。これ以上chapter1に追加する要素はないので、chapter1をメイン文書に追加します。また、ここで文書オブジェクトも閉じ、サンプル・アプリケーションを終わります。
リスト8.メイン文書への章の追加
document.add(chapter1);
document.close();
|
- サンプル・アプリケーションj-itextsample.jarをダウンロードします(「 ダウンロード 」を参照)。
- ディレクトリーにj-itextsample.jarを解凍します。たとえば、C:\tempに解凍した場合、ソース・ファイルとクラス・ファイルはC:\temp\com\itext\testに保存されます。
- コマンド・プロンプトを開き、ディレクトリーをC:\tempに変更します。
- このコマンド・プロンプトでシステムのclasspathを設定します。システムのclasspathにC:\temp\itext-1.3.jarを追加します。Windows ® では、コマンドset classpath=C:\temp\itext-1.3.jar;%classpath%を実行します。
- コマンドjava com.itext.test.ITextTestでアプリケーションを実行します。
プログラムはC:\にITextTest.pdf文書を作成します。PDF文書の2ページ目のスクリーン・ショットを次に示します。
図3. PDF文書のスクリーン・ショット
PDF生成の基本要素を説明しました。iTextのすばらしいところは、異なる種類のライターでも同じ要素の構文を使用できることです。また、ライターの出力はコンソール(XMLとHTMLライターの場合)、サーブレットの出力ストリーム(PDF文書のWeb要求への応答の場合)など、任意のOutputStreamにリダイレクトすることもできます。また、iTextは、応答は同じだが、応答の種類はPDF、RTF、HTML、またはXMLと異なる場合にも便利です。iTextを使うと、ウォーターマークの作成、文書の暗号化など、出力の細かい点を設定できます。
| 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|---|---|---|
| Sample code | os-javapdf-itextsample.jar | 3.2KB | HTTP |
学ぶために
-
iText
の詳細情報を入手してください。
-
「
Tutorial: iText by Example
」には、名前が示すように、チュートリアルとiTextの機能リストが用意されています。
-
プログラムと使い方に関する幅広い情報については、
Eclipse.org
を参照してください。
-
「
Getting started with the Eclipse Platform
」(developerWorks、2002年11月)には、Eclipseのインストール方法とプラグインについての詳細を含め、Eclipseの履歴と概要が示されています。
-
developerWorksの技術イベントやWebキャスト
の最新情報に注意してください。
-
オープンソース技術を使って開発し、IBMの製品と併用するときに役立つ広範囲のハウツー情報、ツール、およびプロジェクト・アップデートについては、developerWorksの
オープンソースゾーン
を参照してください。
製品や技術を入手するために
-
無料のLinux用SEK
を注文してください。これは、DB2
®
、Lotus
®
、Rational
®
、Tivoli
®
、およびWebSphere
®
からのLinux用最新IBMソフトウェアの試用版が入った2枚組DVDです。
-
IBMソフトウェアの試用版
を使い、次のオープンソース開発プロジェクトを革新してください。ダウンロードかDVDで入手できます。
議論するために
-
developerWorksブログ
に参加して、developerWorksコミュニティーの一員になってください。
Amit Tuliは、インドのGurgaonにある、IBM India Software Labs(ISL)のstaff software engineerです。現在は、ISLのSolutions GroupでのIBM Websphere Business Integrationに関する業務を行っています。様々なプラットフォーム上でのJavaや、サーバー側プログラミングで5年間の技術経験があり、またDB2 UDBやOracleを含むリレーショナル・データベース・システムに関する業務も行ってきました。IBM WebFountain SDKプロジェクトで、India Research Labでの業務にも携わったこともあります。専門領域は、スタンドアローンからn層までの分散アプリケーションの設計開発です。彼はHisarにある、Guru Jambheshwar Universityにて、コンピューター・サイエンスで修士号を取得しています。