« 2006年02月23日 | メイン | 2006年02月25日 »

2006年02月24日

iTextとXSL-FOでのテキスト出力比較

一昨日に続いて、iTextとXSL-FOのオブジェクトの比較をしてみます。

4.テキストの出力
(1)iTextでテキストを出力するオブジェクト
・iTextでPDFにテキストを書き出すには、主にChunkオブジェクトまたはParagraphオブジェクトを使います。Chunkオブジェクトとは、すべてのテキスト・オブジェクトの原子であって、その内容はフォント名、フォントのサイズ、スタイル、色が同じ文字列です。

 Chunk単位で、アンダーラインを付けたり、文字の位置を上下に移動したり、バックグラウンド・カラーを付けたりの様々な処理ができます。
 Paragraphオブジェクトは段落に相当しますので、行間の空きや、段落単位でのフォントの指定ができます。

(2)XSL-FOでは、テキストを出力する時は、fo:inlinefo:blockなどのオブジェクトを使います。fo:inlineが、iTextのChunkオブジェクトに、fo:blockがiTextのParagraphオブジェクトに相当します。
XSL-FOではフォント名、フォントのサイズ、スタイルなどはfo:inlinefo:blockの属性として指定します。例えば次のようになります。

<fo:block text-align="center" font-size="15pt" font-weight="bold" background-color="black" color="white">Extension for Line Numbering</fo:block>

さて、iTextでできて、現在のXSL-FOの組版エンジンでできないのは、PageEventでしょう。
iTextのチュートリアルには次のような例が載っています。
public void onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text) {
if ("ellipse".equals(text)) {
.... }
else if ("box".equals(text)) {
... }
}

これは、渡される文字列の内容を見て処理を変更する例です。
また、w = c.getWidthPoint();という関数で文字列の幅を取得して、プログラムの中で計算する例も出ています。

このような組版対象オブジェクトのコンテンツの内容をみてダイナミックに処理を変更するプログラミングは現在のXSL-FOではできません。iTextの良いところは、XSL-FOでも積極的に取り入れて、将来の拡張を検討しなければならないと思います。

5.表の出力
次に表の出力を見てみます。
(1) iTextでの表は、PdfTabke、PdfCellオブジェクトを使って出力します。
チュートリアルの一番簡単な例を見ましょう。

PdfPTable table = new PdfPTable(3);
PdfPCell cell =
new PdfPCell(new Paragraph("header with colspan 3"));
cell.setColspan(3);
table.addCell(cell);
table.addCell("1.1");
table.addCell("2.1");
table.addCell("3.1");
table.addCell("1.2");
table.addCell("2.2");
table.addCell("3.2");
document.add(table);

としますと、次のような簡単な表ができます。
Simpletable.PNG

この方法はシンプルですが、例えば、複数のセルを行方向で結合するのは困難になります。行方向のセル結合は、テーブルの入れ子機能を使うようです。

(2)XSL-FOでの表は次のようになります。

<fo:table-and-caption>
<fo:table>
<fo:table-body>
<fo:table-row>
<fo:table-cell number-columns-spanned="3" border-style="solid" border-width="0.5mm" ><fo:block>header with colspan 3</fo:block></fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell border-style="solid" border-width="0.5mm" ><fo:block>1.1</fo:block></fo:table-cell>
<fo:table-cell border-style="solid" border-width="0.5mm" ><fo:block>2.1</fo:block></fo:table-cell>
<fo:table-cell border-style="solid" border-width="0.5mm" ><fo:block>3.1</fo:block></fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell border-style="solid" border-width="0.5mm" ><fo:block>1.2</fo:block></fo:table-cell>
<fo:table-cell border-style="solid" border-width="0.5mm" ><fo:block>2.2</fo:block></fo:table-cell><fo:table-cell border-style="solid" border-width="0.5mm" ><fo:block>3.2</fo:block></fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table></fo:table-and-caption>

XSL-FOの方はHTMLと同じように表全部を予め作っておくことになります。この作り方から見ますと、複雑なレイアウトの表をiTextで作るのは相当に難しいのではないかと予想します。

投票をお願いいたします

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