iText7如何判断表格是否跨多页及获取表格所在页码
问题根因
你当前获取的页码始终为0的核心原因有两点:
- 你手动调用
Layout方法时传入的LayoutArea初始化参数第一个值就是0,模拟布局的上下文完全是你自定义的,和文档实际渲染的上下文无关,自然拿不到真实页码 - 你手动创建的渲染器实例和实际添加到文档中完成渲染的表格实例没有关联,模拟布局也没有考虑文档已有内容、边距、页眉页脚等实际排版因素,计算出的位置、页码都和真实渲染结果不符。
解决方案
要准确获取表格占用的页码、判断是否跨页,需要给表格绑定自定义渲染器,在真实渲染流程中跟踪页码信息,实现步骤如下:
1. 自定义表格跟踪渲染器
public class PageTrackingTableRenderer : TableRenderer { // 存储表格实际占用的所有页码 public List<int> OccupiedPageNumbers { get; } = new List<int>(); public PageTrackingTableRenderer(Table modelElement) : base(modelElement) { } public override LayoutResult Layout(LayoutContext layoutContext) { var result = base.Layout(layoutContext); // 收集当前布局对应的真实页码 int currentPage = layoutContext.GetArea().GetPageNumber(); if (!OccupiedPageNumbers.Contains(currentPage)) { OccupiedPageNumbers.Add(currentPage); } return result; } protected override IRenderer GetNextRenderer() { // 跨页拆分时复用页码收集逻辑,保证页码收集完整 var nextRenderer = new PageTrackingTableRenderer((Table)GetModelElement()); nextRenderer.OccupiedPageNumbers.AddRange(OccupiedPageNumbers); return nextRenderer; } }
2. 绑定渲染器并添加表格
在将表格添加到文档前,绑定自定义渲染器:
// 你的业务逻辑创建的表格对象 Table targetTable = BuildYourTableLogic(); // 绑定跟踪渲染器 var trackRenderer = new PageTrackingTableRenderer(targetTable); targetTable.SetNextRenderer(trackRenderer); // 正常添加表格到文档 document.Add(targetTable);
3. 获取结果
必须在文档完全渲染完成(调用document.Close())后,读取渲染器的OccupiedPageNumbers属性获取结果:
document.Close(); // 所有占用的页码,按升序排列 List<int> tablePages = trackRenderer.OccupiedPageNumbers; // 判断是否跨页 bool isMultiPage = tablePages.Count > 1; // 起始页码、结束页码 int startPage = tablePages.First(); int endPage = tablePages.Last();
内容的提问来源于stack exchange,提问作者Franco
相关产品推荐
相关产品推荐

