setTableEvent 设置器不再可用于带有 itext7 的表

我正在使用itext7。我有一个带有标题和几个正常行的表。我还从 pageNumber > 1 放置了一个页眉。因此,当在下一页拆分表格时,我的表格标题与页眉重叠。


我的目标是将拆分表标题放在页面标题下方,这样就不会再有重叠了。


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


使用 itext5,可以使用 PdfPTableEventForwarder 为 PdfPTable 设置设置器 setTableEvent 来创建事件。


我怎样才能用 itext7 达到这个目标?


我的代码是这样的:


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


PdfDocument pdf = new PdfDocument(writer);


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

MyHeaderEventHandler 类的片段代码:


公共无效句柄事件(事件事件){


//这里有一些代码


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拆分到下一页时修改它的位置以避免重叠


叮当猫咪
浏览 74回答 1
1回答

慕少森

实现您自己的表格渲染器并为表格的拆分部分指定布局区域。在下面的示例中,布局矩形减少了 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));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java