official-document - 通用机关公文技能
基于 GB/T 9704-2012 党政机关公文格式标准,适用于各级机关单位生成正式公文。
适用场景
- 生成党政机关公文(通知、请示、报告、函等)
- 按国家标准排版的正式文档
- 需要规范格式的红头文件
技术方案
- 语言: Python 3
- 库: python-docx
- 编码: UTF-8(文件头声明
# -*- coding: utf-8 -*-)
核心格式参数(GB/T 9704-2012)
| 项目 | 标准值 | |------|--------| | 纸张 | A4 | | 上边距 | 3.7cm | | 下边距 | 3.5cm | | 左边距 | 2.8cm | | 右边距 | 2.6cm | | 页眉距纸边 | 1.5cm | | 页脚距纸边 | 2.5cm | | 公文标题 | 方正小标宋简体 22pt,不加粗,居中 | | 正文 | 仿宋_GB2312 16pt,首行缩进0.85cm | | 一级标题 | 黑体 16pt,不加粗 | | 二级标题 | 楷体_GB2312 16pt,不加粗 | | 行距 | 固定28.5磅 | | 页码 | 半角宋体(宋体)14pt,格式"— N —",单页右空一字,双页左空一字 |
公文结构规范
发文字号格式
- 年份必须使用六角括号
〔〕,格式:机关代字〔年份〕顺序号 - 示例:
陕XX〔2026〕28号、中XX〔2026〕28号 - 严禁使用方括号
【】或其他括号代替 - 对齐方式:支持
left(左对齐)、center(居中)、right(右对齐),默认center
各部分间距
| 位置 | 间距要求 | |------|----------| | 发文字号 → 标题 | 空2行 | | 标题 → 主送机关 | 空1行 | | 主送机关 → 正文 | 直接连接,正常行距 | | 正文段落之间 | 正常行距,无额外段前段后 | | 附件前 | 空1行 | | 落款前 | 空3行 | | 落款 → 日期 | 同一行或相邻行,右对齐,右侧空4汉字 | | 日期 → 联系方式 | 空1行 |
标题字体规范
| 要素 | 字体 | 字号 | 加粗 | 说明 |
|------|------|------|------|------|
| 发文字号 | 仿宋_GB2312 | 16pt | 否 | 左对齐/居中/右对齐,年份用六角括号 〔〕,如 陕XX〔2026〕28号,不得用方括号 【】 |
| 公文标题 | 方正小标宋简体 | 22pt | 否 | 居中 |
| 主送机关 | 仿宋_GB2312 | 16pt | 否 | 顶格 |
| 正文 | 仿宋_GB2312 | 16pt | 否 | 首行缩进0.85cm |
| 一级标题 | 黑体 | 16pt | 否 | 首行缩进0.85cm |
| 二级标题 | 楷体_GB2312 | 16pt | 否 | 首行缩进0.85cm |
| 落款 | 仿宋_GB2312 | 16pt | 否 | 右对齐,右侧空4汉字 |
| 日期 | 仿宋_GB2312 | 16pt | 否 | 右对齐,右侧空4汉字 |
| 联系方式 | 仿宋_GB2312 | 16pt | 否 | 首行缩进0.85cm |
| 页码 | 宋体(半角) | 14pt | 否 | 见页码格式规范 |
落款格式规范(GB/T 9704-2012 §7.3.5)
| 项目 | 规定 |
|------|------|
| 发文机关全称 | 右对齐,右侧空4汉字 |
| 成文日期 | 右对齐,右侧空4汉字 |
| 日期写法 | 年月日写全,如 2026年3月31日 |
| 字体字号 | 仿宋_GB2312,3号(16pt) |
实现说明:脚本通过设置段落右对齐 + 右缩进 Twips(1280)(约4个汉字宽度)实现落款距右4汉字的效果。
联系方式格式规范
位置:落款日期下方空1行
字体字号:仿宋_GB2312,3号(16pt),首行缩进0.85cm
配置方式:支持三种输入模式
-
字符串模式(直接使用,自动用中文括号包裹)
"contact": "联系人:张三 电话:029-XXXXXXXX,地址:陕西省西安市XXX" -
结构化字典模式(自动格式化,字段间用指定分隔符连接)
"contact": { "联系人": "张三", "电话": "029-XXXXXXXX", "地址": "陕西省西安市XXX" } -
None(不显示联系方式)
"contact": None
格式选项(通过 contactFormat 配置)
| 选项 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| bracket | bool | True | 是否用中文括号 ( ) 包裹整段联系方式 |
| separator | str | " " | 结构化模式下的字段间分隔符 |
配置示例
CONFIG = {
# 简单字符串模式
"contact": "联系人:张三 电话:029-XXXXXX/181XXXXXXXX",
# 或结构化字典模式
"contact": {
"联系人": "赵传洪",
"电话": "029-XXXXXX/181XXXXXXXX"
},
# 格式选项
"contactFormat": {
"bracket": True, # 用中文括号包裹
"separator": " " # 字段间用两个空格分隔
}
}
输出示例(字符串模式,bracket=True)
(联系人:张三 电话:029-XXXXXX/181XXXXXXXX)
输出示例(结构化模式,bracket=True)
(联系人:张三 电话:029-XXXXXX/181XXXXXXXX)
输出示例(bracket=False)
联系人:张三 电话:029-XXXXXX/181XXXXXXXX
页码格式规范
依据 GB/T 9704-2012 §6.7,页码规则如下:
| 项目 | 规定 |
|------|------|
| 格式 | — N —(半角破折号,中间为阿拉伯数字) |
| 字体 | 宋体(半角),4号(14pt) |
| 位置 | 版心下边缘之下(页脚区域) |
| 单页(奇数页) | 右对齐,右侧空一个全角字符 |
| 双页(偶数页) | 左对齐,左侧空一个全角字符 |
实现说明:脚本中通过 Word 的奇偶页不同页脚功能实现,奇数页页脚右对齐并在末尾添加全角空格,偶数页页脚左对齐并在开头添加全角空格。配置项 showPageNumber: True 即可启用。
二级标题与正文字体隔离规范
问题背景:python-docx 在同一段落中设置不同 run 的字体时,Word 渲染可能因样式继承导致二级标题(楷体_GB2312)的字体"溢出"到紧随的正文部分,使整段都变成楷体。
解决方案:脚本对 h2 类型自动执行字体拆分,将标题部分和正文部分创建为独立 run,各自强制声明 ascii + hAnsi + eastAsia 三个字体槽位,实现 100% 字体隔离。
支持三种 CONTENTS 写法:
| 模式 | 写法示例 | 识别规则 | 渲染效果 |
|------|---------|----------|---------|
| 纯标题 | ("h2", "(一)创新学习机制,激发内生动力") | 无句号,或句号在末尾且后面无内容 | 整段楷体(向后兼容) |
| 同段落 | ("h2", "(一)创新学习机制,激发内生动力。改变以往……") | 第一个句号后有文字 | 楷体 run + 仿宋 run,同一段落 |
| 换行 | ("h2", "(一)创新学习机制\n改变以往……") | 文本含 \n | 标题段落(楷体)+ 正文段落(仿宋) |
识别优先级:\n 换行符 → 第一个句号分界 → 纯标题兜底
AI 生成脚本时的注意事项:
- 当用户给的二级标题文本中包含正文内容时,应原样写入 CONTENTS,脚本会自动拆分
- 不要手动拆分成多条
("h2", ...)+("normal", ...)—— 脚本内部处理即可 - 如果正文内容本身较短、适合紧跟标题,优先使用同段落模式(用句号分隔)
- 如果正文内容较长或多段落,优先使用换行模式(用
\n分隔第一条,后续正文用("normal", ...)单独写)
附件格式
- 单个附件:
附件:文件名 - 多个附件:
(编号左对齐)附件:1.文件名1 2.文件名2
使用方法
- 加载技能:
use_skill("official-document") - 复制
scripts/generate_docx.py到工作目录 - 修改 CONFIG 配置和 CONTENTS 正文内容
- 运行
python generate_docx.py
Python 编码注意事项
重要:所有字符串使用三引号 """...""" 包裹,避免文本内容中的引号与字符串分隔符冲突。
# 正确示例:正文内容含中文弯引号时,必须用三引号包裹
text = """切实发挥中文弯引号的作用"""
# 错误示例
contact = "联系人:XX.." # 文本中有逗号可能没问题,但引号会有问题
中文引号必须原样保留
中文排版引号为弯引号字符,区分左右(左引号和右引号不同)。生成脚本时必须原样保留用户输入的引号,不得替换为英文直引号。
注意:Markdown 无法正确显示中文弯引号,因此严禁在 SKILL.md 或代码示例中展示引号字符来"示范正确用法"。
文件结构
official-document/
├── SKILL.md # 本文档
├── scripts/
│ └── generate_docx.py # Python生成脚本(含页码实现)
├── references/
│ └── gbt9704-2012.md # GB/T 9704-2012 标准全文
└── assets/
└── template_docx.js # JavaScript模板示例
扫码联系在线客服