setTableEvent setter 不再适用于 Table with itext7
setTableEvent setter is no more available for Table with itext7
我正在使用 itext7。
我有一个 table 和一个 header 和几个普通行。我还从 pageNumber > 1 中放置了一个页面 header。因此,当 table 在下一页上拆分时,我有 table header 与页面 [=44] 重叠=].
我的目标是将拆分 table header 放在页面 header 的正下方,这样就不会再有重叠。
为此,我想放置一个 table 事件,并尝试在拆分发生时修改 table 边距顶部。
对于 itext5,可以使用 PdfPTableEventForwarder 为 PdfPTable 设置 setter setTableEvent 来创建事件。
我怎样才能用 itext7 达到这个目标?
我的代码是这样的:
我为 END_PAGE 事件添加了以下处理程序
PdfDocument pdf = new PdfDocument(writer);
pdf.addEventHandler(PdfDocumentEvent.END_PAGE, new MyHeaderEventHandler());
MyHeaderEventHandler 的片段代码class:
public void 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 拆分到下一页时,其 header 行 ("invoiceElementTable Header") 与 pageHeaderTable 的唯一行重叠。
我想在拆分到下一页时修改invoiceElementTable的位置以避免重叠
实现您自己的 table 渲染器并指定 table 分割部分的布局区域。
在下面的示例中,布局矩形已减少 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:
上设置此渲染器的实例
table.setNextRenderer(new CustomTableRenderer(table));
我正在使用 itext7。 我有一个 table 和一个 header 和几个普通行。我还从 pageNumber > 1 中放置了一个页面 header。因此,当 table 在下一页上拆分时,我有 table header 与页面 [=44] 重叠=].
我的目标是将拆分 table header 放在页面 header 的正下方,这样就不会再有重叠。
为此,我想放置一个 table 事件,并尝试在拆分发生时修改 table 边距顶部。
对于 itext5,可以使用 PdfPTableEventForwarder 为 PdfPTable 设置 setter setTableEvent 来创建事件。
我怎样才能用 itext7 达到这个目标?
我的代码是这样的:
我为 END_PAGE 事件添加了以下处理程序
PdfDocument pdf = new PdfDocument(writer);
pdf.addEventHandler(PdfDocumentEvent.END_PAGE, new MyHeaderEventHandler());
MyHeaderEventHandler 的片段代码class:
public void 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 拆分到下一页时,其 header 行 ("invoiceElementTable Header") 与 pageHeaderTable 的唯一行重叠。
我想在拆分到下一页时修改invoiceElementTable的位置以避免重叠
实现您自己的 table 渲染器并指定 table 分割部分的布局区域。
在下面的示例中,布局矩形已减少 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:
上设置此渲染器的实例table.setNextRenderer(new CustomTableRenderer(table));