跳到正文

ADR-0017:常用编写入口与布局阶段两端对齐 ​

  • 状态:已采用。
  • 日期:2026-10-15。

背景 ​

已有 API 分层清楚,但普通段落也需要显式 ID、格式和集合构造。标题和列表只有纯文本,模板及 DOCX 无法完整保留样式。普通文字与 OpenType 使用不同换行路径,中文禁则和新增两端对齐必须保持来源与绘制一致。

决策 ​

  1. 在现有 Document.Builder 加入默认格式、自动 ID、列表和等宽文本表格入口,不创建包装模块,不隐藏字体或具体后端。自动 ID 只用于普通内容,引用目标继续显式命名。
  2. DocumentEngine.write(..., Path) 默认原子输出,借用流的契约保持。空页区的分节输出提供简短重载,复杂页区与导航继续显式配置。
  3. JUSTIFY 由布局阶段在已确定的软换行内分配空隙。简单文字修改 advance;OpenType 在视觉空隙后平移字形轮廓及行内对象,不缩放字形,不改变换行与 UTF-16 来源。后端不重新测量。
  4. 新增可选 CJK_STRICT,在原文中检查中文标点和不换行组合,无法放入完整组合时失败。旧构造器使用 STANDARD,历史默认布局保持。
  5. 标题和列表保存不可变 InlineText 列表;列表前缀使用默认样式。语义降级、模板、外链矩形与 DOCX 使用这些运行,不把样式提前扁平化。图片与字段不进入这一语义子集。
  6. DOCX 使用标准 both 对齐与禁则提示;引擎严格策略通过可忽略标记保存。未知外部启用禁则按严格损失边界处理,不推测为相同排版规则。

结果 ​

普通调用缩短,复杂场景仍保留明确控制。记录构造器保持源码调用方式;新增枚举值和 record 成员要求调用方重新编译并检查穷尽分支。尚未冻结公共 API。

验收结合最终 PDF 的 CID/TJ advance、轮廓逻辑锚点、独立双渲染、DOCX 结构、隔离 Maven 调用方和有界混合报告压力。压力记录包含 JVM 工作集、私有字节及句柄采样,不能据此宣称长期无泄漏、容量保证或完整流式布局。见调用指南与验收记录。