Word 公文格式规范化
概述
将任意 .docx 文档按公文格式规范一键格式化。核心能力由 scripts/format_docx.py
实现:基于 python-docx,通过直接操作 OOXML(rFonts 的 eastAsia、docGrid、
fldSimple 页码域、evenAndOddHeaders)解决 python-docx 原生不支持中文字体、
文档网格、奇偶页页码等关键问题。
格式规范的权威来源见 references/format_spec.md,需核对具体数值时加载该文件。
触发场景
- “把这篇 Word 排成公文格式 / 规范格式”
- “按公文要求设置字体、字号、行距、页码”
- “方正小标宋 / 方正仿宋 / 三号字 / 固定行距29磅”
- “标题层级:一、(一)1.(1)的字体怎么设”
- “页码单数居右、偶数居左空1字”
- “每页22行每行26字怎么设置”
运行环境准备
脚本依赖 python-docx。使用受管理的 Python venv:
VENV_PY="C:\Users\Administrator\.workbuddy\binaries\python\envs\default\Scripts\python.exe"
若 venv 不存在或缺少 python-docx,先准备环境(仅首次):
PY="C:\Users\Administrator\.workbuddy\binaries\python\versions\3.13.12\python.exe"
VENV="C:\Users\Administrator\.workbuddy\binaries\python\envs\default"
[ -d "$VENV" ] || "$PY" -m venv "$VENV"
"$VENV\Scripts\python.exe" -m pip install --quiet python-docx
工作流程
1. 确认输入与需求
- 取得用户待格式化的 .docx 文件路径(绝对路径)。
- 确认输出路径;默认在同目录生成
原文件名_公文格式.docx,避免覆盖原件。 - 若用户提出与默认规范不同的要求(如字号、边距、是否要页码),记录并据此调整脚本参数。
完整规范见references/format_spec.md。
2. 运行格式化脚本
SCRIPT="C:\Users\Administrator\.workbuddy\skills\word-gongwen-format\scripts\format_docx.py"
"$VENV_PY" "$SCRIPT" "<输入.docx>" "<输出.docx>"
常用选项:
- --title-paragraphs N:前 N 个非空段落作为大标题区(默认 1)。文档大标题
跨多行时按实际行数设置。
- --subtitle-paragraphs N:大标题之后、第一个一级标题之前的 N 段作为副标题
(方正楷体三号),默认 1;无副标题时设 0。
- --no-page-number:不生成奇偶页页码。
- --grid lines|snapToChars|none:文档网格类型,默认 lines(行网格,保证每页约22行)。
- --help-config:打印当前格式配置后退出,用于向用户展示将应用的规范。
3. 默认格式规范速查
| 对象 | 字体 | 字号 | 其他 |
|---|---|---|---|
| 大标题 | 方正小标宋_GBK | 二号(22pt) | 第一个非空段落 |
| 大标题下 | 方正楷体_GBK | 三号(16pt) | 副标题区 |
| 一级(一、) | 方正黑体_GBK | 三号 | — |
| 二级(一) | 方正楷体_GBK | 三号 | — |
| 三级(1.) | 方正仿宋_GBK | 三号 | — |
| 四级(1) | 方正仿宋_GBK | 三号 | 加粗 |
| 正文 | 方正仿宋_GBK(数字字母 Times New Roman) | 三号 | — |
| 页码 | 宋体 | 四号(14pt) | 奇右偶左空1字 |
页面:A4,边距 上3.5/下2.9/左2.55/右2.55cm,页脚1.75cm,行距固定值29磅,
文档网格 linePitch=580(每页约22行)。
4. 标题层级自动识别
脚本按段落首部编号模式判断层级,无需用户标注:
- 一级:^[一二三四五六七八九十百]+、(一、二、…)
- 二级:^[((][一二三四五六七八九十百]+[))]((一)(二)…,兼容中英文括号)
- 三级:^\d+[\..](1. 2. …,兼容中英文句点)
- 四级:^[((]\d+[))]((1)(2)…,兼容中英文括号)
匹配顺序为 一级 → 二级 → 四级 → 三级,避免 (1) 被误判。无法识别的段落按正文处理。
5. 验证与交付
- 运行后向用户报告输出路径,并提示:方正字体需在查看机器上安装才能正确渲染,
未安装时 Word 会回退默认字体,但文档内字体名已正确保存。 - 如用户需进一步调整(如大标题居中、首行缩进、特定段落字体),在脚本输出基础上
用 Word 或 python-docx 二次微调;不要直接改用户原件。
注意事项
- 中文字体必须设置 eastAsia:python-docx 的
run.font.name仅影响西文字符,
中文字符需写w:rFonts的w:eastAsia,否则 Word 用默认宋体渲染。脚本已处理,
二次开发时勿遗漏。 - 字体可用性:方正小标宋_GBK、方正黑体_GBK、方正楷体_GBK、方正仿宋_GBK 需在
目标机器安装。可从方正字库官方获取“方正公文系列字体”。 - 不覆盖原件:始终输出到新文件,保留原始文档。
- 多 section 文档:脚本对每个 section 独立设置页面与页码;若文档有复杂分节,
先与用户确认分节是否需要不同设置。 - 大标题跨多行:若文档大标题实际占多行,用
--title-paragraphs指定行数,
否则第二行会被误判为副标题或正文。
资源
scripts/format_docx.py:核心格式化脚本,自包含、带 argparse,可直接命令行运行。references/format_spec.md:完整格式规范参考,含实现说明与字号对照表,需核对
具体数值或向用户解释规则时加载。