【问题标题】:How to prevent a page break between a paragraph and the following table如何防止段落和下表之间出现分页符
【发布时间】:2019-12-27 22:00:55
【问题描述】:

我是 iText 的新手,目前正在用 java 做一个小项目。

我想打印一个表格“标题”,然后是表格本身。发生的情况是,有时数据会导致表格标题出现在页面底部,而表格从下一页开始。

我想将表格标题和表格保持在一起,即如果在标题之后没有空间开始表格,则将两者移至下一页。

我目前正在通过创建一个段落对象来添加标题,然后在其后添加一个 PDFTable 对象。我在下面挖掘了一些示例代码,基本上代表了我目前正在做的事情:

// Add a table title
Paragraph tableTitle = new Paragraph();
tableTitle .setAlignment(1);
tableTitle .add("This is my table title");
tableTitle .setSpacingAfter(12);
try {
    document.add(tableTitle );
} catch (DocumentException e) {
    throw new ReportingException("Couldn't add section title", e);
}

// Now add the table
PDFTable currentTable = new PdfPTable(3);
// add the headers and data to the table etc...
:
:

任何指针将不胜感激。

谢谢

【问题讨论】:

    标签: java itext


    【解决方案1】:

    由于您是 iText 的新手,最好从 iText 7 开始,而不是从 iText 5 开始。我知道您使用的是 iText 5,因为我看到您使用的是PdfPTable

    iText 7 与以前的版本不兼容。 iText 5 从头开始​​重写,一劳永逸地解决了许多已知的技术问题。由于您是 iText 的新手,所以这对您来说并不重要:您没有任何需要从版本 5 迁移到 7 的旧代码。

    您可以通过阅读iText 7: Building Blocks 教程了解有关使用 iText 7 的更多信息。在Chapter 4 中,您将发现setKeepWithNext() 方法。在本教程中,该方法用于将章节标题保持在该章节第一段的同一页上:

    BufferedReader br = new BufferedReader(new FileReader(SRC));
    String line;
    Div div = new Div();
    while ((line = br.readLine()) != null) {
        document.add(new Paragraph(line)
            .setFont(bold).setFontSize(12)
            .setMarginBottom(0)
            .setKeepWithNext(true));
        div = new Div()
            .setFont(font).setFontSize(11)
            .setMarginBottom(18);
        while ((line = br.readLine()) != null) {
            div.add(
                new Paragraph(line)
                    .setMarginBottom(0)
                    .setFirstLineIndent(36)
            );
            if (line.isEmpty()) {
                document.add(div);
                break;
            }
        }
    }
    document.add(div);
    

    如果您坚持使用 iText 5,您可以使用一种变通方法,但这会使您的代码更加复杂。解决方法可能涉及使用ColumnText(但代码中的行数会显着增加),将表格标题添加为标题行(但如果表格分布在不同的页面上,则标题将重复),包装标题以及另一个对象中“保持在一起”的表(但这并不总是有效,具体取决于组合对象中存储了多少数据)。

    【讨论】:

      【解决方案2】:

      您必须创建章节,但不要将其直接添加到文档中。所以你可以控制分页符。见代码:

          document.add(chapter.getTitle());
          for(Element e : chapter) {
              document.add(e);
          }
      

      【讨论】:

        猜你喜欢
        • 2022-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-14
        相关资源
        最近更新 更多