4

日付のイベントをリストする iText のテーブルを作成しています。1 つの日付に複数のイベントがある場合は、日付セルの rowspan プロパティをイベントの数に設定します。イベントの追加情報を表示し、すべてを整列させたいので、現在、各イベントに行を使用しています。基本的に、私のテーブルは次のようになります。

 Date   | Event     | Details
--------+-----------+---------------
 date 1 | event 1   | details 1
--------+-----------+---------------
 date 2 | event 2 1 | more 
        |           | details 2 1
        +-----------+---------------
        | event 2 2 | details 2 2
--------+-----------+---------------

を含むセルdate 2の行スパンは 2 です。

ColumnText.go()ループで使用してテーブルを追加します。

ドキュメントに表を書き込んで、 に十分なスペースしか残っていない場合event 2 1event 2 2は新しいページに移動します。追加する前に新しいページを強制するにはどうすればよいdate 2ですか?

を使用PdfPTable.setSplitLate(true)しても、複数行のセルには影響しないようです。date 2セルの固定高さを 2 つの行の高さを合わせたものに設定することもできません。

  • 1 つの解決策は、列 2 と 3 にネストされたテーブルを使用することです (列 2 と 3 を 1 つの列として扱います)。

  • 私が使用しているiTextのバージョンで正しく機能しない別の解決策はPdfPTable.writeSelectedRows()、ページに収まる(結合された)行のみを使用して書き込むことです。問題は、この方法では行スパンが無視され、Dateセルが 1 つの行だけにまたがるように見えることです。

他の方法はありますか?

4

2 に答える 2

2

行ごとにテーブルを作成し、PdfPTable.setKeepTogether(true)iText 2.1.7 でも機能するテーブルを使用できますが、そのバージョンにとどまることはお勧めしません。次に例を示しoutputFileます。ここで、 は PDF ファイルが作成されるファイル タイプ変数です。

Document document = new Document(new Rectangle(620, 150));
PdfWriter.getInstance(document, new FileOutputStream(outputFile));

document.open();

PdfPTable headerRow = new PdfPTable(3);
headerRow.setKeepTogether(true);
headerRow.addCell("Date");
headerRow.addCell("Event");
headerRow.addCell("Details");

PdfPTable firstRow = new PdfPTable(3);
firstRow.setKeepTogether(true);
firstRow.addCell("date 1");
firstRow.addCell("event 2 1");
firstRow.addCell("more\ndetails 2 1");

PdfPTable secondRow = new PdfPTable(3);
secondRow.setKeepTogether(true);
PdfPCell cell = new PdfPCell(new Phrase("date 2"));
cell.setRowspan(2);
secondRow.addCell(cell);
secondRow.addCell("event 2 1");
secondRow.addCell("more\ndetails 2 1");
secondRow.addCell("event 2 2");
secondRow.addCell("details 2 2");

document.add(headerRow);
document.add(firstRow);
document.add(secondRow);

document.close();

正直なところ、ネストされたテーブルの方が優れていると思います。

于 2016-02-16T22:19:06.493 に答える