简体   繁体   English

iText-避免最后一行不剪切页面上的表并拆分到下一页

[英]iText - avoid last row not to cut tables on page split to next page

I am working on itext 5 using java. 我正在使用Java开发itext 5。 I have pages with mutiple tables with dynamic rows. 我的页面带有带有动态行的多个表。 In some instances, the table last row is splitted into next page with the folowing header. 在某些情况下,表格的最后一行与以下标题一起拆分为下一页。 I am using setHeaderRows() and setSkipFirstHeader() to manage continuation of next page. 我正在使用setHeaderRows()setSkipFirstHeader()来管理下一页的继续。 The last row has enough space to fit on earlier page. 最后一行具有足够的空间以适合较早的页面。 I would like to fit that last row in same page instead of next page. 我想将最后一行放在同一页而不是下一页中。

For example, on page 1, the last row is splitted into first row of next page. 例如,在第1页上,最后一行被拆分为下一页的第一行。 Instead I would like to fit that row in page 1 so save one extra page with all blanks. 取而代之的是,我想将页面1中的该行填满,因此多保留一页空白。

I tried using setExtendLastRow() , but its not working. 我尝试使用setExtendLastRow() ,但是它不起作用。 Does anyone know how to fix this problem. 有谁知道如何解决此问题。 I am attaching a working sample code. 我正在附上一个有效的示例代码。

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);
}
}

you can table.setKeepRowsTogather(true); 您可以table.setKeepRowsTogather(true);

table.setHeaderRows(1) as well alongwith it table.setHeaderRows(1)以及它

setKeepRowsTogather() checks if it can keep all the rows in page but splits the rows in case the table spans multiple pages. setKeepRowsTogather()检查它是否可以将所有行保留在页面中,但如果表跨越多个页面,则将行拆分。 In that case setHeaderRows(1) will put the header rows again in the next page. 在这种情况下, setHeaderRows(1)会将标题行再次放在下一页中。

I had to execute the example to understand your question. 我必须执行示例以了解您的问题。 You confused me by talking about a header that isn't a header (the rows with "Header Row normal" aren't header rows!) and your reference to setExtendLastRow() didn't help either (mentioning that method doesn't make sense to me; it's very confusing). 您通过谈论不是标题的标题而使我感到困惑(带有“ Header Row normal”的行不是标题行!),并且您对setExtendLastRow()引用也无济于事(提及该方法没有用对我来说很有意义;这非常令人困惑)。

This being said, the solution to your problem is a no-brainer. 话虽如此,您的问题的解决方案是轻而易举的。 I've rewritten the main class: 我已经重写了主要课程:

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();
    }
}

Make sure you define a total width instead of a width percentage , and lock the width. 确保定义总宽度而不是宽度百分比 ,然后锁定宽度。 As documented (and as common sense tells you), a PdfPTable object doesn't know its actual width if you define a width percentage. 如文档所述( 常识告诉您),如果您定义宽度百分比,则PdfPTable对象不知道其实际宽度。 It goes without saying that you can't calculate the height of a table that doesn't know it's actual width. 不用说,您无法计算不知道其实际宽度的桌子的高度。

Then use getVerticalPosition() method to get the current position of the cursor, and check if the first two rows fit on the page. 然后使用getVerticalPosition()方法获取光标的当前位置,并检查前两行是否适合页面。 If they don't go to a new page before adding the table. 如果他们没有在添加表格之前转到新页面。 If you want to check if the complete table fits, use the getTotalHeight() method instead of the getRowHeight() method. 如果要检查完整的表是否适合,请使用getTotalHeight()方法而不是getRowHeight()方法。

You can do 你可以做

table.setSplitRows(false);

But I believe that when there is a row that wont fit it just wont be shown. 但是我相信,当有行不适合时,就不会显示出来。 It's worth a shot though 虽然值得一试

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM