Java アプリから動的に PDF ファイルを生成する

PDF の作成を簡単にするオープンソース・ライブラリー iText の入門ガイド

アプリケーションで PDF 文書を動的に作成する必要がある場合、iText ライブラリーが必要です。オープンソースの iText ライブラリーを使用すると、PDF を簡単に作成することができます。この記事では iText を紹介するとともに、iText を使用して Java アプリケーションから PDF 文書を生成する方法について順を追って説明します。また、iText についての理解を深めるために、サンプル・アプリケーションを作成します。

2013年 11月 15日 ― 著者によって、更新されたサンプル・コードが、ダウンロード可能な JAR ファイルで提供されました (「ダウンロード」参照)。

Amit Tuli, Senior Integration Architect, IBM

Amit Tuli は IBM Global Business Services での IBM 認定のシニア IT アーキテクトです。彼は developerWorks で公開されている記事や IBM Redbooks などの執筆や、再利用可能なアセットの作成に活発に取り組んでいます。IBM に在籍している 12 年では、製品開発チームや IBM 研究所などに所属していた他、顧客の周辺業務を行うチームへの製品サービスの提供などに従事していました。彼はインドやその他の国々の著名な大手顧客を対象に最も複雑な変革に対する統合指向アーキテクチャー・ソリューションの提供を行いました。


developerWorks 貢献著者レベル

Surbhi Agarwal, Staff Software Engineer, IBM

Surbhi は IT 業界での経験が 7 年を超えました。彼女は、AIX 製品チームでの業務や、IBM の顧客の困難な統合プロジェクトでの業務、さらには IBM ミドルウェア製品に関連するソリューションの提供などの幅広い経験があるとともに、複雑な変革プログラムを始めから終わりまで通して行った素晴らしい経験があります。彼女が IBM のビジネス統合技術やデータベース技術に関して持つ使い専門知識は、IBM DB2、Oracle、solidDB、WebSphere MQ、WebSphere Message Broker、WebSphere Process Server、WebSphere Adapters、WebSphere Business Monitor、そして WebSphere Business Modeler にまで及びます。彼女は、IBM AIX の認定プロフェッショナルでもあります。



2013年 11月 14日 (初版 2006年 1月 24日)

PDF 文書を動的に生成することが要求されるアプリケーションは数多くあります。そうしたアプリケーションは、顧客の口座取引明細を e-メールで配信するために銀行が使用するアプリケーションから、書籍の特定の章を購入し PDF 形式で受け取るためにユーザーが使用するアプリケーションまで、数限りない種類に及びます。この記事では、iText Java ライブラリーを使用して PDF 文書を生成する方法を説明します。説明にはサンプル・アプリケーションを使用することで、読者の皆さんが自ら試して理解を深められるようにします。

iText 5.3.0 の概要

iText は http://itextpdf.com/ から無料で入手できる Java ライブラリーです (「参考文献」を参照)。この強力な iText ライブラリーは PDF を生成できることに加え、HTML、RTF、XML といった文書の生成もサポートしており、文書を生成する際には、さまざまなフォントを選んで使用することができます。また、iText は、同じ 1 つのコードで上記の各種文書を生成できる構造になっています。

iText ライブラリーには、PDF のテキストをさまざまなフォントで生成するためのクラスや、PDF 文書内で表を生成するためのクラス、ページにウォーターマークを追加するためのクラスなどが含まれています。iText ではこれ以外にもさらに多くの機能を利用することができます。1 本の記事の中ですべての機能を紹介することはできないため、ここでは PDF の生成に必要な基本機能のみを取り上げます。さらに詳しい情報については、iText が提供するドキュメントを参照してください。

この記事ではサンプル・アプリケーションの開発には Eclipse を使用します。オープンソースの IDE (Integrated Development Environment: 統合開発環境) である Eclipse は無料で入手することができ、極めて強力です。Eclipse は今すぐダウンロードすることができます (「参考文献」を参照)。

iText API: 詳細

com.itextpdf.text.Document は PDF 文書生成用のメイン・クラスであり、最初にインスタンス化されるクラスです。一旦文書が作成されたら、その文書に書き込むにはライターが必要になります。そのための PDF ライターとなるのが com.itextpdf.text.pdf.PdfWriter クラスです。この他によく使用するクラスを以下に示します。

  • com.itextpdf.text.Paragraph ― このクラスはインデントされた段落を表します。
  • com.itextpdf.text.Chapter ― このクラスは PDF 文書の章を表します。章の作成では、タイトルとして Paragraph を使用し、章番号として int を使用します。
  • com.itextpdf.text.Font ― このクラスにはフォントの種類、サイズ、スタイル、色など、フォントの仕様がすべて含まれています。さまざまなフォントがこのクラスの静的定数として宣言されています。
  • com.itextpdf.text.List ― このクラスはリストを表します。リストには、いくつもの ListItems が含まれます。
  • com.itextpdf.text.pdf.PDFPTable ― このクラスは表を表します。表は、絶対位置を指定して配置することも、Table クラスとして文書に追加することもできます。
  • com.itextpdf.text.Anchor ― このクラスは参照を表すことも、参照先を表すこともできます。

Eclipse で iText をダウンロードして構成する

iText は Pure Java ライブラリーであるため、JAR ファイルの形式をしています (「参考文献」を参照)。このライブラリーを (例えば、C:\temp パスに) ダウンロードした後、以下の手順を実行すると、Eclipse 環境に iText ライブラリーが構成されます。

  1. Eclipse に「iText」という新規 Java プロジェクトを作成します。
  2. 「Package Explorer (パッケージ・エクスプローラー)」ビューで「iText」プロジェクトを右クリックし、「Properties (プロパティー)」を選択します。
  3. Java Build Path (Java のビルド・パス)」をクリックします。「Libraries (ライブラリー)」タブで、「Add External JARs (外部 Jar 追加)」をクリックします。
  4. C:\temp ディレクトリーを参照し、このディレクトリーの「itext-1.3.jar」を選択します。
  5. OK」をクリックします。

これで iText が構成されたので、動的に PDF 文書を生成する Java アプリケーションを Eclipse で作成する準備が整いました。


サンプル・アプリケーション

正しく動作するサンプルを自分の手で作成すること以上に、技術の理解に役立つことはありません。必要なツール (Eclipse IDE) とライブラリー (iText ライブラリー) は用意できたので、サンプル・プログラムの設計および開発をするための準備が整いました。

プレーン・テキスト、デフォルト以外のフォントが指定された色付きテキスト、表、リスト、章、節などの基本要素が含まれた簡単な PDF 文書を作成してみましょう。このアプリケーションの目的は、iText ライブラリーの使い方を理解することです。PDF 文書の生成に関連したさまざまな作業を行うクラスはたくさんありますが、これらのクラスをすべて取り上げることはできません。これらのクラスの使い方については、iText の JavaDoc が情報源として優れています。では、コーディングを始めましょう。

最初のステップでは文書を作成します。文書は、PDF 文書のすべての要素のコンテナーです。

リスト1. 文書オブジェクトのインスタンス化
Document document = new Document(PageSize.A4, 50, 50, 50, 50);

この文の 1 番目の引数はページ・サイズを指定します。2 番目以降の引数はそれぞれ左、右、上、下のマージンを示します。この文書のタイプはまだ定義されていません。文書のタイプは作成するライターのタイプによって異なります。このサンプルでは、com.itextpdf.text.pdf.PdfWriter を選択します。その他のライターとしては、HtmlWriter、RtfWriter、XmlWriter などがあります。その用途は、それぞれの名前から明らかです。

リスト2. PdfWriter オブジェクトの作成
PdfWriter writer = PdfWriter.getInstance(document, \

new FileOutputStream("C:\\ITextTest.pdf"));

document.open();

最初の文の 1 番目の引数は文書オブジェクトへの参照です。2 番目の引数は出力を書き込む先となるファイル名を絶対パスで指定した新規ファイル出力ストリーム・オブジェクトです。次の文で、書き込みを行うために文書を開きます。

ここで、文書の最初のページにテキストを追加します。テキストは、com.itextpdf.text.Paragraph を使用して追加します。テキストとともにデフォルトのフォントの種類、色、サイズなどが指定された、デフォルトの段落を作成することができます。あるいは、独自のフォントを指定することもできます。この記事では、PDF 文書にアンカー (リンク) を設定する方法を説明します。この PDF ではリンクとして、BackToTop を使用しました。BackToTop リンクをクリックすると、文書の先頭ページにジャンプします。そのためには、アンカーの対象となるテキストを先頭ページに設定する必要があります。それでは、アンカーの対象を設定し、段落を追加してフォントを設定する方法を見てみましょう。

リスト3. 段落オブジェクトの作成
Anchor anchorTarget = new Anchor("First page of the document.");
      anchorTarget.setName("BackToTop");
      Paragraph paragraph1 = new Paragraph();

      paragraph1.setSpacingBefore(50);

      paragraph1.add(anchorTarget);
      document.add(paragraph1);

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 CMYKColor(0, 255, 0, 0))));

図 1リスト 3 のコードのサンプル出力を示します。文書を閉じるために、リスト 3 のコードの最後には document.close(); を追加します。

図1. リスト 3 のコードのサンプル出力
図1. リスト 3 のコードのサンプル出力

ここまででプレーン・テキストを PDF 文書に追加する方法を説明しましたが、次は複雑な要素を文書に追加する必要があります。まず、新しい章を作成するところから始めましょう。章は、新しいページで始まり、デフォルトで番号が表示される特殊な節です。

リスト4. 章オブジェクトの作成
Paragraph title1 = new Paragraph("Chapter 1", 

   FontFactory.getFont(FontFactory.HELVETICA, 
   
   18, Font.BOLDITALIC, new CMYKColor(0, 255, 255,17)));
   
Chapter chapter1 = new Chapter(title1, 1);
      
chapter1.setNumberDepth(0);

リスト 4 のコードで、「chapter 1」というタイトルの新しい章オブジェクト chapter1 を作成しました。番号の深さを「0」に設定すると、章番号はページに表示されません。

節は章のサブ要素です。リスト 5 のコードでは、「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 CMYKColor(0, 255, 255,17)));
   
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);

表を追加する前に、文書がどのような表示になっているかを見てみましょう。document.add(chapter1); および document.close(); という 2 行のコードを追加して文書を閉じ、プログラムをコンパイルして実行すると、以下の PDF 文書が生成されます。

図2. 章のサンプル出力
図2. 章のサンプル出力

次に表オブジェクトを作成します。表には、行と列のマトリックスが含まれます。1 行の中に含まれる 1 つのセルが複数の列にまたがることができます。同様に、1 列の中に含まれる 1 つのセルが複数の行にまたがることもできます。

リスト6. 表オブジェクトの作成
PdfPTable t = new PdfPTable(3);

      t.setSpacingBefore(25);
      
      t.setSpacingAfter(25);
      
      PdfPCell c1 = new PdfPCell(new Phrase("Header1"));  
      
      t.addCell(c1);
      
      PdfPCell c2 = new PdfPCell(new Phrase("Header2"));
      
      t.addCell(c2);
      
      PdfPCell c3 = new PdfPCell(new Phrase("Header3"));
      
      t.addCell(c3);
      
      t.addCell("1.1");
      
      t.addCell("1.2");
      
      t.addCell("1.3");
      
      section1.add(t);

リスト 6 のコードでは、3 つの列を持つ PdfpTable オブジェクト t を作成し、行を追加していきます。次にそれぞれに異なるテキストを指定して 3 つの PdfpCell オブジェクトを作成し、表に追加していきます。これらのオブジェクトはいずれも 1 行目に追加され、最初は 1 列目に、続いて同じ行の次の列にといった順で追加されます。行の最後までセルが埋まった場合には、次の行の 1 列目に次のセルが追加されます。t.addCell("1.1"); のように、セルをテキストで指定して表に追加することもできます。最後に表オブジェクトを節オブジェクトに追加します。

最後に、PDF 文書にリストを追加する方法を調べましょう。リストには、いくつもの ListItems が含まれます。リストには番号を付けることも、付けないこともできます。1 番目の引数として 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 オブジェクトにはすべてを追加したので、今度はこの Java プロジェクトに画像を追加します。画像を拡大/縮小するには以下に示す Image クラスのメソッドを使用することができます。

  • scaleAbsolute()
  • scaleAbsoluteWidth()
  • scaleAbsoluteHeight()
  • scalePercentage()
  • scaleToFit()

リスト 8 では scaleAbsolute を使用し、その画像オブジェクトを節に追加しました。

リスト8. 節への画像の追加
Image image2 = Image.getInstance("IBMLogo.bmp");

      image2.scaleAbsolute(120f, 120f);
      
      section1.add(image2);

iText の com.itextpdf.text.Anchor クラスは、文書外部の Web サイトへのリンクか、文書内部へのリンクを表します。アンカー (リンク) は、まさに Web ページ内のリンクのようにクリックすることができます。アンカーを追加するには、新規アンカーを作成し、リスト 3 で作成したアンカーの対象への参照を設定する必要があります。そして、そのアンカーを節に追加し、さらにその節を章に追加します。

リスト 9. 節へのアンカーの追加
Paragraph title2 = new Paragraph("Using Anchor", 

        FontFactory.getFont(FontFactory.HELVETICA, 16, Font.BOLD, 

        new CMYKColor(0, 255, 0, 0)));

section1.add(title2);

title2.setSpacingBefore(5000);

Anchor anchor2 = new Anchor("Back To Top");

anchor2.setReference("#BackToTop");

section1.add(anchor2);

chapter1 にはこれ以上追加する要素はないので、chapter1 をメインの document に追加します。また、これでサンプル・アプリケーションの作成は完了するので、文書を閉じます。

リスト 10. メイン文書への章の追加
document.add(chapter1);

document.close();

サンプル・アプリケーションを実行する

  1. サンプル・アプリケーション os-javapdf-itextsample.jar をダウンロードします (「ダウンロード」を参照)。
  2. 任意のディレクトリーに os-javapdf-itextsample.jar を解凍します。例えば、C:\temp に解凍した場合、ソース・ファイルとクラス・ファイルが C:\temp\com\itext\test に配置されます。
  3. コマンド・プロンプトを開き、カレント・ディレクトリーを C:\temp に変更します。
  4. このコマンド・プロンプトでシステムのクラスパスを設定します。システムのクラスパスには C:\temp\itext-5.3.0.jar を含めます。Windows では、コマンド set classpath=C:\temp\itext-5.3.0.jar;%classpath% を実行します。
  5. コマンド java com.itext.test.ITextTest でアプリケーションを実行します。

プログラムでは C:\ に ITextTest.pdf 文書を作成します。図 3 に PDF 文書の先頭ページのスクリーン・キャプチャーを示します。

図3. PDF 文書のスクリーン・キャプチャー
図3. PDF 文書のスクリーン・キャプチャー

図 4 に PDF 文書の「Chapter 1」という章とその節、テキスト、表、リスト、そして画像のスクリーン・キャプチャーを示します。

図 4. PDF 文書のスクリーン・キャプチャー
PDF 文書のスクリーン・キャプチャー

図 5 に PDF 文書のアンカー・リンクのスクリーン・キャプチャーを示します。

図 5. PDF 文書のスクリーン・キャプチャー
PDF 文書のスクリーン・キャプチャー

まとめ

この記事では、PDF を生成するための基本要素について説明しました。iText の素晴らしいところは、異なるタイプのライターでも同じ要素の構文を使用できることです。また、ライターの出力はコンソール (XML ライターと HTML ライターの場合)、サーブレットの出力ストリーム (PDF 文書の Web リクエストに対するレスポンスの場合)、あるいは任意の OutputStream などへとリダイレクトすることもできます。また、iText は、レスポンスは同じだが、レスポンスのタイプが PDF、RTF、HTML、または XML と異なる場合にも便利です。iText を使用すると、ウォーターマークの作成、文書の暗号化など、出力の細かい点を設定することができます。


ダウンロード

内容ファイル名サイズ
Sample code, updatedos-javapdf-itextsample.jar14KB

参考文献

学ぶために

  • iText の詳細情報を入手してください。
  • Tutorial: iText by Example」には、名前が示すように、チュートリアルと iText の機能リストが用意されています。
  • Eclipse のプログラムと使用方法に関する包括的な情報は、Eclipse.org を参照してください。
  • Eclipse Platform 入門」(developerWorks、2002年11月)には、Eclipse およびプラグインのインストール方法についての詳細を含む、Eclipse の歴史と概要が示されています。
  • developerWorks のテクニカル・イベントや Webcast で最新情報を入手してください。
  • オープンソース技術を使って開発し、IBM の製品と併用するときに役立つ広範囲のハウツー情報、ツール、およびプロジェクト・アップデートについては、developerWorks の Open source ゾーンを参照してください。
  • IBM オープンソース開発者を対象とした近日開催予定の世界中のカンファレンス、展示会、Webcast、その他のイベントを調べてください。
  • Twitter で developerWorks をフォローしてください。

製品や技術を入手するために

  • Eclipse での開発に関心がある方は、Eclipse の技術をベースに構築された商用開発ツールである IBM の Rational Application Developer Standard Edition の試用版を調べてください。
  • IBM 試用版ソフトウェアのサイトにアクセスし (試用版ソフトウェアはダウンロードまたは DVD で入手することができます)、開発者専用に用意されたソフトウェアを使用して皆さんの次のオープンソース開発プロジェクトを革新してください。

議論するために

  • 他の developerWorks ユーザーとのつながりを持つと同時に、開発者によるブログ、フォーラム、グループ、ウィキを調べてください。developerWorks コミュニティーで、Real world open source グループの構築を手伝ってください。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source, Java technology
ArticleID=236866
ArticleTitle=Java アプリから動的に PDF ファイルを生成する
publish-date=11142013