ADR-0015:语义表格字段与逐页解析
- 状态:已接受
- 日期:2026-10-15
背景
正文已能在最终分页后解析固定宽度行内字段。表格单元格仍拒绝字段,无法显示所在页码或向前引用;重复表头与拆行续页还要求同一源字段在不同实际页面产生不同值。
决策
TableCell 增加不可变 fields,复用 Paragraph.FieldSpan 的 U+FFFC、样式及原文校验。保留旧构造器。模板绑定通过完整混合内容展开文字及目标 ID,重新计算原始标记位置。
自动列宽探测和最终测量都使用字段预留宽度。布局只生成 FieldBox,重复表头复用已测量行,正文续页按完整行保留字段、单元格来源及起始行号。最终编排器遍历语义 TableFragment,对每个实际出现的单元格分别解析,不改变列宽、行框、表格矩形或分页。
整篇编排共用字段数、生成码点与内部链接预算,重复表头的每次呈现计入预算。字段失败和生成值诊断携带最终物理页、表格块、原始行列与单元格标记位置;生成值局部 UTF-16 与单元格原文 UTF-16 继续分开表达。
单元格支持当前页码、总页数、目标页码和编号引用。NOTE_MARKER 在模型入口拒绝,避免在尚无单元格注释归属协议时接受无效语义。DOCX 导出预检全部段落与单元格,遇到字段时在写入任何字节前失败。
后果和边界
后端仍只消费已解析绘制数据;GridTable 等组件、连续栏内部字段和 DOCX 字段映射不在本批范围。字段实际值过宽继续失败,不自动缩小或改变预留宽度。
新增 record 组件可能影响反射、序列化及二进制调用方。项目尚未正式发布,本地隔离 Maven 调用方验证源码契约;不能据此声明稳定版本的二进制兼容性。
验收同时发现并修正了含原子字段的自动列宽断行估算和 PDF 相对字距中的绝对游标舍入问题,详见阶段十一验收。