DOCX 文档创建、编辑与分析
概述
用户可能要求你创建、编辑或分析 .docx 文件的内容。.docx 文件本质上是一个包含 XML 文件和其他资源的 ZIP 压缩包,你可以读取或编辑其中的内容。
本技能提供 2 级技术栈:标准流程(md2docx.py:pandoc + doc_styler)用于创建文档和内容提取,复杂流程(python-docx + OOXML)用于编辑已有文档、修订跟踪和批注。
输出规范
样式细节(字体/字号/配色/表格/行距/页脚)由 doc_styler.py 自动处理,以下仅列出 agent 在编写 Markdown 内容时需遵守的规则。
通用
- 正式法律交付物必须包含 AI 辅助、仅供参考、不构成正式法律意见或等价免责声明
- 合同修订版和带批注修订版正文不插入免责声明块,保持合同外观
- 禁止"保证胜诉""绝无风险""完全合规""一定合法"等绝对化法律结论
- 风险、状态、优先级不得只靠颜色表达,必须同时有文字标签
- 依据标签限定为:
[已核][待核][用规][事实][推定][用户提供][公开来源];不得临时自创或混用 - 文件名不得含 emoji;下载件采用可识别的主题和日期命名
word-report
- 全文不得含 emoji
word-revision
- 全文不得含 emoji
- 修订必须使用 OOXML
<w:ins><w:del><w:delText>标记,不得用"修改前/修改后"等内联文字或颜色/删除线冒充修订 - 保留原合同纸张、页边距和主体样式,不套报告品牌色
machine-template
- 产品上传模板、法院表单不得改变字段、列序、必填标记、隐藏元数据、校验规则或官方版式
- 必须提供模板一致性或回转测试,并在发布前通过
技术栈分级
| 级别 | 技术 | 适用场景 | 成本 |
|---|---|---|---|
| 标准 | pandoc + 模板 + Lua 过滤器 + doc_styler | 创建正式文档(Markdown → DOCX)、内容提取(DOCX → Markdown) | md2docx.py 一行命令 |
| 复杂 | Document 库 (python-docx) + OOXML | 编辑现有文档、修订跟踪、批注、DOM 级操作 | 需写 Python 脚本 |
升级原则:创建文档统一走标准流程(md2docx.py)。编辑已有文档、修订跟踪、批注、解包分析升级到 python-docx + OOXML。
工作流决策树
判断任务类型
用户需求
├─ 读取/分析文档内容
│ ├─ 只需文本 → read 工具直接读取
│ ├─ 需保留修订/格式 → 标准: pandoc 转 Markdown
│ └─ 需批注/结构/嵌入媒体 → 复杂: 解包 + 原始 XML 访问
│
├─ 创建新文档
│ └─ Markdown + pandoc + 模板 + doc_styler(统一标准流程,见下方"创建 Word 文档")
│
├─ 编辑现有文档
│ ├─ .doc 文件 → 先转 .docx(见"格式转换"章节),再按下方选择
│ │
│ ├─ 自己的文档 + 简单修改(替换文本/填充占位符) → 复杂: Document 库
│ ├─ 自己的文档 + 结构性修改(增删节/改样式/操作表格) → 复杂: Document 库
│ │
│ └─ 他人的文档(需修订标记)
│ ├─ 法律/学术/商业/政府文档 → 复杂: Redlining 工作流(必须)
│ └─ 普通文档 → 复杂: Redlining 工作流(推荐)
读取和分析内容
从 .docx 文件提取文本(pandoc)
如果只需读取 .docx 文档的文本内容,应使用 pandoc 将文档转换为 Markdown。Pandoc 能很好地保留文档结构,并可显示修订跟踪:
# 将文档转换为 Markdown,保留修订跟踪
pandoc --track-changes=all path-to-file.docx -o output.md
# 选项:--track-changes=accept/reject/all
原始 XML 访问
以下情况需要原始 XML 访问:批注、复杂格式、文档结构、嵌入媒体和元数据。要使用这些功能,需要解包文档并读取其原始 XML 内容。
解包文件
以下命令需在 skill 根目录(含
ooxml/子目录的目录)下执行,不是scripts/子目录。
python ooxml/scripts/unpack.py <office_file> <output_directory>
关键文件结构
word/document.xml- 主文档内容word/comments.xml- document.xml 中引用的批注word/media/- 嵌入的图片和媒体文件- 修订跟踪使用
<w:ins>(插入)和<w:del>(删除)标签
格式转换:将 .doc 转换为 .docx
处理旧版 .doc 文件时,直接用 read 工具读取内容即可。如需保留原始格式编辑,请用户先将其转换为 .docx:
- 在 Microsoft Word 中打开
.doc文件 - 另存为 → 选择
.docx格式 - 上传转换后的文件 以进行后续处理
注意:转换后,使用"编辑现有 Word 文档"工作流来修改生成的 .docx 文件。
创建 Word 文档(标准流程)
所有 Markdown → DOCX 创建统一走两步标准流程:pandoc 转换(律师规范模板 + Lua 过滤器)→ doc_styler.py 样式规范化 + 交付前自检。禁止 pandoc 裸输出直接交付。
工作目录约定:本技能所有命令的相对路径都以 skill 根目录为基准(即
SKILL.md所在目录),不是scripts/子目录。执行命令前请cd到 skill 根目录,例如cd "C:/Users/<用户名>/AppData/Roaming/RicheeAI/SKILLs/custom/Word文档处理"。
一行命令(md2docx.py)
python scripts/md2docx.py input.md -o output.docx
md2docx.py 自动完成 pandoc 转换 + doc_styler 样式化 + 自检。常用参数:
| 参数 | 说明 |
|---|---|
-o output.docx |
输出路径(默认同名 .docx) |
--profile word-report |
样式 profile(默认),可选 word-revision / none(跳过样式化) |
--doc-name "报告标题" |
页脚文档名称(仅 name-page / name-page-of-total 页脚格式需要) |
--footer-format page-of-total |
页脚格式(见下表,默认 page-of-total) |
页脚格式
| 值 | 效果 | 示例 |
|---|---|---|
page-only |
仅页码 | 3 |
name-page |
文档名 + 页码 | 审查意见书 | 3 |
page-of-total |
页码 / 总页数(默认) | 3 / 12 |
name-page-of-total |
文档名 + 页码 / 总页数 | 审查意见书 | 3 / 12 |
none |
无页脚 | — |
样式规范
md2docx.py 自动应用律师文书规范:宋体(含西文/CJK/复杂脚本统一)+ 1.5 倍行距 + 首行缩进 2 字符、标题统一黑色加粗、表头黑色加粗 + 细灰边框 + 动态列宽分配、AI 免责声明、页码页脚。返回空列表 = 自检通过。
手动分步(需要自定义时)
如需自定义模板或过滤器,手动分步执行:
# 1. pandoc 转换
pandoc input.md \
--reference-doc=scripts/templates/template.docx \
--lua-filter=scripts/markdown-to-docx.lua \
-o draft.docx
# 2. doc_styler 样式化
python -c "
from docx import Document
from doc_styler import apply_doc_style
doc = Document('draft.docx')
violations = apply_doc_style(doc, 'word-report', '文档名称')
if violations:
print('校验失败:', violations)
exit(1)
doc.save('final.docx')
"
Markdown 编写指南
对于内容优先的文档,使用语义化 Markdown:
- 标题
#~###### - 段落
- 无序列表和有序列表
- 表格(必须用 HTML
<table>语法,见下方"HTML 合并单元格表格") - 链接
- 引用块
> - 图片(内嵌本地文件
,pandoc 支持 PNG/JPEG/SVG) - 其他 HTML 片段(精确图片尺寸
<img width="300">、自定义样式<div style="...">)仅在 Markdown 不支持时使用
正式文档 Markdown 正文不得使用 emoji。用 [已核验]、[注意]、[高]、[中]、[低] 等文字标签替代 ✅ ⚠️ 🔴 🟡 🟢,在生成 md 阶段即控制好。
标题编号规范(律师文书)
模板的 Heading 样式已移除 <w:numPr>(禁止 Word 自动编号),标题序号需在 Markdown 中手工编写,按中国法律文书标准层级:
# 文档标题(不加序号)
## 一、一级标题 ← 中文数字 + 、
### (一)二级标题 ← 中文数字 + 括号
#### 1. 三级标题 ← 阿拉伯数字 + .
##### (1)四级标题 ← 阿拉伯数字 + 括号
序号由 Markdown 内容控制,不在模板里设自动编号,避免双份序号。
填空项与下划线
法律文档常含填空项(甲方名称、签署日期、签章位置、合同金额等),需保留下划线格式。Pandoc 原生支持 <u> 标签生成 Word 下划线,样式处理不会覆盖。
语法
| 场景 | 写法 | 说明 |
|---|---|---|
| 已填写内容 | <u>北京某某科技有限公司</u> |
内容保留下划线 |
| 空白填空线 | <u> </u> |
全角空格 + 下划线,视觉为空白线 |
| 全角下划线 | ____ |
直接用全角下划线字符 |
| 红色空缺标识 | <u><span style="color:red">待填写</span></u> |
未填写项标红提醒 |
示例
**甲方**:<u>北京某某科技有限公司</u>
**乙方**:<u><span style="color:red">待填写</span></u>
签署日期:2026 年<u> </u>月<u> </u>日
签署地点:<u> </u>
法定代表人:______ 联系电话:______
适用场景
- 合同主体信息(甲方/乙方名称、地址、法定代表人)
- 签署信息(日期、地点、签章位置)
- 金额、期限等可变条款
注意:
<u>标签与全角下划线_可混用,但同一文档内建议统一风格。红色空缺标识仅用于未填写项,填写后应移除红色样式。表格填空例外:表格单元格内的填空项不需要下划线。表格本身有边框线,下划线会造成视觉冗余。直接写内容或留空即可:
<td>待填写</td>或<td></td>。
表格
文档中所有表格统一使用 HTML <table> 语法,不使用标准 Markdown 表格(|...|...| 语法)。HTML 表格是 Markdown 表格的超集,支持合并单元格、列宽控制、单元格对齐等所有场景。
基本语法与合并单元格
用 colspan 跨列合并(rowspan 跨行支持有限,建议改用重复文本或调整结构):
<table>
<tr>
<th>条款编号</th>
<th>原条文内容</th>
<th>修改后内容</th>
<th>修改说明</th>
</tr>
<tr>
<td>第12条</td>
<td>合同期限为一年</td>
<td>合同期限为三年</td>
<td>延长合作周期</td>
</tr>
<tr>
<td colspan="4"><strong>备注:</strong>以上修改自2026年1月1日起生效。</td>
</tr>
</table>
属性支持
| 属性 | 支持 | 说明 |
|---|---|---|
colspan(跨列) |
完全 | 正确生成 w:gridSpan |
rowspan(跨行) |
部分 | 用空单元格替代 w:vMerge,视觉近似但非真正跨行合并 |
style="width:N%"(列宽) |
完全 | 第一行所有 <th>/<td> 都指定百分比时,跳过 doc_styler 动态计算 |
align(对齐) |
完全 | 见下方"单元格对齐" |
列宽指定
默认 doc_styler.py 根据内容长度动态计算列宽。如需精确控制,在第一行所有 <th>/<td> 上用 style="width:NN%" 指定百分比:
<table>
<tr>
<th style="width:30%">项目</th>
<th style="width:35%">招标人</th>
<th style="width:35%">招标代理机构</th>
</tr>
<tr>
<td>1</td>
<td>甲方</td>
<td>代理</td>
</tr>
</table>
规则:
- 必须覆盖第一行所有列位(缺一不可,否则回退动态计算)
- 只支持百分比(
width:30%),不支持px/em - 比例总和接近 100%(容差 ±5%)
- 含
colspan的表头:width按colspan平均分配(如colspan="2" style="width:40%"等价每列 20%) - 适用:招标书/合同附件等有标准列宽要求的表格,或需避免窄列被挤压的场景
单元格对齐
在 <td> / <th> 上使用 HTML align 属性:
<td align="center">内容</td>
<td align="left">内容</td>
<td align="right">内容</td>
支持值:center、left、right。未指定时默认左对齐。
注意:表格对齐用
align属性,不要用标准 Markdown 表格语法(| :---: |)——本技能所有表格统一用 HTML<table>。
段落对齐
段落对齐与表格对齐独立,通过 Fenced Div + class 控制段落左/中/右/两端对齐:
::: {.text-center}
居中的标题或正文
:::
::: {.text-right}
右对齐的署名或日期
:::
| Class | 对齐方式 | 典型场景 |
|---|---|---|
.text-center |
居中 | 标题、副标题、署名区 |
.text-right |
右对齐 | 日期、签名、页码 |
.text-left |
左对齐 | 正文(默认,一般无需显式使用) |
.text-justify |
两端对齐 | 法律文书正文、长段落(标准格式) |
规则:
:::标记必须独占一行,且与前面的块之间留空行。两种常见错误写法都会失效:① 写在段落文字中间;② 紧跟在段落文字行之后(无空行)——这两种情况下 pandoc 都会把:::吞进前一个段落当普通文本,对齐不生效(仅标题等块级元素之后可紧跟无空行)- 每个 Fenced Div 可包含多个段落,所有段落统一应用该对齐
- 支持嵌套:外层 Div 的对齐会透传到内层无对齐属性的 Div
- 与
.no-indent/.indent等缩进 class 可共存于同一 Div - 与其他 class 共存时,仅提取对齐相关 class,其余保留
- 不可与表格对齐混用(表格用
align属性)
首行缩进控制
模板默认正文段落首行缩进 2 字符。署名区、日期、引用块等场景需取消缩进时,通过 Fenced Div + class 控制:
:::: {.no-indent}
甲方:北京某某科技有限公司
签署日期:2026 年 8 月 13 日
::::
| Class | 效果 | 典型场景 |
|---|---|---|
.no-indent |
取消首行缩进 | 署名、日期、引用块 |
.indent |
强制首行缩进 2 字 | 覆盖 no-indent 嵌套 |
规则:
:::标记必须独占一行,且与前面的块之间留空行。两种常见错误写法都会失效:① 写在段落文字中间;② 紧跟在段落文字行之后(无空行)——这两种情况下 pandoc 都会把:::吞进前一个段落当普通文本,缩进不生效(仅标题等块级元素之后可紧跟无空行)- 与
.text-center/.text-right等对齐 class 可共存于同一 Div - 支持嵌套:外层
.no-indent透传到内层无缩进属性的 Div - 仅作用于段落(
Para/Plain),表格/列表/标题不受影响
分页符
法律文档常需在附件、签署栏、附录、独立说明页等位置强制分页(模板的 Heading 样式未配置自动分页,章节标题不会自动新起一页)。下列任一写法(独立成行,前后必须空行)会被自动识别并转换为 Word 分页符:
写法
| 写法 | 示例 | 适用场景 |
|---|---|---|
| 反斜杠命令 | \newpage |
简洁,推荐 agent 生成 |
| raw HTML(after) | <div style="page-break-after: always"></div> |
兼容 HTML 约定 |
| raw HTML(before) | <div style="page-break-before: always"></div> |
等价变体 |
示例
# 合同正文
(正文内容)
\newpage
# 附件一:标的物清单
(附件内容)
<div style="page-break-after: always"></div>
# 签署栏
甲方:________________
注意
- 前后必须空行,否则 pandoc 会将
\newpage当作行内文本,将<div>当作行内 HTML 处理 - 三种写法等价,同一文档内建议统一风格
- 不要把
---当作分页符——---是水平线(见下方"水平线"章节),不会分页;强制分页请用上述三种写法 - 模板未给 Heading 1 配置
pageBreakBefore,章节标题不会自动分页——如需"每个章节独立成页",必须在每个章节标题前显式加分页符;如希望所有 H1 自动分页,可在scripts/templates/template.docx的 Heading 1 样式里加<w:pageBreakBefore/>
水平线(---)
Markdown 的 --- 在标准语法中是水平线(horizontal rule),但 Pandoc 默认把它渲染为 VML <v:rect o:hr="t"/> 水平线对象,在 Word 中显示为可见横线,视觉突兀。
处理策略:md2docx.py 自动把 --- 转为带上下间距的空段落(保留视觉分隔感,无可见横线)。
使用建议:
- 在 markdown 中可放心使用
---作为章节间的视觉分隔,Word 输出为间距,不会出现横线 - 如果确实需要分页,不要用
---,应使用\newpage(见上方"分页符"章节) - 如果需要可见分隔线(如合同附件清单的视觉断点),用
<u> </u>(下划线空格)或表格整行单元格替代
文档内锚点跳转
在标题上定义锚点 ID,正文中引用即可在 Word 中点击跳转(Ctrl+点击):
## 三、合同主体 {#contract-parties}
合同主体条款详见[合同主体部分](#contract-parties),权利义务见[下文](#rights-obligations)。
### 3.1 权利义务 {#rights-obligations}
- 锚点 ID 必须为英文字母/数字/连字符(如
clause-3、rights-obligations),不要用中文 - 一个标题定义一个锚点,多处可引用同一锚点
- Pandoc 自动在目标标题处生成 Word 书签,链接处生成内部超链接
脚注
使用 [^id] 语法插入脚注,适合标注法规依据、引用来源:
违约金过分高于造成的损失[^1]。
[^1]: 《民法典》第585条第2款:约定的违约金过分高于造成的损失的,人民法院或者仲裁机构可以根据当事人的请求予以适当减少。
- 脚注自动编号,无需手动管理序号
- 脚注文本自动应用宋体 + 小字号样式
- 生成的 Word 中脚注引用为上标数字,点击可跳转到页脚脚注内容
DOCX → Markdown 反向转换
将 .docx 转回 Markdown 以便编辑或归档。
一行命令(docx2md.py)
# cwd = skill 根目录
python scripts/docx2md.py input.docx -o output.md
常用参数:
| 参数 | 默认 | 说明 |
|---|---|---|
-o, --output |
<input>.md |
输出路径 |
--media-dir |
./assets |
提取的图片目录 |
--to |
gfm |
pandoc 输出格式(gfm / markdown / commonmark 等) |
--wrap |
none |
换行模式(none / auto / preserve) |
-- 后参数 |
— | 透传给 pandoc,例如 --track-changes=all |
修订跟踪处理
如果 docx 含修订跟踪(<w:ins> / <w:del>),需要通过 -- 透传 pandoc 参数控制如何呈现:
# 接受所有修订后转换(默认行为,输出最终态)
python scripts/docx2md.py input.docx -o output.md
# 保留修订标记(含 ~~删除线~~ 和 [新增]{.ins} 等标记)
python scripts/docx2md.py input.docx -o output.md -- --track-changes=all
# 拒绝所有修订后转换(输出原始态)
python scripts/docx2md.py input.docx -o output.md -- --track-changes=reject
--track-changes 取值:accept(默认)/ all / reject。
直接用 pandoc(无封装)
如果不需要 docx2md.py 的封装(图片提取、参数透传),可直接调 pandoc:
pandoc input.docx -t markdown -o output.md
pandoc --track-changes=all input.docx -t markdown -o output.md
注意事项
- 标题中的
<w:b/>属性会被 pandoc 解析为**...**加粗标记(模板 Heading 样式自带 bold),转换后可能看到# **标题**这种形式,可手动去掉** gfm格式比 pandoc 原生markdown更通用,但表格语法略不同;如需保留 pandoc 扩展语法用--to markdown- 图片会被提取到
--media-dir指定目录,markdown 中以相对路径引用
高级编辑(按需阅读)
以下场景仅在编辑现有 Word 文档或执行 Redlining 修订跟踪时需要,新建文档无需参考。 详细工作流请查阅
advanced-editing.md。
| 场景 | 说明 | 入口 |
|---|---|---|
| 编辑现有文档 | 使用 Document 库修改已有 .docx | 编辑现有 Word 文档 |
| Redlining 修订 | 带修订跟踪的文档审阅工作流 | Redlining 修订工作流 |
代码风格指南
重要:为 DOCX 操作生成代码时:
- 编写简洁代码,避免冗长的变量名和多余操作
- Python 脚本:避免不必要的 print 语句,用
sys.exit(1)明确退出码
依赖
标准流程(md2docx.py)
- python-docx:
pip install python-docx(doc_styler.py / md2docx.py / docx2md.py 依赖)
复杂(Document 库 + OOXML 工具)
- defusedxml:
pip install defusedxml(安全的 XML 解析) - 使用前必须完整阅读
ooxml.md