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()方法.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...