Word ↔ HTML High-Fidelity Converter
一个基于开源工具的 .docx 与 .html 双向转换程序,目标是尽量保持 Word 文档在浏览器和再次转回 Word 后的视觉效果一致。
现实说明:DOCX 和 HTML/CSS 的排版模型不同,严格意义上的“完全无损双向转换”不能只靠普通 HTML 实现。本项目采用 LibreOffice Writer 的转换引擎做高保真转换,再做 HTML/CSS 后处理;同时提供 PDF 渲染级视觉对比报告,便于验收。
功能
-
DOCX → HTML
- 保留字体、字号、颜色、粗体、斜体、下划线、删除线
- 保留段落对齐、缩进、行距、页边距、分页符
- 保留表格结构、边框、合并单元格、部分背景色样式
- 保留图片、大小、位置、页眉页脚文本
- 将
<style>中的规则尽量内联到元素style中,降低浏览器打开时样式丢失概率
-
HTML → DOCX
- 使用 LibreOffice 的 Writer HTML 导入器,解析 HTML/CSS 并导出 DOCX
- 对本程序生成的 HTML 回转 DOCX,视觉一致性更好
-
验收校验
- DOCX → PDF 渲染
- 将原始 DOCX 与回转 DOCX 的 PDF 页面转图片后做像素差异报告
依赖
1. 安装 LibreOffice
Linux 示例:
sudo apt-get update
sudo apt-get install -y libreoffice libreoffice-writer fonts-noto-cjk fontconfig
macOS:安装 LibreOffice 后,通常路径为:
/Applications/LibreOffice.app/Contents/MacOS/soffice
Windows:安装 LibreOffice 后,通常路径为:
C:\Program Files\LibreOffice\program\soffice.com
如程序找不到 LibreOffice,可以设置:
export SOFFICE_BIN=/path/to/soffice
2. 安装 Python 依赖
pip install -r requirements.txt
快速使用
DOCX 转 HTML
python converter.py docx2html demo/demo.docx output/demo.html
HTML 转 DOCX
python converter.py html2docx output/demo2.html output/demo2.back.docx
一键往返转换
python converter.py roundtrip demo/demo.docx output/roundtrip
一键往返并生成视觉差异报告
python converter.py roundtrip demo/demo.docx output/roundtrip --verify
生成文件示例:
output/roundtrip/demo.html
output/roundtrip/demo.roundtrip.docx
output/roundtrip/demo.visual-report.json
视觉报告字段说明:
{
"exact_page_count": true,
"page_reports": [
{
"page": 1,
"same_size": true,
"mean_abs_diff_0_255": 4.2738
}
]
}
exact_page_count=true:页数一致same_size=true:渲染页面尺寸一致mean_abs_diff_0_255:平均像素差异,越低越接近;复杂文档可设自己的验收阈值
生成测试 DOCX
项目里已经包含 demo/demo.docx。如果要重新生成:
python demo/make_demo_docx.py
Docker 使用
构建镜像:
docker build -t word-html-converter .
DOCX 转 HTML:
docker run --rm -v "$PWD:/work" word-html-converter \
docx2html /work/demo/demo.docx /work/output/demo.html
HTML 转 DOCX:
docker run --rm -v "$PWD:/work" word-html-converter \
html2docx /work/output/demo.html /work/output/demo.back.docx
关键设计说明
为什么不用 Mammoth 或 Pandoc 作为主引擎?
- Mammoth 更适合把 DOCX 转成语义清晰的 HTML,它明确不是为了逐像素复制 Word 样式。
- Pandoc 很适合文档格式互转,但更偏结构化内容转换,不适合要求高度还原 Word 页面排版的场景。
- LibreOffice Writer 的 DOCX/HTML 导入导出更接近真实办公软件排版结果,所以本项目把它作为主转换内核。
为什么 HTML 转 DOCX 要强制 HTML (StarWriter) 输入过滤器?
LibreOffice 默认可能把 HTML 当作 Web 文档打开,导致导出 DOCX 时出现“no export filter”或排版丢失。本项目使用:
--infilter="HTML (StarWriter)"
让 HTML 作为 Writer 文档导入,再导出 Office Open XML DOCX。
可选归档模式
DOCX 转 HTML 时可以加:
python converter.py docx2html input.docx output.html --embed-source
这样会把原始 DOCX 以 base64 形式嵌入 HTML。HTML 转 DOCX 时可加:
python converter.py html2docx output.html restored.docx --prefer-embedded-source
这适合“HTML 只用于预览/存档,希望完全恢复原始 DOCX”的场景。注意:如果用户在 HTML 中编辑了内容,使用该模式会恢复原 DOCX,不会合并 HTML 编辑内容。
已知边界
以下内容在开源转换链路中很难保证完全一致,需要单独测试:
- 复杂浮动图片、环绕方式、文本框、艺术字、SmartArt
- Word 域、目录、脚注尾注、批注、修订痕迹
- 复杂多级编号、样式继承、主题字体
- 页面级精确排版,如不同 Word/LibreOffice 版本的字体度量差异
- 浏览器编辑 HTML 后再转 DOCX,不能保证所有 CSS 都能被 Writer 完整识别
推荐验收标准
建议不要用“字节级相同”验收 DOCX,因为二次生成的 DOCX 内部 XML 顺序、关系 ID、压缩结果通常会变。建议用:
- 页数一致;
- 关键表格行列、合并单元格、图片数量一致;
- PDF 渲染视觉差异低于业务阈值;
- 典型复杂样例人工抽检。