基于 GB/T 9704-2012 党政机关公文格式标准,适用于各级机关单位生成正式公文。
# -*- coding: utf-8 -*-)项目标准值纸张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行
要素字体字号加粗说明发文字号仿宋_GB231216pt否左对齐/居中/右对齐,年份用六角括号 〔〕,如 陕XX〔2026〕28号, 不得 用方括号 【】公文标题方正小标宋简体22pt否居中主送机关仿宋_GB231216pt否顶格正文仿宋_GB231216pt否首行缩进0.85cm一级标题黑体16pt否首行缩进0.85cm二级标题楷体_GB231216pt否首行缩进0.85cm落款仿宋_GB231216pt否右对齐,右侧空4汉字日期仿宋_GB231216pt否右对齐,右侧空4汉字联系方式仿宋_GB231216pt否首行缩进0.85cm页码宋体(半角)14pt否见页码格式规范
项目规定发文机关全称右对齐,右侧空4汉字成文日期右对齐,右侧空4汉字日期写法年月日写全,如 2026年3月31日字体字号仿宋_GB2312,3号(16pt)
实现说明:脚本通过设置段落右对齐 + 右缩进 Twips(1280)(约4个汉字宽度)实现落款距右4汉字的效果。
位置:落款日期下方空1行
字体字号:仿宋_GB2312,3号(16pt),首行缩进0.85cm
配置方式:支持三种输入模式
字符串模式(直接使用,自动用中文括号包裹) python
"contact": "联系人:张三 电话:029-XXXXXXXX,地址:陕西省西安市XXX"
结构化字典模式(自动格式化,字段间用指定分隔符连接) python
"contact": {
"联系人": "张三",
"电话": "029-XXXXXXXX",
"地址": "陕西省西安市XXX"
}
None(不显示联系方式) python
"contact": None
格式选项(通过 contactFormat 配置)
选项类型默认值说明bracketboolTrue是否用中文括号 ( ) 包裹整段联系方式separatorstr" "结构化模式下的字段间分隔符
配置示例
python
CONFIG = {
# 简单字符串模式
"contact": "联系人:张三 电话:029-XXXXXX/181XXXXXXXX",
# 或结构化字典模式
"contact": {
"联系人": "赵传洪",
"电话": "029-XXXXXX/181XXXXXXXX"
},
# 格式选项
"contactFormat": {
"bracket": True, # 用中文括号包裹
"separator": " " # 字段间用两个空格分隔
}
}
输出示例(字符串模式,bracket=True)
text
(联系人:张三 电话:029-XXXXXX/181XXXXXXXX)
输出示例(结构化模式,bracket=True)
text
(联系人:张三 电话:029-XXXXXX/181XXXXXXXX)
输出示例(bracket=False)
text
联系人:张三 电话: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 生成脚本时的注意事项:
("h2", ...) + ("normal", ...) —— 脚本内部处理即可\n 分隔第一条,后续正文用 ("normal", ...) 单独写)单个附件: 附件:文件名
多个附件: text
附件:1.文件名1
2.文件名2
(编号左对齐)
use_skill("official-document")scripts/generate_docx.py 到工作目录python generate_docx.py重要:所有字符串使用三引号 """...""" 包裹,避免文本内容中的引号与字符串分隔符冲突。
python
# 正确示例:正文内容含中文弯引号时,必须用三引号包裹
text = """切实发挥中文弯引号的作用"""
# 错误示例
contact = "联系人:XX.." # 文本中有逗号可能没问题,但引号会有问题
中文排版引号为弯引号字符, 区分左右(左引号和右引号不同)。生成脚本时必须原样保留用户输入的引号,不得替换为英文直引号。
注意:Markdown 无法正确显示中文弯引号,因此严禁在 SKILL.md 或代码示例中展示引号字符来"示范正确用法"。
text
official-document/
├── SKILL.md # 本文档
├── scripts/
│ └── generate_docx.py # Python生成脚本(含页码实现)
├── references/
│ └── gbt9704-2012.md # GB/T 9704-2012 标准全文
└── assets/
└── template_docx.js # JavaScript模板示例