使用setext7

时间:2019-04-30 15:19:09

标签: java itext7

我正在使用itext7。 我有一个带有标题和几个普通行的表。我还从pageNumber> 1中放入了一个页眉。因此,在下一页上拆分表时,我的表头与页头重叠。

我的目标是将拆分表标题放在页面标题的正下方,以便不再有重叠。

为此,我想放置一个表事件,并尝试在拆分发生时修改表边距顶部。

使用itext5,可以使用PdfPTableEventForwarder来为PdfPTable设置设置程序setTableEvent。

如何使用itext7达到这个目标?

我的代码是这样的:

我为END_PAGE事件添加了以下处理程序

PdfDocument pdf = new PdfDocument(writer);

pdf.addEventHandler(PdfDocumentEvent.END_PAGE, new MyHeaderEventHandler());

MyHeaderEventHandler类的代码段:

公共无效handleEvent(事件事件){

//一些代码在这里

if(pageNumber > 1)
{

  Table pageHeaderTable = new Table(new float[]{1.5f, 1.3f, 1.5f, 2.3f, 2.3f, 2.3f, 2f, 2.6f});

 pageHeaderTable.setMarginTop(12).setWidth(523).setMarginLeft(36);

 pageHeaderTable.setFixedLayout();

//some code to fill pageHeaderTable cells(1 row with 8 cells) with string values

 canvas.add(pageHeaderTable);

}

 canvas.close();
 pdfCanvas.release();

}

//我的invoiceElementTable的代码片段

Table invoiceElementTable = new Table(new float[]{1.5f, 1.3f, 1.5f, 2.3f, 2.3f, 2.3f, 2f, 2.6f});
invoiceElementTable.setFixedLayout();
                                invoiceElementTable.setWidth(UnitValue.createPercentValue(100));
invoiceElementTable.addHeaderCell(new Cell(1,8).add(new Paragraph("invoiceElementTable Header")));

I have a list of objects to fill the cells:

eltList.stream().forEach(elt-> {
invoiceElementTable.addCell(new Cell().add(new Paragraph(elt.getItem0)));
invoiceElementTable.addCell(new Cell().add(new Paragraph(elt.getItem1)));
invoiceElementTable.addCell(new Cell().add(new Paragraph(elt.getItem2)));
invoiceElementTable.addCell(new Cell().add(new Paragraph(elt.getItem3)));
invoiceElementTable.addCell(new Cell().add(new Paragraph(elt.getItem4)));
invoiceElementTable.addCell(new Cell().add(new Paragraph(elt.getItem5)));
invoiceElementTable.addCell(new Cell().add(new Paragraph(elt.getItem6)));
invoiceElementTable.addCell(new Cell().add(new Paragraph(elt.getItem7)));
});

问题是当invoiceElementTable拆分到下一页时,其标题行(“ invoiceElementTable Header”)与pageHeaderTable的唯一行重叠。

我想在将invoiceElementTable拆分到下一页时修改其位置,以避免重叠

1 个答案:

答案 0 :(得分:0)

实现自己的表格渲染器,并为表格的拆分部分指定布局区域。

在下面的示例中,布局矩形已减少了100(您需要使用页面标题的高度更改此值):

    class CustomTableRenderer extends TableRenderer {
    public CustomTableRenderer(Table modelElement) {
        super(modelElement);
    }

    @Override
    public IRenderer getNextRenderer() {
        return new CustomTableRenderer((Table)modelElement);
    }

    @Override
    public LayoutResult layout(LayoutContext layoutContext) {
        if (!isOriginalNonSplitRenderer) {
            LayoutArea area = layoutContext.getArea();
            area.setBBox(area.getBBox().decreaseHeight(100));
        }
        return super.layout(layoutContext);
    }
}

要将其集成到您的代码中,只需在表上设置此渲染器的实例:

table.setNextRenderer(new CustomTableRenderer(table));