feat: 实现 DOCX 媒体预处理与跨端 PNG 捕获

This commit is contained in:
SkyJourney
2026-07-30 13:21:18 +08:00
parent 7831bc23f0
commit fe5d67fb6d
20 changed files with 1294 additions and 16 deletions
+38 -2
View File
@@ -91,6 +91,13 @@ H1~H6、加粗、斜体、删除线、行内代码、代码块、引用、三
同步。外部文档替换会重置历史,单次工具栏操作形成一个 CodeMirror
事务。
`v0.6.0` 阶段 5 已完成 DOCX 资源预处理管线:复用连续预览运行时等待
图片、Mermaid、ECharts 和字体,按纸张内容区生成稳定媒体捕获计划;
Server 使用 Playwright Chromium、Desktop 使用 Electron Chromium
统一将所有媒体捕获为 PNG。目标为 300 DPI,并限制 4096px 单边、1600
万像素、8 MiB 单图和 30 MiB 总量。本阶段只提供共享服务和平台适配器,
尚未新增 DOCX HTTP 路由、应用 IPC、Pandoc 调用或导出按钮。
## 2. 已完成
### 2.1 项目骨架
@@ -568,8 +575,36 @@ H1H6、加粗、斜体、删除线、行内代码、代码块、引用、三
关闭时对未保存内容进行确认;另存为成功后当前窗口追踪新文件路径,
Web 端不显示或拦截“另存为”。
### 3.21 v0.6.0 DOCX 资源预处理
- `packages/core` 新增图片、Mermaid、ECharts 的媒体类型、捕获计划、
PNG 资源清单和跨端限制常量;
- `packages/preview-engine` 复用连续文档运行时建立 DOCX 媒体舞台,
等待图片、字体和图表完成后按 DOM 顺序生成捕获目标;
- 媒体按纸张方向、纸张尺寸、主题默认页边距和用户页边距限制显示宽高;
- 普通图片、SVG、Mermaid 和 ECharts 统一输出 PNG,默认 300 DPI
超大媒体会按 4096px 单边和 1600 万像素上限降低倍率;
- 捕获框使用覆盖元素边界的整数坐标,避免 Chromium 对小数坐标缩放时
裁切边缘或产生不可预测的位图尺寸;
- `packages/application` 校验捕获计划、媒体 ID、PNG 签名、IHDR 尺寸、
单图大小、总大小和计划匹配关系,并生成稳定文件名;
- Server 的 Playwright 与 Desktop 的 Electron 适配器均使用 Chromium
DevTools 截图协议,不引入 Sharp、Python 或其他原生图片依赖;
- 真实 Chromium 冒烟已将输入 SVG 图片、Mermaid 和 ECharts 依次输出为
753×378、809×222、2103×591 PNG,图表错误均为 0。
## 4. 已执行验证
2026-07-30 对 v0.6.0 阶段 5 执行:
- 完整工作区 61 个测试文件、308 项测试全部通过;
- Markdown ECharts、Core、Renderer、Application、Preview Engine、
Web、Server 和 Desktop 类型检查全部通过;
- Web Runtime、Server 和 Desktop 生产构建通过;
- 真实 Playwright Chromium 使用 SVG 图片、Mermaid 和 ECharts 完成
300 DPI PNG 捕获,媒体顺序、尺寸、格式和错误清单验证通过;
- `git diff --check` 通过,仅有 Git 对 Windows 工作区换行转换的提示。
2026-07-29 对 v0.5.1 完整工作区及最终代码块修复执行:
```text
@@ -974,8 +1009,9 @@ ECharts 第二阶段浏览器与 PDF 验证结果:
分发方式;
- 阶段 3:已实现 DOCX 共享模型和跨端导出协议;
- 阶段 4:已实现 CodeMirror 6 与可扩展基础 Markdown 工具栏;
- 阶段 5~8:依次实现资源预处理、动态 reference.docx、Pandoc 转换服务
以及 Web/Desktop 导出交互;
- 阶段 5:已实现 DOCX 资源预处理和跨端 Chromium PNG 捕获适配器;
- 阶段 68:依次实现动态 reference.docx、Pandoc 转换服务以及
Web/Desktop 导出交互;
- 阶段 910:完成自动化和 Word/WPS 互操作验收,再构建正式发布产物。
每个阶段验收通过后创建一个独立提交,再进入下一阶段。当前阶段不得混入