【问题标题】:Large table in table cell invoke page break表格单元格中的大表格调用分页符
【发布时间】:2015-04-14 17:23:32
【问题描述】:

我有一个带有单列的 PdfPTable。一页适合 50 行。如果我将一些文本数据添加到表中(例如,300 行),报告工作正常。当我将 PdfPTable 添加到单元格中时(例如,20 个字符串单元格、PdfPTable(其中包含 20 行或更少行)和 270 个字符串单元格),一切正常:

/--------
20 string rows
inner table (20 rows)
10 string rows
/-------
...additional rows

但是,当我的内表有更多行时(mainTable[20 个字符串行,innerTable[90 个字符串行],270 个字符串行],报告中断第一页,并在第二页开始 innerTable 输出。

/---------
20 string rows
whitespace for 30 rows
/---------
inner table (50 rows from 90)
/---------
inner table (40 rows from 90)
..additional data

我需要这个:

/---------
20 string rows
inner table (30 rows from 90)
/---------
inner table (50 rows from 90)
/---------
inner table (10 rows from 80)
..additional data

有人知道解决办法吗?

ps itext 版本 - 2.1.7

【问题讨论】:

  • iText 2.1.7 没有解决方案。该版本从 2009 年 7 月发布。我们不会在该版本上花费任何时间,因为我们知道在过去 5 到 6 年中修复了许多错误。另外:请阅读免费电子书The Best Questions on StackOverflow 中的法律部分,您就会明白为什么很少有人回答您的问题。
  • 嗯。伤心。顺便说一句,我尝试使用 IText 5.5 执行此代码,但结果是相同的。有什么解决办法吗?
  • 为了有人能够帮助你,首先必须了解问题。现在,问题是:我不明白setSplitLate(true)setSplitLate(false) 之间的区别。您应该播种一些代码和一些图像。现在,很难理解你想要达到的目标。如果人们必须花 15 分钟才能理解你的问题,他们可能没有额外的 15 分钟来回答它。 (至于我:你提到 iText 2.1.7 足以摧毁所有善意。)

标签: java itext


【解决方案1】:

请查看NestedTables2 示例。在此示例中,我们告诉 iText,只要一行不适合页面,就可以拆分单元格:

这不是默认设置:默认情况下,iText 将尝试通过将行转发到下一页来保持行的完整性。只有当行不适合页面时,才会拆分行。

更改默认值需要在代码中添加一行。该行称为:table.setSplitLate(false);

这是创建屏幕截图中显示的 PDF 的完整方法:

public void createPdf(String dest) throws IOException, DocumentException {
    Document document = new Document();
    PdfWriter.getInstance(document, new FileOutputStream(dest));
    document.open();
    PdfPTable table = new PdfPTable(2);
    table.setSplitLate(false);
    table.setWidths(new int[]{1, 15});
    for (int i = 1; i <= 20; i++) {
        table.addCell(String.valueOf(i));
        table.addCell("It is not smart to use iText 2.1.7!");
    }
    PdfPTable innertable = new PdfPTable(2);
    innertable.setWidths(new int[]{1, 15});
    for (int i = 0; i < 90; i++) {
        innertable.addCell(String.valueOf(i + 1));
        innertable.addCell("Upgrade if you're a professional developer!");
    }
    table.addCell("21");
    table.addCell(innertable);
    for (int i = 22; i <= 40; i++) {
        table.addCell(String.valueOf(i));
        table.addCell("It is not smart to use iText 2.1.7!");
    }
    document.add(table);
    document.close();
}

请注意,您不应使用 iText 2.1.7。如果这样做,您的雇主、客户、投资者可能会遇到问题。在免费电子书The Best iText Questions on StackOverflow的法律部分阅读更多相关信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多