« 2006年02月20日 | メイン | 2006年02月22日 »

2006年02月21日

iText的なPDF生成

TheServerSideというJAVA専門のコミュニティ・サイト(英文)があります。ニュース、ブログ、討論、ホワイト・ペーパー、レビューなどからなるサイトですが、ここで、PDFを検索すると774件がヒットします。
iTextは45件
FOPは55件
FOPというのは、XSL-FOを使ってPDFを生成するJAVAのライブラリーで、Apacheのプロジェクトなので非常に有名な存在です。
※FOPはあまり出来の良いものではありませんのでお勧めしません。有名なだけです。

それにしても、JAVAの世界で、iTextがFOPに近いくらいポピュラーな存在だと初めて知りました。

ここを見ていましたら、FOは複雑なので、iTextを薦めるというような話、あるいは、XSL-FOはあまり普及していないというような意見がちらほらとあります。

XSL FO
例えば、struts とenterprise java beansで作ったWebアプリケーションからXSL-FOを使ってPDFをダイレクトに生成したいんだけど、誰か教えてくれる?

これに対して、FOPは複雑。スタイルシートを作るのに苦労するよ、というコメント。

iTextでやってうまくいったと報告。

というようなものです。これを見ると、iTextとXSL-FOというのはサーバサイドでPDFを生成する手段として競合しているようにも思えます。

私の見たところ、iTextのオブジェクトは原始的過ぎて、もし、iTextで高度なレイアウトを実現しようとすると生産性が低いのではないかと思います。簡単な帳票のようなものを出すだけでも、きちんとレイアウトすると結構大変じゃないかなと思うのですが。
でも、JAVAプログラマの人達には、XSL-FOというのは、却って複雑なんでしょうかねえ。某航空機メーカのように両方を組み合わせて使っているケースもあります。この場合は、XSL-FOでできないことをiTextで補足しているわけです。

いづれにしても両方を理解しないと、適材適所の判断は難しいでしょう。そこで、少し詳しく、iTextによるPDF生成とXSL-FOとを比較して見ようと思います。

1.PDFの生成手続き
(1) iTextでは、次のようになります。
ステップ1.ドキュメント・オブジェクトを生成
ステップ2.Writerオブジェクトを生成
ステップ3.ドキュメントをオープンする。
ステップ4.出力する内容を追加する。
ステップ5.ドキュメントをクローズする。メモリの内容がフラッシュされて出力ストリームにデータが書かれる。

(2) XSL-FOを使う場合の仕組みは、iTextとはかなり違っています。入力と出力を指定してXSL-FO組版エンジンを呼び出す形になります。入力はXMLとXSLスタイルシート、またはXSL-FOになります。

XMLとXSLスタイルシートが入力になった場合は、第一ステップでXSL-FO組版エンジンの中でXMLとXSLスタイルシートからXSL-FOが生成され、第二ステップでXSL-FOからPDFへの変換が行われることになります。

JAVAプログラマから見た時、iTextでは、PDFの内容をプログラマがiTextのオブジェクトとして手続き的に追加していきます。これに対して、XSL-FOの場合は、全てをXSL-FOのオブジェクトとして作成した上で入力しなければなりません。このためには、XSL-FOのオブジェクトの種類とそれがどのようにレイアウトされるかについての知識が必要です。XSL-FOのオブジェクトについて十分な知識が必要になる、と言う点がプログラマにとってはかなり高い障壁になっているように思います。この点、iTextは、今すぐにでもできそうで、プログラマにとっては参入障壁が低そうです。

投票をお願いいたします

投稿者 koba : 08:00 | コメント (1) | トラックバック