阻止 iText table 在新页面上拆分

Stop iText table from spliting on new page

我正在为 android 开发一个生成 pdf.

的应用程序

我正在使用 itextpdf 生成 pdf。

我有以下问题:

我有一个有 3 行的 table,当这个 table 接近页面末尾时,有时它会在一页上放一行,在下一页放两行。

有没有办法强制这个 table 从下一页开始,这样我就可以在下一页看到完整的 table?

谢谢

请看Splitting例子:

Paragraph p = new Paragraph("Test");
PdfPTable table = new PdfPTable(2);
for (int i = 1; i < 6; i++) {
    table.addCell("key " + i);
    table.addCell("value " + i);
}
for (int i = 0; i < 40; i++) {
    document.add(p);
}
document.add(table);

我们有一个包含 5 行的 table,在本例中,我们要添加一些段落,以便在页面末尾添加 table。

默认情况下,iText 将尽量不拆分行,但如果完整 table 不适合,它会将不适合的行转发到下一页:

您想避免这种行为:您不希望 table 拆分。

知道 iText 会尽量保持完整的行,您可以通过嵌套您不想拆分的 table 另一个 table:

来解决这个问题
PdfPTable nesting = new PdfPTable(1);
PdfPCell cell = new PdfPCell(table);
cell.setBorder(PdfPCell.NO_BORDER);
nesting.addCell(cell);
document.add(nesting);

现在你得到这个结果:

上一页的 space 足以渲染几行,但由于我们将完整的 table 包裹在一行中,只有一列,iText 将转发完整的table 翻到下一页。

作为 Bruno 将 table 嵌套在 1-cell table 中以防止分裂的方法的替代方法,您还可以使用 PdfPTable.setKeepTogether(true) 来启动 table当它不适合当前页面时在新页面上。

使用类似的例子:

Paragraph p = new Paragraph("Test");
PdfPTable table = new PdfPTable(2);
for (int i = 1; i < 6; i++) {
    table.addCell("key " + i);
    table.addCell("value " + i);
}
for (int i = 0; i < 40; i++) {
    document.add(p);
}
// Try to keep the table on 1 page
table.setKeepTogether(true);
document.add(table);

这两种方法(嵌套在 1 单元 table 中并使用 setKeepTogether())在我的测试中表现完全相同。这包括 table 太大而不适合新页面并且仍需要拆分的情况,例如在上面的示例中添加 50 行而不是 5 行时。