你手上有一堆 Word 合同、隐私协议、服务条款、EULA……内容没问题,但排版乱七八糟——字体不统一、行距忽大忽小、首行缩进有的有有的没有。
FormaCN 就是解决这个问题的。
丢进去一个 .docx,出来一份严格符合 国标 GB/T 9704—2012 公文格式的文档。不改你一个字,不动你的修订和批注。
| 调整前 | 调整后 |
|---|---|
| 混用宋体/黑体/Times New Roman | 统一标题小标宋 + 正文仿宋 + 英文 TNR |
| 行距参差不齐 | 固定 28 磅 |
| 首行缩进不一致 | 统一缩进 2 字符 |
| 页边距随意 | 上 3.7 / 下 3.5 / 左 2.8 / 右 2.6 cm |
| 修订/批注可能被破坏 | 完美保留 ✅ |
# 安装
pip install python-docx
git clone https://github.com/YOUR_USER/forma-cn.git
cd forma-cn
# 格式化一份合同
python -m forma_cn.cli 合同.docx
# 批量格式化
python -m forma_cn.cli *.docx
# 自定义输出
python -m forma_cn.cli 合同.docx --suffix _v2 --out-dir ./输出如果你在用 Claude Code,可以直接把这个仓库当作 skill 安装:
# 克隆到 skills 目录
git clone https://github.com/YOUR_USER/forma-cn.git \
~/.claude/skills/forma-cn然后在对话中直接说:
"帮我格式化这几份合同" "按公文标准排版" "跑一下 GB/T 9704 格式"
Claude 会自动调用 FormaCN 进行处理。
from forma_cn.formatter import FormatEngine
# 一行初始化,一行运行,一行保存
engine = FormatEngine("用户协议.docx")
engine.run()
engine.save("用户协议_格式化.docx")就这么简单。
| 要素 | 标准值 |
|---|---|
| 纸张 | A4(210 × 297 mm) |
| 页边距 | 上 37 mm / 下 35 mm / 左 28 mm / 右 26 mm |
| 标题字体 | 二号方正小标宋简体(22 pt)居中 |
| 章节标题 | 三号黑体(16 pt)加粗,左对齐 |
| 正文字体 | 三号仿宋(16 pt) |
| 首行缩进 | 2 字符(32 pt) |
| 行距 | 固定值 28 磅 |
| 英文/数字 | Times New Roman |
| 项目符号 | 悬挂缩进,无首行缩进 |
- ✅ 保留 Track Changes(修订)——所有插入/删除标记完好
- ✅ 保留批注引用——不破坏批注锚点
- ✅ 保留原文内容——一个字不改
- ✅ 支持中英文混排——中西文分别设置字体
- ✅ 支持复杂合同结构——多级章节标题、项目符号、条款编号自动识别
- 模板管不了已经写好的文档
- 模板不处理修订模式下的格式
- 模板遇到中英文混排经常翻车
- 你可能有几百份合同要批量处理
forma-cn/
├── SKILL.md # Claude Code skill 定义(即装即用)
├── README.md # 就是本文件
├── pyproject.toml # Python 包配置
├── forma_cn/ # 核心代码
│ ├── cli.py # 命令行入口
│ ├── classifier.py # 段落分类(标题/章节/正文/项目符号)
│ ├── fonts.py # 字体与字号定义
│ └── formatter.py # 格式化引擎(核心)
- 段落分类——扫描文档,根据样式名和文本内容,把每一段识别为「标题」「章节标题」「项目符号」或「正文」
- 段落格式化——根据分类设置对齐方式、缩进、行距、段前段后间距
- 逐 run 设置字体——在 XML 层面修改每个 run 的字体,绕过 python-docx 对修订标记的限制
- 输出——保存为新文件,原文原封不动
整件事不需要 Word 在后台运行,纯 Python 处理 OOXML。
MIT