これらのオブジェクトは、与えられた四角形(あるいは、ユーザ定義の不定形)の中にコンテンツを加え、その四角形の右端に到達すると自動的に折り返されます(あるいは、その不定形に収まるようにフォーマットされます)。すべてのコンテンツが収まらないときには表示されませんが、コンテンツ自身は、カラムオブジェクトに残っているので、次のカラムに表示するようにもできます。
PdfContentByte cb = writer.getDirectContent(); ColumnText ct = new ColumnText(cb); ct.setSimpleColumn(phrase, 100, 300, 200, 500, 15, Element.ALIGN_CENTER); ct.go();setSimpleColumn(com.lowagie.text.Phrase, float, float, float, float, float, int) という特別なメソッドは、Phrase の中にあるコンテンツでのみ働きますが、ColumnText クラスには、インデントを指定するものなど、数多くのメソッドがあります。
Defining a simple single object ColumnText object: see column.pdf
テキストすべてをひとつのPhraseオブジェクトにまとめて加える必要はありません。setSimpleColumn(float, float, float, float, float) あるいは setSimpleColumn(float, float, float, float, float, int) で最初に四角形を定義し、addText(com.lowagie.text.Chunk) や addText(com.lowagie.text.Phrase) でテキストを加え、go() メソッドでカラムを表示することもできます。
PdfContentByte cb = writer.getDirectContent(); ColumnText ct = new ColumnText(cb); ct.setSimpleColumn(60, 300, 100, 500, 15, Element.ALIGN_CENTER); ct.addText(phrase1); ct.addText(phrase2); ct.addText(chunk); ct.go();
Adding phrases to a simple ColumnText object: see columnsimple.pdf
go() causes (partial or complete) content to be written to the document. If you first want to check if the content will fit the rectangle you defined, use go(true) instead of go(). This will simulate adding content. Check if NO_MORE_TEXT or NO_MORE_COLUMN is returned and decide if you actually want to add the column or if you want to change its size first.
The next example gives you a column to which all kinds of objects were added with method addElement(com.lowagie.text.Element).
もちろん、その四角形にテキストが収まらないならば、収まらない分だけテキストは失われます。たいていは、このテキストは、ほかのカラムに表示したいでしょう。これが、go()
メソッドの戻り値を参照する理由です。この戻り値に、'NO_MORE_COLUMN'
フラグがたっていたならば、カラムにテキストを収めるだけの余地がなかったことを表します。テキストをすべて表示できた場合には、'NO_MORE_TEXT'フラグがたちます。
go()
は、(部分的あるいは全体の)コンテンツを文書に書き込んでしまいます。書き込まれる前に、コンテンツが定義された四角形の中に収まるかを確かめたいときには、go()
の代わりに、go(true)
を使います。これは、コンテンツの追加をシミュレートして、NO_MORE_TEXT あるいは、NO_MORE_COLUMN
を返し、それによって、カラムに実際にテキストを加えることを判断したり、その四角形の大きさを変更したりできます。
次の例では、 addElement(com.lowagie.text.Element)メソッドで加えることができる、すべての種類のオブジェクトを示します。
次の例では、カラムに
addElement(com.lowagie.text.Element)
メソッドで追加するすべての種類のオブジェクトを示します。
Adding different objects to a simple ColumnText object: see columnobjects.pdf
External resources for this example: cover.png
ColumnText は、ユーザ定義の不定形にコンテンツを収めるためにも使うことができます。setColumns(float[], float[]) メソッドを使い、テキストの左あるいは右の境界を定義します。
float[] left = {70,790, 70,60};
float[] right = {300,790, 300,700, 240,700, 240,590, 300,590, 300,106, 270,60};
ct.setColumns(left, right);
左の境界は、直線 (x = 70) ですが、右の境界は、不規則です。Defining an irregular ColumnText object: see columnirregular.pdf
External resources for this example: caesar_coin.jpg
複数のカラムに自動的に加えたいようなときには、MultiColumnText クラスが使えます。これは、ColumnText のラッパークラスですが、多くの働きがあります。addRegularColumns(left, right, gutterWidth, numColumns) によって、ページあたりの カラム数 numColumns とその間隔 gutterWidth を定義します。最初のカラムは左側に left の余白が、最後のカラムは右側に right の余白があります。iTextに、複数ページにわたってカラムの配置を任せるなら、次のようにオブジェクトを作成します。
MultiColumnText mct = new MultiColumnText();そうでなければ、カラムの高さと Y 座標を指定し、さらにすべてのテキストが表示されたかどうかをチェックしなければならない。
Defining a simple MultiColumnText object: see multicolumnsimple.pdf
Defining a MultiColumnText object that adds its columns from right to left: see multicolumnR2L.pdf
MultiColumnText も、不定形カラムに使うことができます。ひとつあるいはそれ以上のカラムを addColumn(float[], float[]) で加えて、ColumnText.setColumns(float[], float[]) でその振る舞いを指定します。
Defining an irregular MultiColumnText object: see multicolumnirregular.pdf
MultiColumnText mct = new MultiColumnText(document.top() - document.bottom());パラメータは、カラムの最大高を定義します。このようにすると、カラムは自動的には次のページに配置されなくなります! 次のようなループが必要になります。
while (mct.hasMoreText()) {
document.add(mct);
mct.nextColumn();
document.newPage();
}