どちらのクラスも、使い方は簡単です。単に、列の数を指定してテーブルを作成し、セルを加えるだけです。
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);
この PDF は次の HTML と同値です。<table border="1" width="80%" cellpadding="2">
<tr>
<td colspan="3">header with colspan 3</td>
</tr>
<tr>
<td>1.1</td>
<td>1.2</td>
<td>1.3</td>
</tr>
<tr>
<td>2.1</td>
<td>2.2</td>
<td>2.3</td>
</tr>
</table>
| header with colspan 3 | ||
| 1.1 | 1.2 | 1.3 |
| 2.1 | 2.2 | 2.3 |
Use a PdfPTable to add a table to a PDF document: see MyFirstTable.pdf
PdfPTable は強力で柔軟なオブジェクトであり、PdfPTable で提供されている機能をつかうというだけでなく、特別な要求にも対応します。JTable をもった Swingアプリケーションがある場合には、JTable2Pdf の節を見てください。PdfPTable は、PDFを作成するときだけ、動作します。HTML や RTF でテーブルを作成する必要があるときには、Table オブジェクト (すでにサポートされていません) を使う必要があります。
Changing the width and the alignment of the complete table: see TableWidthAligment.pdf
- ほかのコンストラクタを使う: PdfPTable(float[] relativeWidths). 例えば、3番目の列は、通常のカラムの倍にしたいときには、相対比として、float の配列 {1f, 1f, 2f} を指定します。iText は、その絶対幅を計算します。
- PdfPTable を構築したあとに、setWidths メソッドでこの配列を変更することもできます(注意:この配列の大きさは、列の数と同じでなければなりません)。例では、パーセンテージを (10%, 10%, 5%, 75%) から (20%, 20%, 10%, 50%) に変更しているので、2番目のテーブルの見た目は完全に変わっています。
- 列の幅を絶対幅で指定したいときには、iText がテーブルの幅の比をそのように計算するように指定しなければなりません。このような場合には、setWidthPercentage(float[] columnWidth, Rectangle pageSize) メソッドを使うべきです。例を見てわかるように、正しいページサイズを得るために、同じような計算をする必要があります。
- テーブル'全体の幅'をロックすれば、絶対幅をより簡単に指定できます。これをするためには、setTotalWidth と setLockedWidth メソッドが必要です。例では、セルの相対幅は、10%, 10%, 5%, 75% でので、二つの 30pt の列、15pt の列、225pt の列となります。
Changing the widths of columns: see CellWidths.pdf
既定が変更されていない場合は、テーブル同士は、改行が入らない、限り引っ付いています。これを避けたいときには、setSpacingBefore や setSpacingAfter メソッドを使うこともできます。
Defining the spacing between the table and other content: see TableSpacing.pdf
table.getDefaultCell().setGrayFill(0.8f); table.getDefaultCell().setBorderColor(new Color(255, 0, 0)); table.getDefaultCell().setColspan(2);
Using getDefaultCell to change the default style: see DefaultCell.pdf
前の例で、setColspan メソッドをセルの列スパンを変更するのに使いました。不幸なことに、PdfPTable のデザイン上、行スパンはサポートされていないので、回避法を使う必要があります。セルを異なる行に広げる代わりに、ほかのセルにネストしたテーブルを加えます。addCell(PdfPTable table) を使えばこれができます。
Using nested tables: see NestedTables.pdf
最後に、PdfPTable の 'addCell' には addCell(Image image) が残っています。セルに合うようにスケーリングされたイメージを加えるためにこれを使うことができます。PdfPCell(Image image) あるいは setColspanPdfPCell(Image image, boolean fit) で作成されたセルを加えることに似ていますが、例を見てわかるように、若干の違いがあります。
Adding an Image to a table: see ImageCell.pdf
External resources for this example: otsoe.jpg
既定では(nowrap = false)、セルの高さは動的に調整されます。セルの高さは、同じ行の'最も高い'セルと同じ高さとなります。iText は、この高さをコンテンツの行数、改行幅、セル境界などのパラメータを基準にして計算します。ある場合には、このようなことをiTextに制御させず、セルに固定した高さを設定したいこともあります。これは、setFixedHeight メソッドで実現できます。もちろん、コンテンツはセルにはフィットしていませんし、その一部を失うこともあります。
たぶん、やりたいことはそうではなく、たとえコンテンツと適合していなくても、セルの最低の高さを設定したいのでしょう。そのような場合は、setMinimumHeight を使わなければなりません。
最後に、setExtendLastRow という便利なメソッドがあります。これは、テーブルの最後の行をページの最下部まで広げます。
Playing with heights of PdfPCells: see CellHeights.pdf
- Element.ALIGN_LEFT
- Element.ALIGN_CENTER
- Element.ALIGN_RIGHT
- Element.ALIGN_JUSTIFIED
- Element.ALIGN_TOP
- Element.ALIGN_MIDDLE
- Element.ALIGN_BOTTOM
- Element.ALIGN_BASELINE
Changing the alignment of the contents of a PdfPCell: see CellAlignment.pdf
セル境界は、コンテンツと外部セル境界の間の間隔のことです。setPadding、setPaddingTop、setPaddingRight、setPaddingLeft
および
setPaddingBottom で、この空白の量を設定できます。
改行幅は、コンテンツの行の間隔のことです。この値は、setLeading(float, float)
で設定できます。
Changing the padding and the leading of the contents of a PdfPCell: see PaddingLeading.pdf
セル境界を設定する場合、境界幅はその量には含みませんが、setUseBorderPadding(true) によって、iText にセル境界を境界幅に含ませて計算させることもできます。次の例は、いくつかの色を設定したり、境界やセルを灰色で塗るメソッドのデモです。見てわかるように、緑色のセルのセル境界は、マゼンダ色の境界の幅には含まれていません。青色のセルで、'blue' という語は、シアン色の境界に重なっていません。境界とその色を変更したメソッドのすべては、Rectangle クラスのメソッドです。
Using some Rectangle methods on PdfPCell: see CellColors.pdf
最後は、setUseAscender と setUseDescender というセル内のコンテンツの位置にかかわるメソッドです。例は、この違いを典型的に表しています。
Demonstrates different borderstyles: see TableBorders.pdf
もしも、相当に大きなテーブルがあったら、ページに収まらないことが予想されます。iText は、テーブルを行間で自動的に分割します。テーブルにページごとに繰り返されるヘッダがあるならば、そのはじめの何行をヘッダとして数えるべきかを伝えなければな りません。これは、setHeaderRows メソッドによって行うことができます。例では、最初の一行がヘッダになっています。
A very big table added with document.add(): see AddBigTable.pdf
前の例では、すべての行はたった一行しかありません。もっとたくさんの行があるテーブルを扱うときには、既定では、テーブルは行の間で分割されるということを知っておかなければな
りません。そのため、ある行が現在のページに収まらないときには、その完全な行が次のページに送られ(SplitRowsBetween.pdf
参照)、その行が1ページに収まりきらないときだけ、行は二つに分割されます。
この振る舞いは、setSplitLate(false)
を使って変更できます。それを指定すると、行はその場で分割されるようになります。SplitRowsWithin.pdf
を見れば、どのページも最大限利用されていることがわかります。
もし、どうしても行を分割したくない場合は、setSplitRows(false)
を設定します。しかし、この場合は、大量のデータが失われることになります。(OmitRows.pdf
参照)
Add a table to a PDF with document.add() によって PDF にテーブルを追加し、セルが収まらないときには、行は二つに分割される: SplitRowsBetween.pdf SplitRowsWithin.pdf OmitRows.pdf