微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – iText – 避免最后一行不要将页面分割到下一页

我正在使用 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);
        PdfWriter writer = PdfWriter.getInstance(document,new FileOutputStream("C:/SplitLastRow.pdf"));
        document.open();
        document.setPageSize(PageSize.LETTER);
        document.setMargins(16,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,row++);

            add(table,"Text Row 1 ",BaseColor.WHITE,"Text Row 2 ","Text Row 3 ",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);
}
}

解决方法

我必须执行这个例子来了解你的问题.通过谈论一个不是标题标题(“标题行正常”的行不是标题行!),并且您对setExtendLastRow()的引用也没有帮助(提到该方法不会)感觉到我,这很混乱).

这就是说,解决你的问题是没有脑子的.我重写了主类:

public static void main(String[] args) {
    try {
        Document document = new Document();
        document.setPageSize(PageSize.LETTER);
        document.setMargins(16,new FileOutputStream("SplitLastRow.pdf"));
        document.open();
        document.setPageSize(PageSize.LETTER);
        document.setMargins(16,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,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()方法.

原文地址:https://www.jb51.cc/java/123135.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐