【问题标题】:iText - avoid last row not to cut tables on page split to next pageiText - 避免最后一行不剪切页面上的表格拆分到下一页
【发布时间】:2013-05-18 01:37:53
【问题描述】:

我正在使用 java 开发 itext 5。我有带有动态行的多个表的页面。在某些情况下,表格的最后一行会被拆分为具有以下标题的下一页。我正在使用setHeaderRows()setSkipFirstHeader() 来管理下一页的继续。最后一行有足够的空间可以放在前面的页面上。我想把最后一行放在同一页而不是下一页。

例如,在第 1 页上,最后一行被拆分为下一页的第一行。相反,我想将该行放在第 1 页中,因此请保存一个额外的页面,其中包含所有空白。

我尝试使用setExtendLastRow(),但它不起作用。有谁知道如何解决这个问题。我附上了一个工作示例代码。

public class ProposalItextSplitLastRow {
 public static void main(String[] args) {
    try {
        Document document = new Document();
        document.setPageSize(PageSize.LETTER);
        document.setMargins(16, 14, 14, 14);
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C:/SplitLastRow.pdf"));
        document.open();
        document.setPageSize(PageSize.LETTER);
        document.setMargins(16, 14, 42, 38);

        for (int m = 1; m < 20; m++) {

            int row = 0;
            PdfPTable table = new PdfPTable(1);
            table.setSpacingAfter(0);
            table.setSpacingBefore(0);
            table.setWidthPercentage(100);

            table.setHeaderRows(1);
            table.setSkipFirstHeader(true);
            add(table, "Header Row continued " + m, BaseColor.LIGHT_GRAY, row++);
            add(table, "Header Row normal " + m, BaseColor.LIGHT_GRAY, row++);

            add(table, "Text Row 1 ", BaseColor.WHITE, row++);
            add(table, "Text Row 2 ", BaseColor.WHITE, row++);
            add(table, "Text Row 3 ", BaseColor.WHITE, row++);

            addPadding(table);

            document.add(table);
        }

        document.close();
    } catch (Exception de) {
        de.printStackTrace();
    }
}

private static void add(PdfPTable table, String text, BaseColor color, int row) {
    PdfPCell pdfCellHeader = new PdfPCell();
    pdfCellHeader.setBackgroundColor(color);
    pdfCellHeader.addElement(new Paragraph(new Phrase(text)));
    table.addCell(pdfCellHeader);
}

private static void addPadding(PdfPTable table) {
    PdfPCell cell = new PdfPCell();
    cell.setFixedHeight(2f);
    cell.setBorder(Rectangle.NO_BORDER);
    cell.setColspan(table.getNumberOfColumns());
    table.addCell(cell);
}
}

【问题讨论】:

    标签: java itext itextpdf


    【解决方案1】:

    你可以table.setKeepRowsTogather(true);

    table.setHeaderRows(1) 以及它

    setKeepRowsTogather() 检查它是否可以将所有行保留在页面中,但如果表跨越多个页面,则会拆分行。在这种情况下,setHeaderRows(1) 将再次将标题行放在下一页中。

    【讨论】:

    • 感谢您的帮助!它对我有用 table.setKeepRowsTogather(true);,但在我的 iText 版本(5.5.5)中,这个函数不存在:实际上它是 table.setKeepTogether(true);
    【解决方案2】:

    我必须执行该示例才能理解您的问题。您通过谈论不是标题的标题(带有“标题行正常”的行不是标题行!)而使我感到困惑,并且您对setExtendLastRow() 的引用也没有帮助(提到该方法并没有对我来说有道理;这很令人困惑)。

    话虽如此,您的问题的解决方案是不费吹灰之力的。我重写了主类:

    public static void main(String[] args) {
        try {
            Document document = new Document();
            document.setPageSize(PageSize.LETTER);
            document.setMargins(16, 14, 14, 14);
            PdfWriter writer = PdfWriter.getInstance(document,
                    new FileOutputStream("SplitLastRow.pdf"));
            document.open();
            document.setPageSize(PageSize.LETTER);
            document.setMargins(16, 14, 42, 38);
    
            for (int m = 1; m < 20; m++) {
    
                int row = 0;
                PdfPTable table = new PdfPTable(1);
                table.setSpacingAfter(0);
                table.setSpacingBefore(0);
                table.setTotalWidth(document.right() - document.left());
                table.setLockedWidth(true);
    
                table.setHeaderRows(1);
                table.setSkipFirstHeader(true);
                add(table, "Header Row continued " + m, BaseColor.LIGHT_GRAY, row++);
                add(table, "Header Row normal " + m, BaseColor.LIGHT_GRAY, row++);
    
                add(table, "Text Row 1 ", BaseColor.WHITE, row++);
                add(table, "Text Row 2 ", BaseColor.WHITE, row++);
                add(table, "Text Row 3 ", BaseColor.WHITE, row++);
    
                addPadding(table);
                if (writer.getVerticalPosition(true) - table.getRowHeight(0) - table.getRowHeight(1) < document.bottom()) {
                    document.newPage();
                }
                document.add(table);
            }
    
            document.close();
        } catch (Exception de) {
            de.printStackTrace();
        }
    }
    

    确保定义总宽度而不是宽度百分比,并锁定宽度。如文档所述(以及常识 告诉您),如果您定义宽度百分比,PdfPTable 对象不知道其实际宽度。不用说,不知道实际宽度的表格是无法计算高度的。

    然后使用getVerticalPosition() 方法获取光标的当前位置,并检查前两行是否适合页面。如果他们在添加表格之前没有转到新页面。如果要检查整个表格是否适合,请使用getTotalHeight() 方法而不是getRowHeight() 方法。

    【讨论】:

    • 效果很好 :) 非常感谢。非常感谢您的帮助。很抱歉混淆了我的问题。从过去的几周开始,我一直在为此苦苦挣扎。这解决了我的问题,即避免在stackoverflow.com/questions/16548001/… 上发布的页面拆分上的第一行剪切表。只是想知道为什么您的解决方案不适用于 table.setWidthPercentage()。
    • 您可能知道如何解决我的另一个问题,即不将最后一行拆分到下一页(而不是寡妇孤儿最后一行)。这就是我的代码所发生的事情。标题行正常 16 文本行 1 文本行 2 -----分页符---- 标题行继续 16 文本行 3 我正在寻找一种解决方案,没有分页符(拆分)并在第一页打印第 3 行, like Header Row normal 16 Text Row 1 Text Row 2 Text Row 3
    • 为什么我要回答发布到不被接受的答案的后续问题?另外:其他问题需要一个新问题。
    • 关于您的好奇心:常识足以理解为什么该解决方案不适用于宽度百分比,但如果不清楚,我已经调整了答案。如果您不希望最后一行成为孤立行,则需要扩展测试以使其覆盖更多行,而不仅仅是第 0 行和第 1 行。例如:您可以检查表格的总高度是否适合页面.如果不是,请检查总高度减去最后一行的高度是否合适。如果是这样,您的最后一行将是孤立的,您必须决定在哪里拆分表格。
    【解决方案3】:

    你可以的

    table.setSplitRows(false);
    

    但我相信,当有一行不适合时,它就不会显示出来。不过值得一试

    【讨论】:

    • 这个东西不能将表格全部放在一个页面上。
    猜你喜欢
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多