Files
LWLT-AIBOT/.project-docs/30-worklog/tasks/20260911-confirmation-pdf-html-import-01a0858b.md
T
2026-09-11 16:18:44 +08:00

43 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 确认书 PDF 首页空白与标题丢失修复
- Task ID: `20260911-confirmation-pdf-html-import-01a0858b`
- Mode: Feature
- Status: Complete (local implementation and validation)
- Scope: 根据用户持续排查和修复确认书导出问题的请求,修复服务端 HTML 文档转 PDF 的导入方式;本地验证,不部署。
## Concurrent Worktree Check
- Branch: `main`
- Worktree: `/Users/andy/IdeaProjects/LWLT-AIBOT`
- Base commit: `a4d55a5c55032a166f6d1a3c76eadf471ba36535`
- Existing changes: 未跟踪 `.idea/` 和 `dist/ltjt-order-assistant-0.5.173.zip`,保留,不涉及当前改动。
- Other local worktrees: 无。
- Overlap result: Clear;转换器及测试无既有改动。单 Agent 实现与复核。
## Findings and implementation
- 原始 `.doc` 实际是 UTF-8 Word HTML。本地 Debian 12 容器中的 LibreOffice `7.4.7.2 40(Build:2)` 及四项 Fontconfig 匹配结果与用户提供的 ACK 输出一致;架构为 arm64,生产架构未核实。
- 现有转换函数可稳定复现 4 页 PDF、首页完全空白、中文标题缺失。仅改字体映射、HTML 字体名、命名页面或 layout-grid 均未消除问题。
- 在相同版本、字体、输入下显式增加 `--infilter=HTML (StarWriter)` 后得到 3 页,中文标题恢复。全部页面已渲染检查;原始 HTML 中 121 个至少 4 个非空白字符的文本片段全部可在结果中找到。
- 已在 PDF 转换参数中按现有 HTML 检测结果增加 `--infilter=HTML (StarWriter)`;保留原有宽度规范化、隔离 profile、超时、大小限制及失败回退。二进制 Word、RTF、PDF 透传与 XLSX 转换不强制 HTML 导入。
- 原始客户文件与实验 PDF 仅在用户文件位置和本机临时目录;仓库只保存脱敏验证结论,不保存业务正文。测试容器断网,不访问 ERP 或外发消息。
## Verification
- 回归先行:旧实现新增用例中的 5 个 HTML 子用例失败,3 个非 HTML 子用例通过;修复后转换器测试 15/15 PASS。覆盖 ERP vendor MIME、BOM、DOCTYPE、body-only HTML、HTML 扩展名/MIME,以及二进制 DOC、DOCX、RTF 的格式边界,已有 XLSX/PDF 透传和宽度测试通过。
- `node --run check`:PASS;`node --run build`:PASS;`node --run test:control-plane`:211/211 PASS。
- 工作目录 `check:repo` 为 8/10、`test:legacy` 为 288/290;失败仅为既有 `.idea`、根目录和 `chrome-extension/` 下 `.DS_Store`。保留这些文件,在 `/private/tmp/ltjt-pdf-clean-verify-k61osr4z` 的当前文件副本中排除编辑器杂项和秘密后,`check:repo` 10/10、`test:legacy` 290/290 PASS。legacy 测试经授权允许本机临时 HTTP 监听,不启动业务服务。
- 用 `node --run build` 生成的实际转换模块、原始输入、默认 `soffice` 路径和隔离 profile 在断网 Linux 容器复验:3 页、首面标题存在、121/121 正文片段匹配;全部 3 页渲染与已逐页检查的参数实验结果逐像素一致。
- 原始文件 SHA-256 未变化。未验证远程印章图片下载、生产架构及完整生产镜像一致性;本地结果不代表生产已部署。
- [不可变脱敏证据](../../../archive/evidence/2026-09-11/20260911-confirmation-pdf-html-import-01a0858b/README.md)。原始客户文件、PDF 和截图不进入仓库。
- 最终自行只读复核 PASS:源码仅增加 HTML 条件导入参数,未改 XLSX 路径、超时、回退或业务路由;`git diff --check` PASS。无子 Agent、无部署、无数据库或 ERP 操作。
## Outcome and follow-ups
- 本地实现与验证完成。生效需用户重建并部署服务端镜像;不需要插件、数据库、字体包或 LibreOffice 升级。
- 部署后需重新导出确认书,既有 OSS/PDF 文件不会因代码升级自动重生成。生产部署和实际导出验收由用户执行。
## Promotion Candidates
- 集成时可在文档导出架构说明中登记 HTML-in-DOC PDF 转换必须显式使用 Writer HTML 导入器,避免 LibreOffice 7.4 默认导入导致首段丢失;本任务不改 canonical 文档。