feat: 完成 DOCX 通用结构映射与严格收口

This commit is contained in:
SkyJourney
2026-07-31 15:19:34 +08:00
parent 6e40374200
commit f3847f3e4b
31 changed files with 3175 additions and 64 deletions
+31 -4
View File
@@ -1,6 +1,6 @@
# Markdown PDF 导出器进度
最后更新:2026-07-30
最后更新:2026-07-31
## 1. 当前概况
@@ -207,6 +207,31 @@ Server Playwright 与 Desktop Electron 适配器,按主题 CSS SHA-256
当前结构样式尚未绑定到 Pandoc AST,封面、版头、分节与标题去重留给
阶段 12C。
`v0.6.0` 阶段 12C 已完成通用 Pandoc 结构映射和最终 OOXML 收口。统一
语义文档模型先生成主题无关的结构计划,静态 Lua Filter 将公文版头、
文号、签发人、落款、版记、简报元数据及项目/标书封面注入可编辑 Word
段落,并绑定标准 Markdown 样式和 31 个 `Md*` 结构样式;转换过程不按
主题 ID 分支。最终 DOCX 后处理生成真实分节,支持封面无页眉页脚、正文
页码从 1 重启和 `SECTIONPAGES`,同时收口容器边框、背景、分页控制、
表格内容区全宽、固定网格和行不拆分。标题策略会抑制 YAML 与首个 H1
重复,所有内部结构标记在输出前强制清除。根级
`npm run verify:docx-themes` 现在强制先用 Playwright Chromium 151
重新采集 14 套主题各 56 个真实槽位,再由 Pandoc 3.9.0.2 生成最终矩阵;
结果为 11/11 表格全宽、8/8 结构化主题字段完整、4/4 独立封面分节合格、
重复标题失败 0、内部标记残留 0。下一步阶段 12D 继续使用真实 Word/WPS
做视觉、编辑和互存回归,自动结构通过不替代客户端验收。
阶段 12C-R1 已完成 WordprocessingML 严格性修复。OOXML 写入层现在按
模式顺序生成和规范化段落、文本、表格、单元格、分节及条件表格样式属性;
样式生成将 CSS `justify` 映射为合法的 `w:jc="both"`,表格宽度仅写入
正文表格而不写入表格样式,最终转换会移除 Pandoc 追加的重复样式 ID。
内置校验器会拒绝乱序属性、重复样式 ID、非法两端对齐枚举和表格样式
`w:tblW`。Microsoft Open XML SDK 2.20 审计确认 14 份最终 DOCX 的上述
错误全部归零;Microsoft Word 和 WPS 均以禁止修复的只读方式正常打开
14/14Word 成功导出 31 页 PDF。逐页检查未发现内容丢失、裁切、重叠或
空白正文。下一步按 R2 字体嵌入、R3 PDF 与 DOCX 视觉差异引擎、R4 全主题
深度回归的顺序推进。
## 2. 已完成
### 2.1 项目骨架
@@ -1140,9 +1165,11 @@ ECharts 第二阶段浏览器与 PDF 验证结果:
共用同一语义树,现有 HTML DOM 保持兼容;
- 阶段 12B:已将跨端主题令牌接入动态 `reference.docx`14 主题双引擎
令牌和真实 Pandoc 模板矩阵通过;
- 阶段 12C:完成 Pandoc 结构映射、封面分节、标题去重、表格宽度和
分页控制;
- 阶段 12D:完成 14 套主题的真实 Word/WPS 视觉与结构回归
- 阶段 12C完成通用 Pandoc 结构映射、封面真实分节、标题去重、
表格内容区全宽、分页控制、OOXML 严格性和 14 主题真实 Word/WPS
无修复打开门禁
- 阶段 12D:依次完成可分发字体嵌入、PDF 与 DOCX 自动视觉差异、14 套
主题真实 Word/WPS 编辑互存和深度视觉回归;
- 阶段 13:完成 Word/WPS 双向互存、外部主题兼容、体积和正式发布验收。
每个阶段验收通过后创建一个独立提交,再进入下一阶段。当前阶段不得混入
+87
View File
@@ -2,6 +2,10 @@
审计日期:2026-07-30
> 本文第 3~8 节记录阶段 10 的首轮审计基线。阶段 12C 已于
> 2026-07-31 完成对应结构修复和自动化门禁,最新状态见第 9 节;真实
> Word/WPS 视觉、编辑和互存结论仍需阶段 12D 复验。
## 1. 审计目标
本轮按 v0.6.0 已冻结的两条 DOCX 发布门禁检查全部内置主题:
@@ -258,3 +262,86 @@ Word 实际导出的 PDF 中可见字体符合当前样式意图:
在完成 P0 项目前,不建议将阶段 10 标记为通过,也不建议创建 v0.6.0
正式发布提交或版本标签。
## 9. 阶段 12C 自动修复复验
阶段 12C 保留 Pandoc 作为可编辑 OOXML 底座,并增加项目自有的通用转换
层:统一语义文档模型生成结构计划,Lua Filter 注入可编辑段落与样式,
最终 OOXML 收口层写入真实分节、页码重启、表格宽度和分页属性。映射只
依赖语义角色与主题令牌,不包含主题 ID 分支,因此同一机制也可服务未来
外部主题。
2026-07-31 使用 Playwright Chromium 151 重新采集 14 套主题各 56 个
计算样式槽位,并由 Pandoc 3.9.0.2 重新生成全部 DOCX,自动结构结果如下:
| 检查项 | 阶段 12C 结果 | 结论 |
| --- | ---: | --- |
| 主题使用本轮真实 Chromium 令牌 | 14/14 | 通过 |
| 结构化主题字段完整映射 | 8/8 | 通过 |
| 项目报告与标书独立封面真实分节 | 4/4 | 通过 |
| 封面隐藏页眉页脚、正文页码从 1 重启 | 4/4 | 通过 |
| 封面文档使用 `SECTIONPAGES` | 4/4 | 通过 |
| 含表格主题的表格铺满内容区 | 11/11 | 通过 |
| YAML 标题与正文首个 H1 去重 | 14/14 | 通过 |
| 内部结构标记清理 | 14/14 | 通过 |
| 禁止 `altChunk`、保留原生可编辑结构 | 14/14 | 通过 |
统一复现命令仍为:
```powershell
npm run verify:docx-themes
```
该命令不会回退到合成令牌或陈旧快照。它先生成本轮 Chromium 令牌,再
执行 14 主题 Pandoc 矩阵和硬断言。阶段 10 的 P0/P1 结构阻塞因此已由
自动门禁关闭;“完整主题样式映射”的最终判定仍保留到阶段 12D,必须在
Microsoft Word 与 WPS 中完成视觉检查、编辑、保存、重开和双向互存后
才能通过。
## 10. 阶段 12C-R1 OOXML 严格性复验
2026-07-31 对阶段 12C 生成的 14 份 DOCX 做 Microsoft Word 原生打开
时,最初仅 7 份可直接打开,另外 7 份触发“发现无法读取的内容”且无法
恢复。WPS 可以容错打开,但会报告缺失字体,因此不能据此判定 OOXML
合格。
深度审计确认根因集中在生成样式与 OOXML 模式约束:
- Pandoc 消费 `custom-style` 后会追加同名降级样式,造成重复
`w:styleId`
- CSS `text-align: justify` 被直接写成非法的 `w:jc="justify"`,正确
WordprocessingML 枚举应为 `both`
- 表格条件样式中的 `w:rPr``w:tcPr` 顺序不符合模式;
- `w:tblW` 被写入表格样式层,和正文表格的直接宽度属性混在一起;
- 多类段落、文本、表格、单元格和分节属性缺少统一的有序写入门禁。
通用引擎已经增加有序插入、序列化规范化和严格校验,并在最终 DOCX
收口层保留前置主题样式、移除 Pandoc 同名降级样式。修复不按主题 ID
分支,也不改变正文表格的内容区全宽属性。
复验结果:
| 检查项 | 结果 | 结论 |
| --- | ---: | --- |
| 14 主题结构矩阵 | 14/14 | 通过 |
| Microsoft Open XML SDK 非兼容性错误 | 0 | 通过 |
| Microsoft Word 禁止修复打开 | 14/14 | 通过 |
| WPS 原生只读打开 | 14/14 | 通过 |
| Word 原生 PDF 导出 | 14/14,共 31 页 | 通过 |
| 31 页逐页结构检查 | 31/31 | 通过 |
Open XML SDK 2.20 仍会按 Office 2007 模式报告 Pandoc 表格上的 Office
2010 `tblLook` 六个兼容属性;这些属性在本轮 Word/WPS 实测中正常,不计
为生成错误。
逐页检查没有发现内容丢失、裁切、重叠或空白正文,但保留以下阶段 12D
视觉问题:
- 深色表头文字对比度不足;
- 部分短文档尾页留白过大;
- `gov-red-standard` 在 Word 与 WPS 中分别为 2 页和 3 页,说明字体与
客户端排版差异尚未收口;
- 当前主题矩阵的 Mermaid 仍使用黑色占位 PNG,不代表真实媒体效果。
因此 R1 只关闭 OOXML 合法性和 Word/WPS 无修复打开门禁。字体可移植性、
PDF 与 DOCX 自动视觉差异、真实媒体和双向编辑互存继续由 R2~R4 验收。