【问题标题】:iText - how to find last row is split into next pageiText - 如何找到最后一行被拆分到下一页
【发布时间】:2013-05-31 20:44:19
【问题描述】:

我有一组带有动态行的表。在某些情况下,表会在页面之间拆分。在某些情况下,只有最后一行被拆分到下一页。假设一个表格有 10 行,第 1 到第 9 行显示在第 1 页,第 10 行显示在第 2 页。

我正在寻找一种解决方案,以便在这种情况下发生分页符 (document.newpage()) 以将整个表格移动到下一页。我尝试了下面的代码,它适用于某些场景,但并非适用于所有场景。我想知道表格最后一行何时拆分,以便我可以添加分页符将整个表格移动到下一页以避免最后一行孤立。

public class SplitItextLastRow {

final static private String BODY_FONT = FontFactory.getFont("Arial").getFamilyname();

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:/SplitItext.pdf"));
        document.open();
        document.setPageSize(PageSize.LETTER);
        document.setMargins(16, 14, 14, 14);

        int[] maxCountRows = new int[] { 3, 9, 2, 3, 7, 9, 2, 4, 5, 4, 9, 7, 6, 5, 4, 6, 8, 3 };

        for (int k = 1; k <= maxCountRows.length; k++) {

            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);
            addHeader(table, "Header Row continued " + k, BaseColor.LIGHT_GRAY);
            addHeader(table, "Header Row normal " + k, BaseColor.LIGHT_GRAY);

            for (int i = 1; i < maxCountRows[k - 1]; i++) {
                StringBuilder sb = new StringBuilder();
                for (int p = 0; p < maxCountRows[k - 1] * 6; p++) {
                    sb.append("Text Row ");
                }
                add(table, sb.toString() + i, BaseColor.WHITE);
            }

            float verticalPosition = writer.getVerticalPosition(true);
            System.out.println("------Table " + k);
            if ((verticalPosition - table.getTotalHeight()) <= document.bottom()) {
                System.out.println("........................................Last Row splitted");
            }

            document.add(table);
        }

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

}

private static void addHeader(PdfPTable table, String text, BaseColor color) {
    PdfPCell pdfCellHeader = new PdfPCell();
    pdfCellHeader.setBackgroundColor(color);
    pdfCellHeader.addElement(new Paragraph(new Phrase(text, FontFactory.getFont(BODY_FONT, 8f, BaseColor.BLUE))));
    table.addCell(pdfCellHeader);
}

private static void add(PdfPTable table, String text, BaseColor color) {
    PdfPCell pdfCellHeader = new PdfPCell();
    pdfCellHeader.setBackgroundColor(color);
    pdfCellHeader.addElement(new Paragraph(new Phrase(text, FontFactory.getFont(BODY_FONT, 5f, BaseColor.GREEN))));
    table.addCell(pdfCellHeader);
}

}

【问题讨论】:

  • 您是否尝试将完整的表添加到另一个具有单列和单行的表中?这应该会给你你想要的结果......

标签: java itext itextpdf


【解决方案1】:

是的,它的工作原理如下:

在循环的开头for (int k = 1; ... 你必须添加:

PdfPTable outerTable = new PdfPTable(1);
outerTable.setSpacingAfter(0);
outerTable.setSpacingBefore(0);
outerTable.setTotalWidth(document.right() - document.left());
outerTable.setLockedWidth(true);

最后,您将document.add(table); 替换为:

outerTable.addCell(new PdfPCell(table));
document.add(outerTable);

就是这样... :-)
然后,您应该删除调试输出,并且可以删除“继续”标题及其对应的 table.setSkipFirstHeader(true);。你有table.setHeaderRows(1);就够了。

有点懒惰,因为您的原始表格也只有一列,您可以在初始化 table 的宽度和间距后,使用 PdfPTable outerTable = new PdfPTable(table); 创建您的 outerTable。但是您必须先创建它,然后再将您的内容添加到您的 table

【讨论】:

  • 感谢您的帮助。我会试试这个解决方案
【解决方案2】:

我尝试了 Johannes 的解决方案,但没有成功,我不知道为什么。无论如何,我找到了自己的解决方案。我用一些随机场景对其进行了测试,它确实有效。我找到的解决方案是在将表格添加到带有document.add(table)的文档之前将代码放在下面。

int headerRowsCount = table.getHeaderRows();
float headerRowsHeight = 0f;
for (int j = 0; j < headerRowsCount; j++) {
    headerRowsHeight += table.getRowHeight(j);
}
float totalTableHeight = table.getTotalHeight() - headerRowsHeight;
float lastRowHeight = table.getRowHeight(table.getRows().size() - 1);
float tableHeightExceptLastRow = totalTableHeight - lastRowHeight + document.bottom();
float tableGap = verticalPosition - tableHeightExceptLastRow;
boolean lastRowSplit = (tableGap > -35 && (tableGap < lastRowHeight) && tableHeightExceptLastRow > 0);
if (lastRowSplit) {
    document.newPage();
}

【讨论】:

    【解决方案3】:

    这是here 解释的完整工作示例...我使用了 iText 2.1.7。

    import java.awt.Color;
    import java.io.FileOutputStream;
    
    import com.lowagie.text.Document;
    import com.lowagie.text.FontFactory;
    import com.lowagie.text.PageSize;
    import com.lowagie.text.Paragraph;
    import com.lowagie.text.Phrase;
    import com.lowagie.text.pdf.PdfPCell;
    import com.lowagie.text.pdf.PdfPTable;
    import com.lowagie.text.pdf.PdfWriter;
    
    public class SplitItextLastRow
    {
        final static private String BODY_FONT = FontFactory.getFont("Arial").getFamilyname();
    
        public static void main(final String[] args)
        {
            try
            {
                Document document = new Document();
                document.setPageSize(PageSize.LETTER);
                document.setMargins(16, 14, 14, 14);
                PdfWriter writer =
                        PdfWriter.getInstance(document, new FileOutputStream("SplitItext.pdf"));
                document.open();
                document.setPageSize(PageSize.LETTER);
                document.setMargins(16, 14, 14, 14);
    
                int[] maxCountRows = new int[]
                {
                        3, 9, 2, 3, 7, 9, 2, 4, 5, 4, 9, 7, 6, 5, 4, 6, 8, 3
                };
    
                for (int k = 1; k <= maxCountRows.length; k++)
                {
                    PdfPTable table = new PdfPTable(1);
                    table.setSpacingAfter(0);
                    table.setSpacingBefore(0);
                    table.setTotalWidth(document.right() - document.left());
                    table.setLockedWidth(true);
    
                    PdfPTable outerTable = new PdfPTable(table);
    
                    table.setHeaderRows(1);
                    table.setSkipFirstHeader(true);
                    addHeader(table, "Header Row continued " + k, Color.LIGHT_GRAY);
                    addHeader(table, "Header Row normal " + k, Color.LIGHT_GRAY);
    
                    for (int i = 1; i < maxCountRows[k - 1]; i++)
                    {
                        StringBuilder sb = new StringBuilder();
                        for (int p = 0; p < (maxCountRows[k - 1] * 6); p++)
                        {
                            sb.append("Text Row ");
                        }
                        add(table, sb.toString() + i, Color.WHITE);
                    }
    
                    float verticalPosition = writer.getVerticalPosition(true);
                    System.out.println("------Table " + k);
                    if ((verticalPosition - table.getTotalHeight()) <= document.bottom())
                    {
                        System.out.println("........................................Last Row splitted");
                    }
    
                    outerTable.addCell(new PdfPCell(table));
                    document.add(outerTable);
                }
    
                document.close();
            }
            catch (Exception de)
            {
                de.printStackTrace();
            }
        }
    
        private static void addHeader(final PdfPTable table, final String text, final Color color)
        {
            PdfPCell pdfCellHeader = new PdfPCell();
            pdfCellHeader.setBackgroundColor(color);
            pdfCellHeader.addElement(new Paragraph(new Phrase(text, FontFactory.getFont(BODY_FONT, 8f,
                    Color.BLUE))));
            table.addCell(pdfCellHeader);
        }
    
        private static void add(final PdfPTable table, final String text, final Color color)
        {
            PdfPCell pdfCellHeader = new PdfPCell();
            pdfCellHeader.setBackgroundColor(color);
            pdfCellHeader.addElement(new Paragraph(new Phrase(text, FontFactory.getFont(BODY_FONT, 5f,
                    Color.GREEN))));
            table.addCell(pdfCellHeader);
        }
    }
    

    它产生的输出是here。这不正是您所期望的吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多