跳到正文

ADR-0096:外部 PDF 的保留、绘制与语义恢复分离 ​

状态 ​

已采纳;验收结果独立登记。

背景 ​

字体程序、Form、图形状态、图层与标签可组合出常见外部 PDF。读取文字、保留原对象、显示默认视图和恢复可编辑段落所需的证据不同。统一放宽预检会把缺字、关闭层内容或不一致的结构树带入新文档;始终拒绝整个文件又不能利用已有确定性绘制和原对象保留能力。

决策 ​

按兼容矩阵分别声明四条路径。既有严格模式保持默认;图层与静态标签由 PdfAdapter.Builder.allowPassiveStructures(true) 显式接受,专用验证在完整图与解码预算检查后执行。

字体使用真实程序检查。无程序字体只有明确源名称、可验证编码及源步进时才接受调用方映射;不注册全局字体映射器、不扫描系统字体,也不覆盖已存在的损坏嵌入程序。传统 Type1 与 Type3 的程序和实际绘制另外受有界检查;它们不自动扩大语义模型的文字表达范围。

普通 Form 原文字修改使用调用实例的私有副本,克隆资源字典并只改命中的调用链。退出状态、未命中调用、共享页面及原 BBox/Matrix 保持。带结构所有者的 Form 不通过克隆获得新实例,避免破坏原标签引用;不支持的原对象编辑仍按既有保留/跳过策略返回损失。

OCG/OCMD 只采用源默认 VIEW,包含实际标记内容和 XObject 的可见性约束。静态标签检查树、所有者、MCID、编号/名称树及合法反向引用,不根据任意同名 P/Pg 键全局绕过循环检查。完整原文档的无关编辑保留这些对象;新页树复制和跨输入组合尚无完整重映射,继续拒绝。

语义模型不能表达的有效绘制允许调用方选择 PDF_STRUCTURE / DEGRADE:把整页当前可见结果恢复为一个流图片,不声称图片中的正文、矢量或标签仍可编辑。SKIP_BLOCK 继续提供显式整页跳过。图层另外报告固定视图损失,标签报告结构丢弃;WARN 和 IGNORE 处理一致且保留全部实际损失。

失败与资源 ​

降级依赖真实可执行的渲染路径,不能补出缺失字体、损坏资源或未知外观。权限、签名、非法引用、缺字、结构循环、预算和取消仍硬失败。重复调用和实际 glyph/Type3 程序执行计入操作预算,源和替代程序共同计入字节及解码预算;候选编码后才允许原子写出。

后果与验证 ​

调用方可以逐格式选择拒绝、警告或忽略警告,同时看到确切的保持、丢弃、跳过或光栅化结果。完整源 PDF 的无关编辑和导出新模型是不同功能;本决定不承诺任意 PDF 无损互转、PDF/UA 或跨应用的通用原版重建。

验收须同时包含独立外部语料、发布坐标调用方、默认拒绝、实际默认视图、原对象引用图保持、关闭层不泄露、损失对账、旧目标保护及全部变化 PDF 页的独立渲染。有限样本不替代具体边界声明;证据数字及完成状态在阶段记录和能力缺口表登记。