iText Java用PDFライブラリ

itext-1.4.*.jarはこちらからダウンロードできます。 また日本語フォントを使うにはこちら からiTextAsian.jarもダウンロードします。 両方とも、JARファイルをCLASSPATHに通しておけばOKです。

PDFファイルの連結
iTextの機能をコマンドラインから使い、 複数のPDFファイルを連結して、ひとつのPDFファイルに出力してみます。

java -cp C:/usr/java/lib/itext-1.4.5.jar com.lowagie.tools.plugins.Concat a.pdf b.pdf new.pdf


Java APIの利用

それでは、itext-*.jarをJavaプログラムから利用して、PDF文書を作ってみます。 基本的な手順は

  1. Documentオブジェクトを作る
  2. 出力PDFファイル名を割り当てる
  3. フォントを作る
  4. 作者情報、文書情報などPDF文書のプロパティを設定する
  5. ヘッダ部・フッタ部を設定する
  6. doc.open()で文書を開く
  7. 本文(ParagraphやTable)を順番に追加する
  8. doc.close()で文書を閉じる
です。

Documentオブジェクトを作る

Document doc = new Document(PageSize.A4, 50, 50, 50, 50);

上記はA4縦のページを作ります。 A4横のページの場合は最初の引数を「PageSize.A4.rotate()」とします。 後ろの4つの引数は上下左右のマージンです。

Documentオブジェクトに出力PDFファイル名を設定する
以下のようにします。 面白いことに、PdfWriter.getInstanceが返すPdfWriterオブジェクトは必要が無ければ明示的に使う必要はありません。 doc.close()すると同時にファイルへの出力が完了します。
なお、以下の文を複数実行すると、同じ文書を2つ以上のファイルに出力したり、 ネットワーク越しに配信すると同時にローカルにもコピーを保存したり、ということができます。

PdfWriter.getInstance(doc, new FileOutputStream("output.pdf"));

作者情報、文書情報などPDF文書のプロパティを設定する

doc.addAuthor("テスト開発者");
doc.addSubject("テスト文書");

フォントの利用
フォントは主にファミリー(字体)のみを管理するBaseFontと、 サイズやスタイル(太字、イタリック等)を持たせるFontの2階層で管理されています。 まずBaseFontを作ります。

BaseFont bf;
// ゴシック
bf = BaseFont.createFont("HeiseiKakuGo-W5", "UniJIS-UCS2-H", BaseFont.NOT_EMBEDDED);
// 明朝
bf = BaseFont.createFont("HeiseiMin-W3", "UniJIS-UCS2-HW-H", BaseFont.NOT_EMBEDDED);
// その他のTrueTypeフォント。以下はMSゴシックの例
bf = BaseFont.createFont("c:\\winnt\\fonts\\msgothic.ttc,1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

次にそのBaseFontを使って、フォントを作ります。

Font f = new Font(bf, 14, Font.BOLD|Font.UNDERLINE);

2番目の引数は文字のサイズ、最後の引数はスタイルで、記号定数で指定します。 BOLD、ITALIC、BOLDITALIC、UNDERLINEの単独の記号定数があり、 「太字かつ下線」のような設定をするには上記のように論理和をとります。 スタイルを何も指定したくなければ、最後の引数がない同名のメソッドもあります。
また、フォントに色をつけるには以下のようにします。 このColorオブジェクトはjava.awt.Colorです。

f.setColor(new Color(255, 0, 0));

ヘッダとフッタの指定

HeaderFooter header = new HeaderFooter(new Phrase("ページの見出し", headerFont), false);
header.setAlignment(Element.ALIGN_CENTER);
header.setBorder(Rectangle.NO_BORDER);
doc.setHeader(header);

HeaderFooter footer = new HeaderFooter(new Phrase("--"), new Phrase("--"));
footer.setAlignment(Element.ALIGN_CENTER);
footer.setBorder(Rectangle.NO_BORDER);
doc.setFooter(footer);

ヘッダとフッタはともにHeaderFooterオブジェクトを作って指定します。 そのままだと、ヘッダ部やフッタ部を大きく囲む細い長方形の枠線が作られますが、 あまり格好よくありません。上記のようにNO_BORDERを設定して、 枠線を消す方が普通だと思います。

文章の追加
ここから本文を追加していきます。 単純な文を追加するには、Paragraphオブジェクトを使うのが便利です。

Paragraph para = new Paragraph("2006年9月実績", mainFont);
para.setAlignment(Element.ALIGN_LEFT);
doc.add(para);

文に色をつけるには、単に色のついたフォントを使えばOKです。 文を右寄せにするには、ALIGN_RIGHTを設定します。 また、前の文と間の空白を自分で設定したい場合は、

para.setLeading(30);
doc.add(para);

のように、自分をDocumentに追加する前にsetLeading()で指定します。 このほかにも、インデント(字下げ)の幅など余白を制御するさまざまなAPIメソッドがあります。

改ページ
決まった位置で強制改ページするには、そのまんまのnewPage()メソッドがあります。

doc.newPage();

表の追加
業務で使うには表の作り方は必修といえましょう。まずTableオブジェクトを作ります。

// 引数は列の数です。
Table t = new Table(4);
// 表のページに対する幅を百分率で指定します。
t.setWidth(100);
// 各列の幅を、全体が100となるように配列で指定します。
int columnWidths[] = {10,20,40,30};
t.setWidths(columnWidths);
// デフォルトの縦位置、横位置の設定
t.setDefaultHorizontalAlignment(Element.ALIGN_CENTER);
t.setDefaultVerticalAlignment(Element.ALIGN_MIDDLE);
// 余白とセル間の間隔を指定します。
t.setPadding(3);
t.setSpacing(0);
// 枠線の色です。
t.setBorderColor(new Color(0, 0, 0));

枠線で囲まれた各格子の中は、表計算ソフトと同じようにセルと呼ばれます。 後は単純に1個ずつ、左上から右へ、端まで来ると下へ、 という順番でCellオブジェクトを作ってはTable.addCell()で追加し、 最後にDocument.add()でTableオブジェクトを追加すればOKです。

Cell cell = new Cell(new Phrase("店舗名", headerFont));
cell.setGrayFill(0.8f);
t.addCell(cell);
cell = new Cell(new Phrase("所在地", headerFont));
cell.setGrayFill(0.8f);
t.addCell(cell);
// ...

上の例では見出し行を示すため、setGrayFill()でセルの背景色を灰色にしています。
数値などを印字するために右詰にするには以下のようにします。

Cell cell = new Cell(new Phrase("123,450", mainFont));
cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
t.addCell(cell);

複数の列を貫通させた大きなセルを作るには、 HTMLの用語と同様の類推からすぐ覚えられる、setColSpan() メソッドを使います。

Cell cell = new Cell(new Phrase("合計", mainFont));
cell.setColspan(3);
t.addCell(cell);

とすると、その位置から始まる3列分のセルを占有した大きなセルの中に、 「合計」という文字が印字されます。

線の太さを変えるには
テーブル全体(Table)、各セル(Cell)ともに、Rectangleの拡張クラスなので、Rectangleのメソッドが使えます。
上下左右の四方ともに同じ太さにするには、setBorderWidth()を使います。 それぞれ違う太さにするには、それぞれのメソッドを以下のように使います。

cell.setBorderWidthTop(0.5);
cell.setBorderWidthBottom(0.5);
cell.setBorderWidthLeft(1.0);
cell.setBorderWidthRight(1.0);

Java kowaza Top

(first uploaded 2006/09/23 last updated 2006/10/21, URANO398)

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル