| name | docx-writer |
| description | 将法律文书内容生成为 DOCX 文件(python-docx)。覆盖起诉状、强制执行申请书、利息计算表三个场景。
用户无需 MD 编辑器——Word/WPS 打开即编辑,填空位直接打字替换,A4 打印即可提交法院。
|
版本:v1.0 | 日期:2026-06-17
定位:面向普通用户的 DOCX 文书生成器——轻量,零配置,python-docx 标准库
DOCX 文书生成器
核心原则
- 普通用户直接用——输出 .docx,Word/WPS 打开即编辑,不需要技术工具
- 填空位用下划线——
______,用户点进去直接打字替换,不需要"开发工具→控件"
- 字体就两种——标题 黑体 小二加粗,正文 仿宋 四号,表格 宋体 五号
- A4 标准页面——上下 2.54cm,左右 3.17cm,段后 0.5 行
- 不依赖 .NET——纯 Python + python-docx,pip install 即可
禁止行为
- ❌ 生成 MD 格式的文书
- ❌ 使用 NPOI / OpenXML SDK(需要 .NET)
- ❌ 使用"开发工具→控件"方式做填空(普通用户不会操作)
- ❌ 使用复杂 Word 功能(分节符、页眉页脚、样式继承)
三个输出场景
场景 1:起诉状
触发:用户要求起草起诉状 / 生成起诉状 DOCX
格式要求:
- 标题:"民事起诉状",居中,黑体,小二,加粗
- 当事人信息:仿宋四号,"原告:,身份证号:,住址:______"
- 诉讼请求:仿宋四号,编号 "一、" "二、" "三、"
- 事实与理由:仿宋四号,正文
- 落款:"此致\n______人民法院",右对齐,"具状人:\n日期:"
填空位:所有真人信息处用 ______ 占位,不下划线(避免打印问题),用仿宋四号
场景 2:强制执行申请书
触发:用户要求申请强制执行 / 生成执行申请书 DOCX
格式要求:
- 标题:"强制执行申请书",居中,黑体,小二,加粗
- 申请人/被执行人信息:仿宋四号
- 申请事项:仿宋四号,含本金+利息+迟延履行金
- 执行依据:仿宋四号,含案号+判决生效日期
- 财产线索:仿宋四号(可留空,标注"以下如有线索请填写")
- 落款:右对齐
场景 3:利息/诉讼费计算表
触发:用户要求计算利息 / 诉讼费 / 生成计算表格 DOCX
格式要求:
- 标题:"利息计算明细" 或 "诉讼费用计算表",居中,黑体,小二
- 用 Word 表格(
docx.table),列:起算日 | 截止日 | 天数 | 本金 | 利率 | 利息 | 法条依据
- 表格:宋体五号,表头加粗,金额列右对齐
- 表格下方:计算结果汇总 + 计息公式说明
技术实现
from docx import Document
from docx.shared import Pt, Cm, Inches, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn
def setup_page(doc):
section = doc.sections[0]
section.page_width = Cm(21)
section.page_height = Cm(29.7)
section.top_margin = Cm(2.54)
section.bottom_margin = Cm(2.54)
section.left_margin = Cm(3.17)
section.right_margin = Cm(3.17)
def set_font(run, name_cn, name_en, size, bold=False):
run.font.size = Pt(size)
run.bold = bold
run.font.name = name_en
r = run._element
r.rPr.rFonts.set(qn('w:eastAsia'), name_cn)
def add_title(doc, text):
"""黑体小二加粗居中"""
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.paragraph_format.space_after = Pt(12)
run = p.add_run(text)
set_font(run, '黑体', 'SimHei', 18, bold=True)
def add_body(doc, text):
"""仿宋四号"""
p = doc.add_paragraph()
p.paragraph_format.space_after = Pt(6)
p.paragraph_format.first_line_indent = Pt(28)
run = p.add_run(text)
set_font(run, '仿宋', , )
():
p = doc.add_paragraph()
p.paragraph_format.space_after = Pt()
run = p.add_run(text)
set_font(run, , , )
():
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.RIGHT
p.paragraph_format.space_after = Pt()
run = p.add_run(text)
set_font(run, , , )
():
table = doc.add_table(rows= + (rows), cols=(headers))
table.style =
header_cells = table.rows[].cells
i, h (headers):
header_cells[i].text =
p = header_cells[i].paragraphs[]
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run(h)
set_font(run, , , , bold=)
shading = header_cells[i]._element.get_or_add_tcPr()
shd = shading.makeelement(qn(), {
qn(): ,
qn():
})
shading.append(shd)
run.font.color.rgb = RGBColor(, , )
r, row (rows):
cells = table.rows[r + ].cells
c, val (row):
cells[c].text =
p = cells[c].paragraphs[]
c >= (headers) - :
p.alignment = WD_ALIGN_PARAGRAPH.RIGHT
run = p.add_run((val))
set_font(run, , , )
doc.add_paragraph()
table
():
doc = Document()
setup_page(doc)
add_title(doc, )
add_blank_line(doc, )
add_blank_line(doc, )
add_blank_line(doc, )
add_blank_line(doc, )
doc.add_paragraph()
add_blank_line(doc, )
i, req (data.get(, []), ):
add_body(doc, )
doc.add_paragraph()
add_blank_line(doc, )
para data.get(, []):
add_body(doc, para)
doc.add_paragraph()
add_signature(doc, )
add_signature(doc, )
doc.add_paragraph()
add_signature(doc, )
add_signature(doc, )
doc.save(output_path)
output_path
():
[,,,,,,,,,][n-]
():
doc = Document()
setup_page(doc)
add_title(doc, )
add_blank_line(doc, )
add_blank_line(doc, )
add_blank_line(doc, )
add_blank_line(doc, )
doc.add_paragraph()
add_blank_line(doc, )
add_body(doc, )
add_body(doc, )
add_body(doc, )
doc.add_paragraph()
add_blank_line(doc, )
add_body(doc, )
doc.add_paragraph()
add_blank_line(doc, )
add_body(doc, )
add_body(doc, )
add_body(doc, )
add_body(doc, )
doc.add_paragraph()
add_signature(doc, )
add_signature(doc, )
doc.add_paragraph()
add_signature(doc, )
add_signature(doc, )
doc.save(output_path)
output_path
():
doc = Document()
setup_page(doc)
add_title(doc, title)
create_table(doc, headers, rows)
note:
add_body(doc, note)
doc.save(output_path)
output_path
执行流程
用户要求生成文书(起诉状/申请书/计算表)
→ 1. 从对话中提取所有已知信息(姓名、金额、日期、案号等)
→ 2. 未知信息用"______"填空(绝不编造)
→ 3. 调用 python-docx 按对应场景生成 .docx
→ 4. 告知用户文件路径,提醒:"用 Word 打开,在横线上填写你的信息"
→ 5. 列出来源标注(哪些信息来自对话、哪些需要用户补充)
与其他技能的衔接
| 上游技能 | 提供内容 | 本技能输出 |
|---|
| 强制执行 | 申请书内容+利息数据 | 强制执行申请书.docx + 利息计算明细.docx |
| legal-calculator | 利息/诉讼费计算结果 | 利息计算明细.docx |
| agent MD Step 2 | 起诉状模板内容 | 民事起诉状.docx |
当用户说"帮我生成起诉状文档"或"导出成 Word"时,自动调用本技能。