PdfPTableEventForwarder

PdfPTableEventForwarder

我会自由地承认这可能是this的重复,但是那里没有答案,我想我可以添加更多信息。

使用iText 5.5.0

我需要什么:斑马条纹的表格,其中单元格之间没有上下边界,但是表格本身有底边框,或者每当表格被拆分成多个页面时就存在。我在这里使用“ lorem ipsum”和其他任意数据进行了一次小测试。我部分切掉了页脚上写着“第1页,共2页”的内容,但此表确实
在第2页上有其他行继续。我希望此表或多或少按原样显示,并在页面的最后一行添加底部边框。



我正在尝试通过匿名内部类实现PdfPTableEventForwarder。我有一个看起来像这样的方法:

public PdfPTable createStandardTable(int columnCount, int headerRows) {
    PdfPTableEventForwarder tableEvent = new PdfPTableEventForwarder()
    {
        // begin another anonymous inner class extends PdfPTableEventForwarder
        @Override
        public void splitTable(PdfPTable table) {
            PdfPRow lastRow = table.getRow(table.getLastCompletedRowIndex());
            for (PdfPCell cell : lastRow.getCells()) {
                cell.setBorder(Rectangle.LEFT + Rectangle.RIGHT + Rectangle.BOTTOM);
            }
        }
        // end anonymous inner class extends PdfPTableEventForwarder
    };

    PdfPTable table = new PdfPTable(columnCount);
    table.setSpacingBefore(TABLE_SPACING);
    table.setSpacingAfter(TABLE_SPACING);
    table.setWidthPercentage(TABLE_WIDTH_PERCENT);
    table.setHeaderRows(headerRows);
    table.setTableEvent(tableEvent);
    return table;
}


在其他地方,我像这样创建表:

// Details of code to create document and headers not shown
PdfPTable table = createStandardTable(12, 2);
// Details of code to build table not shown, but includes cell.setBorder(Rectangle.LEFT + Rectangle.RIGHT)
document.add(table);


我已经在调试器中在splitTable的第一行中使用断点来运行它,发现该事件仅被调用一次。我希望它调用两次:第一,当第1页结束并且第2页开始时,第二当表完成时。此外,我在此表中有30行,外加2个标题行:25个行适合第1页的标题,最后五行位于第2页。调试器告诉我table.getLastCompletedRowIndex()
计算结果为32,而不是第1页末尾预期的27。

的确,保存到我的文件的最终结果在第2页的最后一行具有底边框,但在第1页没有底边框。在添加PdfPTableEventForwarder之前,都没有边框。

最佳答案

当您有一个包含10行的表并拆分了一行时,总共有11行。这就解释了您对行数的困惑。
我不明白为什么只需要一个事件就使用PdfPTableEventForwarder。当您具有一系列PdfPTableEventForwarder事件时,将使用PdfPTable
更改表或单元格事件中的单元格不正确。这将永远行不通。触发事件时,该单元格已经被渲染。如果要绘制底部边框,请使用lineTo()实现的moveTo()方法中传递给您的坐标按照stroke()tableLayout()PdfPTableEvent命令的顺序绘制底部边框。


一个与您所需的示例不同的示例,但在此处可以找到类似的示例:PressPreviews.java。不需要在拆分之前或之后进行拆分,您只需要基本的PdfPTableEvent接口和如下所示的tableLayout()方法。

public void tableLayout(PdfPTable table, float[][] width, float[] height,
        int headerRows, int rowStart, PdfContentByte[] canvas) {
    float widths[] = width[0];
    float x1 = widths[0];
    float x2 = widths[widths.length - 1];
    float y = height[height.length - 1];
    PdfContentByte cb = canvas[PdfPTable.LINECANVAS];
    cb.moveTo(x1, y);
    cb.lineTo(x2, y);
    cb.stroke();
}


我可能会误以为y值,但希望您能理解。

10-07 19:26