当我尝试将iText表中的行保持在一起时,我得到了意外的结果。下面是一些独立的代码,它们使用我看到的结果创建PDF。

FileOutputStream out = new FileOutputStream(new File("table.pdf"));
Document document = new Document(new Rectangle(612, 242));
PdfWriter.getInstance(document, out);

document.open();

PdfPTable table = new PdfPTable(1);
table.setWidthPercentage(100);

for (int i = 0; i < 10; i++) {
    PdfPCell cell;
    if (i == 9) {
        cell = new PdfPCell(new Phrase("Two\nLines"));
    }
    else {
        cell = new PdfPCell(new Phrase(Integer.toString(i)));
    }
    table.addCell(cell);
}
table.keepRowsTogether(new int[] { 8, 9 });

document.add(table);
document.close();


该示例创建的表太小两个像素而无法容纳在第一页上,从而迫使最后一行进入下一页。但是,由于我使用keepRowsTogether添加了数组,因此我希望看到前八行保留在一页上,而后两行保留在下一页上,但是如示例所示,情况并非如此下图。而是将第七行(从零开始计数)也结转到下一页。



根据找到的API文档herekeepRowsTogether“定义哪些行不应允许分页符(如果可能)。”这向我表明,数组中未包含的第七行应允许分页。

没有人有任何想法,当第七行绝对适合第一页时,如何防止其移至下一页?

解决方案:与Bruno交谈后,我意识到我误解了keepRowsTogether的工作原理。对于上面的示例,我要做的就是将table.keepRowsTogether(new int[] { 8, 9 });更改为table.keepRowsTogether(9)

最佳答案

我认为keepRowsTogether()的含义存在误解。如果您使用:

table.keepRowsTogether(new int[] { 8, 9 });


您指示该表不会在第8或9行拆分。这与我看到的一致。

也许您想要这样的东西:split_at_row.pdf

使用SplitRowAtSpecificRow创建此PDF。代替keepRowsTogether(),它使用:

table.setBreakPoints(8);


这意味着iText将优先选择在第8行(从0开始计数)之后拆分表。您可以引入多个断点。例如:

table.setBreakPoints(4, 8, 12);

08-06 06:26