« 2006年02月24日 | メイン | 2006年02月26日 »
2006年02月25日
iTextのPDF直接出力機能
いままで、iTextの高級オブジェクトをかい摘んで紹介しました。こういう高級オブジェクトを使うと、PDFについての知識を持っていなくても、PDF出力が簡単にできるというメリットがあります。
これに加えて、iTextの特長は、PDFの中に記述する命令を直接出力する機能があります。PDFの低レベルの命令を直接扱うだけに、この機能を使うには、PDF Referenceの第4章グラフィックス、第5章テキストあたりを最初に読む必要があります。
具体的には次のような命令です。
Part IV: Direct Content
5.iTextで直接扱えるPDF描画命令
・Graphics state オペレータ
・座標変換行列
・カラー
・クリッピング・パス
・形状の定義をするパス設定オペレータ
・パスの塗り潰しなどのオペレータ
・PDFのオブジェクトであるImageXObject、FormXObjectなど
※PostScriptXObjectの例もありますが、これは廃止予定があるとされているもので使うべきではありません。
・テキスト・オペレータでフォントのグリフ記述
・オプション・コンテンツ
XSL-FO組版エンジンは、これらのPDFの描画命令をユーザには通常開放していません。アンテナハウスのXSL Formatterの場合、これらのPDF描画命令は、PDF生成ライブラリーを使ってPDFに出力しています。
iTextでは、内部的に各ページを4つのレイヤに分けています。その内2つのレイヤは高級オブジェクト用でiTextのプログラム内部専用です。残りの2つにはgetDirectContent()、getDirectContentUnder()を使って直接出力できます。例えばウオーター・マークなどを出すのに使えます。
(このレイヤは、iTextのプログラム内部のレイヤで、PDF Referenceの「オプション内容グループ」(後述)とは別のものです。)
JAVAプログラマが直接PDFの描画命令を使うのは、あまり生産性が高いとは思えません。しかし、汎用ソフトのオブジェクト経由では実現できないことを行うために、プログラマに開放したレイヤがあるというのは便利な場合もあるように思います。
6.PDFのオプション内容グループ(Optional Content Group)
PDF 1.5(Acrobatのバージョンでは6)で、オプション内容グループ(Optional Content Groupという機能が追加になりました。この機能は、PDFの内容を多層化して作成しておき、各層を表示するかしないかを選択できます。
iTextでは、PdfLayerオブジェクトを使って、この機能を使ったPDF出力もできるようになっています。チュートリアルで幾つかサンプルが紹介されていますが、その中で一つだけ次に紹介します。
PdfLayerで出力する層を指定して、各レイヤに別の文字列を出力します。すると、このような3層のPDFが出来ます。
3層のPDFの例
Adobe ReaderのLayersタブで各レイヤを表示するかどうかを選択できます。
さて、このようにiTextの機能のあらましを紹介し、iTextのオブジェクトについては、XSL-FOと簡単に比較してみました。実際のところiTextはPDF出力専用の低レベルなJAVAライブラリーと言えます。その範囲で、PDF専用の機能についてはかなり強力な部分を持つ優れたライブラリーのようです。
しかし、XSL-FOのような高度な組版機能を提供するものではありません。サーバ上で作成しようとするレイアウトにもよりますが、Webページをさらに精密にするような高度なレイアウトであれば、XSL-FOの方が生産性が高くなると思います。
投票をお願いいたします