iText的 - 避免最后一排不削减页分解表下一页(iText - avoid last row n

2019-09-04 05:37发布

我在iText的5个使用Java。 我有一个多发的表与动态行的网页。 在某些情况下,该表最后一行被分裂成下一个页面与如下因素头。 我使用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);
}
}

Answer 1:

我不得不执行的例子来理解你的问题。 您可以通过谈论头不是头(带有“标题行正常”的不是头行!行)和您参考困惑我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()方法。



Answer 2:

你可以table.setKeepRowsTogather(true);

table.setHeaderRows(1)以及它地连同

setKeepRowsTogather()检查是否能保持在页面中的所有行,但在分割的情况下表跨越多个页的行。 在这种情况下setHeaderRows(1)将再次把标题行中的下一个页面。



Answer 3:

你可以做

table.setSplitRows(false);

但我相信,当有一排不会适应它只是不会显示。 这是值得一试,虽然



文章来源: iText - avoid last row not to cut tables on page split to next page