跳到正文

ADR-0011:多矩形浮动区域与固定行带 ​

  • 状态:已接受
  • 日期:2026-10-14

背景 ​

既有 FloatText 仅允许首片段顶部放置一个左右矩形,无法表达同一正文区域内左右并存、错位和纵向堆叠的图片/文本框。核心已经通过 PageableComponent 消费有序片段,OpenTypeText 已支持逐行宽度和横向偏移,不需要把浮动规则放入后端。

决策 ​

新增 MultiFloatText 与不可变 FloatBox,每个矩形定义边缘、顶部偏移、尺寸和水平留白;最多 64 个。先验证新页可容纳及实际矩形无碰撞,再按固定行带求左右边界。文字在中间连续区间排版;封闭行带直接跳到最近底边后的网格位置。正宽区间仍须容纳至少一个字形簇,否则失败。

首片段的所有矩形一起适应当前页剩余高度,不足则整体移页。完全封闭的首片段可以仅含浮动组件,使算法消耗浮动内容后继续正文;空正文仅输出浮动内容,不生成额外空白文字页。浮动组件只测量和输出一次,文字只换行一次,续页使用全宽。子组件声明尺寸须放得入区域,绘制裁剪到声明矩形。保留旧 FloatText API 并委托共享算法。

布局和绘制合成均在组件层完成,不改变语义模型、组件 SPI、Layout IR 或后端职责。没有新增模块或运行依赖。诊断与字形簇来源仍使用既有原文 UTF-16 索引;取消/超时继续使用同步执行范围。

后果与边界 ​

可组合多个左右图片/文本框,保留剩余页高、固定行距、分页推进和续页来源顺序。偏移属于组件首片段,不会跨页自动锚定;实际矩形碰撞明确失败,留白重叠可以产生跳过的行带。浮动框内部不可跨页。任意轮廓绕排、浮动内容的语义阅读顺序及 DOCX 锚点映射继续单独实现。

验证使用组件测试、公开 API 示例、隔离 Maven 调用方,以及从最终 PDF 独立读取矩形和文字锚点的脚本;全部示例页通过 Poppler/PDFium 渲染并人工复查。具体证据见验收记录。