iText7了解表是否扩展到更多页



在itext7中可以知道一个表(添加到文档中)是否占用了1个或多个页面,以及在哪个页面上放置了?

我已经尝试在END_PAGE处理程序:

IRenderer pRenderer = TableData.CreateRendererSubTree().SetParent(doc.GetRenderer());
LayoutResult pLayoutResult = pRenderer.Layout(new LayoutContext(new LayoutArea(0, PageSize.A4)));
float y = pLayoutResult.GetOccupiedArea().GetBBox().GetY();
float x = pLayoutResult.GetOccupiedArea().GetBBox().GetX();
float xBottom = pLayoutResult.GetOccupiedArea().GetBBox().GetBottom();
float xHeight = pLayoutResult.GetOccupiedArea().GetBBox().GetHeight();
int pageNumber= pLayoutResult.GetOccupiedArea().GetPageNumber();

我试过只在第一页上使用表,在第一页和第二页上使用表扩展。

pageNumber is always = 0.

提前感谢。

这当然是可能的。text7允许您重写呈现逻辑,其中最简单的应用之一就是知道元素将被放置在页面的哪个位置。

作为helper意味着存储关于放置表的页面的信息,我们可以定义一个小类:

private static class LayoutInfo {
Collection<Integer> occupiedPages = new ArrayList<>();
public void addPage(int pageNum) {
occupiedPages.add(pageNum);
}
public Collection<Integer> getOccupiedPages() {
return occupiedPages;
}
}

现在,我们可以定义自定义表渲染器,它将把页码存储到这个LayoutInfo对象中:

private static class CustomTableRenderer extends TableRenderer {
private LayoutInfo layoutInfo;
public CustomTableRenderer(Table modelElement, LayoutInfo info) {
super(modelElement);
this.layoutInfo = info;
}
@Override
public void draw(DrawContext drawContext) {
super.draw(drawContext);
layoutInfo.addPage(occupiedArea.getPageNumber());
}
@Override
public IRenderer getNextRenderer() {
return new CustomTableRenderer((Table) modelElement, layoutInfo);
}
}

在所有单元格都添加到表格中并且表格准备添加到文档之后,您必须为表格设置自定义渲染器:

table.setNextRenderer(new CustomTableRenderer(table, info));

完整的高级代码:

PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName));
Document document = new Document(pdfDocument);
LayoutInfo info = new LayoutInfo();
Table table = new Table(2);
for (int i = 0; i < 200; i++) {
table.addCell("Row number ");
table.addCell(i + "");
}
table.setNextRenderer(new CustomTableRenderer(table, info));
document.add(table);
document.close();
System.out.println("The table is placed on the following pages: " + info.getOccupiedPages().toString());

代码输出:

The table is placed on the following pages: [1, 2, 3, 4, 5, 6]

请注意,代码是用Java编写的,但翻译成c#主要是在几个地方改变字符大小写的问题。

相关内容

最新更新