为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

叮当猫咪 2022-11-02 10:39:50
我正在使用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拆分到下一页时修改它的位置以避免重叠
查看完整描述

1 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

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


在下面的示例中,布局矩形减少了 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));


查看完整回答
反对 回复 2022-11-02
  • 1 回答
  • 0 关注
  • 71 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信