ダウンロードページにある「Current release」というところに、現在の最新版がまとめられています。ここには、iTextのソースコード、ビルドした完成品、ドキュメントのリンクがま とめてあります。すぐに使用するなら、完成したファイルをダウンロードしましょう。「Compiled code」という項目の右側にあるリンクをクリックしてダウンロードを行ってください。(2008年3月現在、「iText-2.0.8.jar」という ファイルが最新版となります)
これでライブラリは手に入りました。が、実をいえばもう1つ、ダウンロードしておくものがあります。それは「日本語フォント」です。これは、以下のサイトにて配布されています。
http://itextpdf.sourceforge.net/
このページの「Downloads」というところから「iTextAsian.jar」というリンクを探してください。これが、アジア関係の言語(日本語、韓国語、中国語)に関するiText用のフォントをまとめたライブラリファイルになります。
これで、「iText-2.0.8.jar」と「iTextAsian.jar」という2つのJARファイルがダウンロードできました。これらを、使用しているJDK/JREのCLASSPATHが通っている場所に配置すれば、すぐに使えるようになります。
PDFファイルの作成は、いくつかのクラスの組み合わせによって行われます。最低限、必要となるのは、以下のようなものです。
・PdfWriterクラス。PDFデータの書き出しを行うためのものです。
・OutputStreamクラス。PdfWriterでのデータの出力先として用意します。
・Documentクラス。PDFのドキュメントのクラス。ここに具体的な内容を記述していきます。
今回はファイルに保存をしますので、OutputStreamクラスとして、FileOutputStreamとBufferedOutputStreamを用意しておきます。では、全体の流れを追っておきましょう。
FileOutputStream out = null;
BufferedOutputStream bout = null;
PdfWriter writer = null;
Document doc = null;
まず、OutputStream関係とPdfWriter、描画用のDocumentのインスタンスを収める変数を用意しておきます。まぁ、これらは常にすべてこうした形で用意する必要はありませんが、ここではわかりやすくするために最初にすべて用意しておきました。
out = new FileOutputStream("test.pdf");
bout = new BufferedOutputStream(out);
では、OutputStream関係のインスタンスの準備から行いましょう。ここでは、保存するファイル名を指定してFileOutputStreamを作成し、これを使ってBufferedOutoutStreamを作成しておきます。
doc = new Document(new Rectangle(0,0,500,500));
続 いて、Documentインスタンスを作成します。これは、PDFドキュメントのオブジェクトです。このDocumentに、実際にPDFの表示内容を組 み込んでいくことになります。これは、引数なしでそのまま作成もできますが、Rectangleを使ってドキュメントの大きさを引数に指定することもでき ます。ここでは500×500の大きさでドキュメントを作成しています。
writer = PdfWriter.getInstance(doc, bout);
下 準備の最後の作業になります。PdfWriterインスタンスを作成します。これはnewは使えないため、getInstanceを呼び出してインスタン スを取得します。ここでは、あらかじめ用意しておいたPdfWriterとOuputStreamのインスタンスをそれぞれ引数に指定します。これによ り、第1引数で指定したDocumentの内容を第2引数のOutputStreamに出力するためのPdfWriterインスタンスが準備できます。
doc.open();
doc.close();
後 は、実際にドキュメントの作成を行うだけです。ドキュメントは、Documentの「open」を呼び出してドキュメントを開き、各種の描画などを行って 後、「close」でドキュメントを閉じて完了します。ここでは何もしていませんが、要は「openした後で、どうやってドキュメントの内容を書いていく か」がわかれば、PDFのドキュメントを作れるようになる、というわけです。
テキストを作成する
では、ドキュメントを書いてみましょう。まずは、基本中の基本である「テキスト」からです。これは、Documentの中に「Paragraph」というオブジェクトとして組み込んでいきます。
package jp.allabout;
import java.io.*;
import com.lowagie.text.*;
import com.lowagie.text.pdf.*;
public class SampleApp {
public static void main(String[] args){
FileOutputStream out = null;
BufferedOutputStream bout = null;
PdfWriter writer = null;
Document doc = null;
try {
out = new FileOutputStream("test.pdf");
bout = new BufferedOutputStream(out);
doc = new Document(new Rectangle(0,0,500,500));
writer = PdfWriter.getInstance(doc, bout);
doc.open();
Font kaku_24 = new Font(BaseFont.createFont(
"HeiseiKakuGo-W5","UniJIS-UCS2-H",
BaseFont.NOT_EMBEDDED),18);
kaku_24.setColor(CMYKColor.RED);
doc.add(new Paragraph("これは、サンプルです。", kaku_24));
Font mincho_12 = new Font(BaseFont.createFont(
"HeiseiMin-W3", "UniJIS-UCS2-HW-H",
BaseFont.NOT_EMBEDDED),12);
doc.add(new Paragraph("サンプルとして作成したPDFファイルです。", mincho_12));
doc.add(new Paragraph("果たして、きれいにできたでしょうか。", mincho_12));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
doc.close();
System.out.println("ended...");
}
}
}プログラムを実行すると、「test.pdf」というPDFファイルが作成されます。これを開いて
中身を見てみましょう(Adobe ReaderなどのPDFファイルを閲覧するソフトが必要ですので
それぞれで用意してください)。中には、赤いゴシック体と、黒い明朝体でテキストが3行
表示されます。
では、ソースをざっと見てみましょう。Documentをopenするところまでは前回と同じですね。
これ以降が、ドキュメントへのテキスト作成処理になります。テキストの作成には、
「フォント」と「パラグラフ」の2つの要素が必要となります。これらは、「Font」
「Paragraph」というクラスとして用意されています。ただし! 注意して欲しいのは、
「このFontクラスは、java.awt.Fontではない」という点です。
ここで使っているFontは、com.lowagie.text.Fontクラスです。要するに、iText用に
用意されているFontを使用するのですね。では、Fontインスタンスを作成しましょう。
Font kaku_24 = new Font(BaseFont.createFont("HeiseiKakuGo-W5","UniJIS-UCS2-H",
BaseFont.NOT_EMBEDDED),18);
ここでは、"HeiseiKakuGo-W5"というフォントを使用して、18ポイントの標準スタイル
のフォントを作成しています。Fontは、以下のような形でインスタンスを作成します。
new Font()
new Font( [BaseFont] )
new Font( [BaseFont],サイズ )
new Font( [BaseFont],サイズ,スタイル )
new Fontするにはさまざまな引数の指定の仕方があります。ここにいくつかあげましたが、
この他にもまだまだあるのです。ただし、実際の利用という点からすれば、「BaseFont」
というクラスのインスタンスを引数指定して作成するのが一般的でしょう。
BaseFont
は、文字通りベースとなるフォントです。ここでは日本語フォントを使用していますが、
このような場合にBaseFontのインスタンスとして日本語フォン
トを用意し、これを引数に指定してFontを作成するのが基本となります。このBaseFontは、
newではなくcreateFontメソッドを呼び出してインスタンスを作成します。
BaseFont.createFont( フォント名 , エンコーディング , embedded )
ここでは、第1引数に"HeiseiKakuGo-W5"、第2引数に"UniJIS-UCS2-H"という値を指定して
いますね。これが、日本語日本語各ゴシックフォントの基本設定となります。
また第3引数にはフォントをPDFに埋め込むかどうかを示す真偽値を指定します。
通常、これはfalseでよいでしょう。
これで、BaseFontインスタンスを作成し、それを利用してFontインスタンスを作成する、
というところまでできました。次は、フォントの色の設定を行いましょう。
kaku_24.setColor(CMYKColor.RED);
フォントの色は、そのままFontインスタンスの「setColor」で設定することができます。
ただし、注意したいのは、ここで設定するのはjava.awt.Colorインスタンスではない、
という点です。色についても、やはりiText専用のクラスを利用することになります。
これには、com.lowagie.text.pdf.CMYKColorというクラスを利用します。
このCMYKColorは、newCMYKColorとしてインスタンスを作成することもできますが、
主な色についてはクラスフィールドとしてあらかじめ用意されているのでそれらを
利用することもできます。ここでは、CMYKColor.REDをそのまま色に指定することに
しました。
doc.add(new Paragraph("これは、サンプルです。", kaku_24));
こうしてフォントのインスタンスが完成したら、次はこれを利用してパラグラフを
作成します。パラグラフは、文字通り「段落」のオブジェクトです。これは、
「Paragraph」クラスのインスタンスとして作成をします。
new Paragraph( [String], [Font])
このように、テキストと使用するフォントを引数に指定してインスタンスを
作成することで、そのフォントで指定したテキストを表示するパラグラフが
作成されます。
作成されたParagraphは、Documentの「add」メソッドでドキュメントに組み込みます。
このParagraphを作成してはaddする、ということを繰り返してドキュメントにテキスト
を作成していくのですね。
ることもできます。ここでは、CMYKColor.REDをそのまま色に指定することにしました。
doc.add(new Paragraph("これは、サンプルです。", kaku_24));
こうしてフォントのインスタンスが完成したら、次はこれを利用してパラグラフを
作成します。パラグラフは、文字通り「段落」のオブジェクトです。これは、
「Paragraph」クラスのインスタンスとして作成をします。
new Paragraph( [String], [Font])
このように、テキストと使用するフォントを引数に指定してインスタンスを作成することで、
そのフォントで指定したテキストを表示するパラグラフが作成されます。
作成されたParagraphは、Documentの「add」メソッドでドキュメントに組み込みます。
このParagraphを作成してはaddする、ということを繰り返してドキュメントにテキスト
を作成していくのですね。
グラフィックを作成する
今度は、グラフィックを作成してドキュメントに組み込んでみることにしましょう。実は、iTextでは「Graphics2D」を利用して直接図形を描画することができるのです。
package jp.allabout;
import java.awt.Graphics2D;
import java.io.*;
import com.lowagie.text.*;
import com.lowagie.text.pdf.*;
public class SampleApp {
public static void main(String[] args){
FileOutputStream out = null;
BufferedOutputStream bout = null;
PdfWriter writer = null;
Document doc = null;
try {
out = new FileOutputStream("test.pdf");
bout = new BufferedOutputStream(out);
doc = new Document(new Rectangle(0,0,500,500));
writer = PdfWriter.getInstance(doc, bout);
doc.open();
Font kaku_12 = new Font(BaseFont.createFont(
"HeiseiKakuGo-W5","UniJIS-UCS2-H",
BaseFont.NOT_EMBEDDED),12);
kaku_12.setColor(CMYKColor.RED);
doc.add(new Paragraph("※グラフィックのサンプル。", kaku_12));
// ※ここからグラフィック描画
PdfContentByte cb = writer.getDirectContent();
cb.saveState();
cb.concatCTM(1, 0, 0, 1, 50, 250);
Graphics2D g2 = cb.createGraphics(200, 150);
g2.setColor(java.awt.Color.LIGHT_GRAY);
g2.fillRect(0,0,200,150);
g2.setColor(java.awt.Color.BLUE);
g2.fillOval(50,50,100,50);
g2.dispose();
cb.restoreState();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
doc.close();
System.out.println("ended...");
}
}
}
ここでは、まず最初に「PdfContentByte」クラスのインスタンスを用意します。これは、ユーザによってテキストやグラフィックなどのコンテンツを作成する際に利用するものです。
PdfContentByte cb = writer.getDirectContent();
PdfWriterの「getDirectContent」メソッドを呼び出し、PdfContentByteインスタンスを取得します。それから「saveState」というメソッドを呼び出してグラフィック設定を保存しておきます。
cb.concatCTM(0, 0, 0, 0, 50, 250);
続いて行っているのは、コンテンツの領域設定です。ここで、ドキュメントの左下から右に50、上に250の地点に描画地点をトランスレートします。これで、この地点に描画のゼロ座標が設定されます。
Graphics2D g2 = cb.createGraphics(200, 150);
createGraphicsを使い、Graphics2Dインスタンスを作成します。これで、先のconcatCTMで指定した地点に200×150の大きさでインスタンスを作成できました。後は、このGraphics2Dを使って描画をするだけです。
g2.setColor(java.awt.Color.LIGHT_GRAY);
g2.fillRect(0,0,200,150);
g2.setColor(java.awt.Color.BLUE);
g2.fillOval(50,50,100,50);
g2.dispose();
こ のあたりは、普通の描画と同じですから説明は不要ですね。こうして描画メソッドを呼び出して描画をすれば、それが描かれていきます。面白いのは、通常は ビットマップで描かれる描画メソッドの図形ですが、ここではPDFのコマンドに変換されるため、ちゃんと拡大縮小してもジャギーのない図形として描かれる のですね。作成したGraphics2Dは、不要になった時点でdisposeしておきます。
cb.restoreState();
最後に、restoreStateでグラフィック設定をリストアして作業終了です。あとは、これまでと同様にドキュメントをcloseするだけです。
―― ざっと、PDFファイルへのテキストとグラフィックの描画について説明をしましたが、いかがでしたか。専用クラスがどっと出てきたので慣れないとかなりわ かりにくい印象でしょうが、それほど難しい操作はしていません。基本的な手順さえわかれば、比較的簡単に独自の文書を作成できることでしょう。Javaの プログラムからPDFを生成できれば、いろいろと応用ができそうですね。
没有评论:
发表评论