« 2006年02月21日 | メイン | 2006年02月23日 »
2006年02月22日
iTextとXSL-FOのページ生成方法を比較する
iTextとXSL-FOの比較を続けてみます。
2.ドキュメントの用紙サイズとマージン設定
(1)iTextでは、次のようにドキュメント・コンストラクタで文書のページを指定します。
public Document(Rectangle pageSize,
int marginLeft,
int marginRight,
int marginTop,
int marginBottom);
ページサイズは、標準形式(A0-A10)など、あるいは寸法で指定します。標準はポートレイトですが、回転してランドスケープにすることができます。
マージンは省略すると36ポイントになります。
document.setMargins(180, 108, 72, 36);
のように直接指定もできます。
document.setMarginMirroring(true);
で左右対称マージンの指定ができます。
(2)XSL-FOではページは、fo:simple-page-masterで指定します。
fo:simple-page-masterはページの中に本文領域fo:region-bodyをもち、ここに文章が配置されます。マージンは、fo:simple-page-masterとfo:region-bodyの両方に属性として指定します。
図 fo:simple-page-master
マージンを変更するにはfo:simple-page-masterを別のものに切り替えます。左右ページのマージンを対称にするには、右ページ用のマージンを定義したfo:simple-page-masterと左ページ用のマージンを定義したfo:simple-page-masterを用意し、その出現順序を指定したfo:page-sequence-masterというものを定義して用紙マスターとして使います。
3.ページの生成
(1)iTextでは、ページに章、節、段落、表などのコンテンツをプログラムで出力していきます。内容がページの中で一杯になるとiTextが自動的に新しいページを生成します。
document.setPageSize();
でページの大きさを変えたり、
document.setMargins();
でページに対して、明示的にマージンを指定すると自動的に改ページされ新しいページができます。
また、document.newPage().
で強制的に新しいページを作り出すことができます。
この他、新しい章や節を作るときに改ページすることもできるようです。いずれにしても、プログラムの中で比較的直接的にページを作成したり改ページする制御を行います。
(2)XSL-FOでは、用紙マスターを定義するfo:layout-master-setのツリーとページの中に配置する内容オブジェクトfo:page-sequenceのツリーを用意して、各内容の枝に対して、それを流し込む用紙マスターを関連付けておきます。
XSL-FO組版エンジンは、fo:page-sequenceの内容オブジェクトをページの中に流し込むことでレイアウト済みのページを作り出します。
例えば、左右ページのマージンを対称にするには、左右ページ用のfo:simple-page-masterをもつfo:page-sequence-masterを用紙マスターとして使います。この用紙マスターに、内容オブジェクトを流し込んでいくと、生成されるページが奇数ページ、偶数ページかで用紙が切り替わります。これによって、左右マージンが対称になる、という仕組みです。
こうしてみますと、ページを作り出す仕組みは2つのソフトでまったく違っていることが分かります。iTextの方法は直感的・直接的ですが、複雑なページ・レイアウトやページ・シーケンスを内容オブジェクトと独立に定義していくのが難しいように思います。
投票をお願いいたします