Skill: hunkguo/official-document-template (version 1.0.1)

--- name: official-document description: 公文排版工具。将Markdown格式内容转换为符合GB/T 9704-2012标准的Word文档。当用户需要制作通知、请示、报告、批复、意见等公文时触发。 --- # 公文排版工具 将Markdown格式的公文内容转换为符合《党政机关公文格式》（GB/T 9704-2012）标准的Word文档。 ## 支持的公文类型 - 通知 - 请示 - 报告 - 批复 - 意见 - 函 - 会议纪要 - 决定 ## 标题层次规范 | 层级 | 格式 | 字体 | 示例 | |------|------|------|------| | 一级 | 一、二、三、 | 黑体，三号 | 一、加强组织领导 | | 二级 | （一）（二）（三） | 楷体，三号加粗 | （一）明确工作目标 | | 三级 | 1. 2. 3. | 仿宋，三号加粗 | 1.制定实施方案 | | 四级 | （1）（2）（3） | 仿宋，三号 | （1）细化任务分工 | | 五级 | ①②③ | 仿宋，三号 | ①落实责任主体 | **注意**： - 一级标题后用顿号"、" - 二级及以下标题后不加标点 - 标题末尾不加标点符号 ## 页面格式（GB/T 9704-2012） ``` 纸张：A4（210mm × 297mm） 页边距：上37mm，下35mm，左28mm，右26mm 正文字号：三号（16pt） 正文字体：仿宋 行距：28磅 每页：22行 × 28字 ``` ## 执行脚本 ```bash python3 ~/.openclaw/workspace/official-document-template/scripts/convert_to_docx.py input.md --output output.docx ``` ## 使用流程 1. 用户提供公文内容（Markdown或纯文本） 2. 识别公文类型和结构 3. 应用国标样式转换 4. 输出Word文档 ## 输入示例 ```markdown # 关于加强环境保护工作的通知 ××发〔2024〕10号 各单位： 一、总体要求 （一）指导思想 以XXX为指导... 二、重点任务 （一）强化污染防治 1.加强污染防治 2.推进环境治理 三、保障措施 （此件公开发布） ××××× 2024年3月19日 ``` ## 输出 生成的Word文档将： - 自动识别并格式化各级标题 - 应用国标字体和字号 - 设置正确的页边距和行距 - 首行缩进两字符 ## 注意事项 - 确保系统安装了仿宋、黑体、楷体字体 - 如需方正小标宋，需单独下载安装 - 生成的文档可在Word/WPS中进一步调整 ## 依赖 ```bash pip install python-docx ```

path: 公文排版规范.md
content: # 公文排版规范

按照《党政机关公文格式》（GB/T 9704-2012）国家标准制作公文。

## 一、标题层次

公文标题层次采用以下格式（从大到小）：

| 层级 | 格式 | 示例 |
|------|------|------|
| 第一级 | 一、二、三、 | 一、关于加强环境保护工作 |
| 第二级 | （一）（二）（三） | （一）明确工作目标 |
| 第三级 | 1. 2. 3. | 1.制定实施方案 |
| 第四级 | （1）（2）（3） | （1）细化任务分工 |
| 第五级 | ①②③ | ①落实责任主体 |

**注意事项：**
- 第一级标题后用顿号"、"，其他级别不用标点
- 标题末尾不加标点符号
- 标题一般独占一行，前后各空一行

---

# 二、页面设置

```
纸张：A4（210mm × 297mm）
页边距：
  - 上：37mm
  - 下：35mm
  - 左：28mm
  - 右：26mm

正文字体：
  - 字号：三号（16pt）
  - 字体：仿宋_GB2312 或 仿宋
  - 行距：28磅

每页行数：22行
每行字数：28字
```

---

# 三、公文结构模板

## 〔标题〕：方正小标宋简体，二号

### 发文机关标志

**发文字号**：××发〔2024〕×号

---

**签发人**：××× ×××（上行文需标注）

---

<br>

## 正文（仿宋，三号）

**一、一级标题（黑体，三号）**

正文内容...

**（一）二级标题（楷体，三号，加粗）**

正文内容...

1. 三级标题（仿宋，三号，加粗）

正文内容...

（1）四级标题（仿宋，三号）

正文内容...

---

<br>

## 落款

发文机关名称（右下角）

成文日期：2024年×月×日（阿拉伯数字）

---

<br>

## 印章

（印章盖在成文日期上方，骑年盖月）

---

## 附注

（如有联系人、联系电话等）

---

## 版记

抄送：×××，×××。

××××办公室        2024年×月×日印发

---

# 四、字体对照表

| 元素 | 字体 | 字号 | 格式 |
|------|------|------|------|
| 份数秘密 | 黑体 | 三号 | 顶格 |
| 紧急程度 | 黑体 | 三号 | 顶格 |
| 发文机关标志 | 宋体/红头 | 小标宋 | 居中 |
| 发文字号 | 仿宋 | 三号 | 居中 |
| 签发人 | 仿宋 | 三号 | 右对齐 |
| 标题 | 小标宋 | 二号 | 居中 |
| 一级标题 | 黑体 | 三号 | 左对齐 |
| 二级标题 | 楷体 | 三号 | 加粗 |
| 三级标题 | 仿宋 | 三号 | 加粗 |
| 正文 | 仿宋 | 三号 | - |
| 附件标题 | 黑体 | 三号 | - |
| 落款 | 仿宋 | 三号 | 右对齐 |
| 成文日期 | 仿宋 | 三号 | 右对齐 |
| 版记 | 仿宋 | 四号 | 居中 |

---

# 五、标点符号规范

- 标题末尾不加标点
- 序号后：一级用"、"，其他不用标点
- 引用文件：《×××》用书名号
- 引用条款：根据《××》第×条规定
- 日期：2024年1月1日（不用2024.1.1）
- 数字：概数用汉字"三五个"，精确数用阿拉伯数字

---

# 六、常见错误示例

❌ 错误：一、加强领导。
✅ 正确：一、加强领导

❌ 错误：（一）、完善建设
✅ 正确：（一）完善建设

❌ 错误：1、制定工作计划
✅ 正确：1.制定工作计划

❌ 错误：2024.1.1
✅ 正确：2024年1月1日


path: 意见模板.md
content: # 关于×××的意见

**××发〔2024〕×号**

---

**各部门：**

为×××，现提出如下意见：

**一、总体要求**

**（一）指导思想**

**（二）基本原则**

1.坚持×××
2.坚持×××

**（三）主要目标**

到2025年，实现×××

**二、重点任务**

**（一）任务一**

**（二）任务二**

**三、保障措施**

**（一）加强领导**

**（二）完善支持**

**（三）强化检查**

---

××××××
2024年×月×日

---

**附件**

1.×××清单
2.×××分工表


path: 批复模板.md
content: # 关于×××的批复

**××发〔2024〕×号**

---

**XX院：**

你×《关于×××的请示》（××发〔2024〕×号）收悉。经研究，现批复如下：

一、同意×××。

二、×××。

三、请你××××。

此复。

---

XX院
2024年×月×日

---

（此件公开发布）


path: 报告模板.md
content: # 关于×××的报告

**××发〔2024〕×号**

---

**XX院：**

**一、工作背景**

**二、主要情况**

**（一）基本情况**

**（二）主要做法**

1.×××
2.×××

**三、存在问题**

**四、下一步工作打算**

特此报告。

---

××××××（印章）
2024年×月×日


path: 模板使用指南.md
content: # 公文排版 Word 模板使用指南

## 一、标题层次标记方法

在Word中设置多级列表，确保标题层次规范：

### 步骤1：定义多级列表

1. 点击【开始】→【多级列表】→【定义新的多级列表】
2. 分别设置1-5级：

| 级别 | 编号格式 | 字体 | 字号 | 对齐 |
|------|----------|------|------|------|
| 1级 | 一、 | 黑体 | 三号 | 左对齐 |
| 2级 | （一） | 楷体 | 三号 | 左对齐 |
| 3级 | 1. | 仿宋 | 三号 | 左对齐 |
| 4级 | （1） | 仿宋 | 三号 | 左对齐 |
| 5级 | ① | 仿宋 | 三号 | 左对齐 |

### 步骤2：设置样式

为每级标题创建样式，方便快速应用：

- 标题1 → 对应一级标题（一、二、三、）
- 标题2 → 对应二级标题（（一）（二）（三））
- 标题3 → 对应三级标题（1. 2. 3.）
- 标题4 → 对应四级标题（（1）（2）（3））

---

## 二、常见公文字体下载

公文常用字体：
- 方正小标宋简体（标题）
- 仿宋_GB2312（正文）
- 楷体_GB2312（二级标题）

Windows系统一般已内置，如缺失可从方正官网下载。

---

## 三、快速排版技巧

### 3.1 设置页边距

【布局】→【页边距】→【自定义页边距】
- 上：3.7cm
- 下：3.5cm
- 左：2.8cm
- 右：2.6cm

### 3.2 设置行距

选中正文 → 【段落】→ 行距固定值28磅

### 3.3 设置每页行数

【布局】→【页面设置】→【文档网格】
- 每页：22行
- 每行：28字符

---

## 四、Markdown 转 Word 流程

### 方法1：使用Pandoc

```bash
# 基础转换
pandoc input.md -o output.docx

# 使用参考模板（保留样式）
pandoc input.md --reference-doc=template.docx -o output.docx
```

### 方法2：在Agent中实现

可以创建一个skill：
1. 用户输入Markdown格式的公文内容
2. 使用Pandoc转换为Word
3. 应用预设的公文样式模板
4. 输出格式规范的Word文档

---

## 五、模板文件清单

```
official-document-template/
├── 公文排版规范.md      # 排版规范说明
├── 通知模板.md          # 通知公文模板
├── 请示模板.md          # 请示公文模板
├── 报告模板.md          # 报告公文模板
├── 批复模板.md          # 批复公文模板
├── 意见模板.md          # 意见公文模板
├── 模板使用指南.md      # 本文件
└── template.docx        # Word样式模板（需自行创建）
```


path: 请示模板.md
content: # 关于×××的请示

**××发〔2024〕×号**

---

**签发人**：×××

---

**XX院：**

**一、请示事由**

（说明请示的背景和原因）

**二、具体请求**

**（一）请求事项一**

**（二）请求事项二**

**三、建议意见**

（提出处理建议）

妥否，请批示。

---

××××××（印章）
2024年×月×日

---

**联系人**：×××  **电话**：×××-××××××××


path: 通知模板.md
content: # 关于〔具体事项〕的通知

**××发〔2024〕×号**

---

**各直属机构：**

**一、一级标题示例（黑体，三号）**

为深入贯彻落实××精神，现就有关事项通知如下：

**（一）二级标题示例（楷体，三号，加粗）**

具体工作内容...

1.三级标题示例（仿宋，三号，加粗）

详细说明...

（1）四级标题示例（仿宋，三号）

具体措施...

**二、工作要求**

各级各部门要高度重视...

**三、保障措施**

**（一）加强组织领导**

**（二）强化监督检查**

（此件公开发布）

---

××××××
2024年×月×日

---

**附 件**

1.×××名单
2.×××方案

---

**联系人**：×××  **电话**：×××-××××××××


path: scripts/convert_to_docx.py
content: #!/usr/bin/env python3
"""
公文排版脚本
将Markdown格式的公文内容转换为符合GB/T 9704-2012标准的Word文档
"""

import argparse
import re
import sys
from pathlib import Path

try:
    from docx import Document
    from docx.shared import Pt, Cm, Twips
    from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_LINE_SPACING
    from docx.enum.style import WD_STYLE_TYPE
    from docx.oxml.ns import qn
    from docx.oxml import OxmlElement
except ImportError:
    print("需要安装python-docx: pip install python-docx")
    sys.exit(1)


# 公文格式常量 (GB/T 9704-2012)
PAGE_WIDTH = Cm(21.0)      # A4宽度
PAGE_HEIGHT = Cm(29.7)     # A4高度
MARGIN_TOP = Cm(3.7)       # 上边距37mm
MARGIN_BOTTOM = Cm(3.5)    # 下边距35mm
MARGIN_LEFT = Cm(2.8)      # 左边距28mm
MARGIN_RIGHT = Cm(2.6)     # 右边距26mm

FONT_SIZE_SAN = Pt(16)     # 三号字 16pt
FONT_SIZE_ER = Pt(22)      # 二号字 22pt
FONT_SIZE_SI = Pt(14)      # 四号字 14pt

LINE_SPACING = Pt(28)      # 行距28磅


def set_chinese_font(run, font_name, size=None, bold=False):
    """设置中文字体"""
    run.font.name = font_name
    run._element.rPr.rFonts.set(qn('w:eastAsia'), font_name)
    if size:
        run.font.size = size
    run.font.bold = bold


def setup_document():
    """初始化文档，设置页面格式"""
    doc = Document()
    
    # 设置页面
    section = doc.sections[0]
    section.page_width = PAGE_WIDTH
    section.page_height = PAGE_HEIGHT
    section.top_margin = MARGIN_TOP
    section.bottom_margin = MARGIN_BOTTOM
    section.left_margin = MARGIN_LEFT
    section.right_margin = MARGIN_RIGHT
    
    return doc


def add_title(doc, text):
    """添加公文标题（二号小标宋，居中）"""
    para = doc.add_paragraph()
    para.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = para.add_run(text)
    set_chinese_font(run, '方正小标宋简体', FONT_SIZE_ER)
    para.paragraph_format.space_before = Pt(0)
    para.paragraph_format.space_after = Pt(0)
    para.paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE


def add_doc_number(doc, text):
    """添加发文字号（三号仿宋，居中）"""
    para = doc.add_paragraph()
    para.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = para.add_run(text)
    set_chinese_font(run, '仿宋', FONT_SIZE_SAN)


def add_level1_title(doc, text):
    """添加一级标题（三号黑体）"""
    para = doc.add_paragraph()
    run = para.add_run(text)
    set_chinese_font(run, '黑体', FONT_SIZE_SAN)
    para.paragraph_format.first_line_indent = Cm(0)
    para.paragraph_format.space_before = Pt(12)
    para.paragraph_format.space_after = Pt(6)


def add_level2_title(doc, text):
    """添加二级标题（三号楷体，加粗）"""
    para = doc.add_paragraph()
    run = para.add_run(text)
    set_chinese_font(run, '楷体', FONT_SIZE_SAN, bold=True)
    para.paragraph_format.first_line_indent = Cm(0)


def add_level3_title(doc, text):
    """添加三级标题（三号仿宋，加粗）"""
    para = doc.add_paragraph()
    run = para.add_run(text)
    set_chinese_font(run, '仿宋', FONT_SIZE_SAN, bold=True)
    para.paragraph_format.first_line_indent = Cm(0)


def add_body_text(doc, text):
    """添加正文（三号仿宋）"""
    para = doc.add_paragraph()
    run = para.add_run(text)
    set_chinese_font(run, '仿宋', FONT_SIZE_SAN)
    # 首行缩进两字符
    para.paragraph_format.first_line_indent = Cm(0.74)  # 约2个三号字
    para.paragraph_format.line_spacing = Pt(28)


def add_recipient(doc, text):
    """添加主送机关"""
    para = doc.add_paragraph()
    run = para.add_run(text)
    set_chinese_font(run, '仿宋', FONT_SIZE_SAN)
    para.paragraph_format.first_line_indent = Cm(0)


def add_signature(doc, org_name, date):
    """添加落款"""
    # 空两行
    doc.add_paragraph()
    doc.add_paragraph()
    
    # 发文机关名称
    para = doc.add_paragraph()
    para.alignment = WD_ALIGN_PARAGRAPH.RIGHT
    run = para.add_run(org_name)
    set_chinese_font(run, '仿宋', FONT_SIZE_SAN)
    
    # 成文日期
    para = doc.add_paragraph()
    para.alignment = WD_ALIGN_PARAGRAPH.RIGHT
    run = para.add_run(date)
    set_chinese_font(run, '仿宋', FONT_SIZE_SAN)


def parse_markdown_content(content):
    """
    解析Markdown内容，识别标题层次
    
    返回: [(类型, 内容), ...]
    类型: 'title', 'level1', 'level2', 'level3', 'body', 'blank'
    """
    lines = content.strip().split('\n')
    elements = []
    
    for line in lines:
        line = line.rstrip()
        
        # 空行
        if not line.strip():
            elements.append(('blank', ''))
            continue
        
        # 一级标题 # 开头
        if line.startswith('# '):
            elements.append(('title', line[2:].strip()))
            continue
        
        # 一级标题（一、二、三、格式）
        if re.match(r'^[一二三四五六七八九十]+、', line):
            elements.append(('level1', line))
            continue
        
        # 二级标题（（一）（二）（三）格式）
        if re.match(r'^（[一二三四五六七八九十]+）', line):
            elements.append(('level2', line))
            continue
        
        # 三级标题（1. 2. 3. 格式）
        if re.match(r'^\d+\.', line):
            # 判断是否为标题（短于30字且不包含标点结尾）
            if len(line) < 30 and not line[-1] in '，。；：！？':
                elements.append(('level3', line))
            else:
                elements.append(('body', line))
            continue
        
        # 四级标题（（1）（2）（3）格式）
        if re.match(r'^（\d+）', line):
            if len(line) < 30:
                elements.append(('level3', line))
            else:
                elements.append(('body', line))
            continue
        
        # 发文字号
        if re.match(r'.*发〔\d{4}〕\d+号', line):
            elements.append(('doc_number', line))
            continue
        
        # 默认为正文
        elements.append(('body', line))
    
    return elements


def convert_to_docx(markdown_content, output_path):
    """将Markdown内容转换为Word文档"""
    doc = setup_document()
    elements = parse_markdown_content(markdown_content)
    
    for elem_type, content in elements:
        if elem_type == 'title':
            add_title(doc, content)
        elif elem_type == 'level1':
            add_level1_title(doc, content)
        elif elem_type == 'level2':
            add_level2_title(doc, content)
        elif elem_type == 'level3':
            add_level3_title(doc, content)
        elif elem_type == 'body':
            if content.strip():
                add_body_text(doc, content)
        elif elem_type == 'doc_number':
            add_doc_number(doc, content)
    
    doc.save(output_path)
    return output_path


def main():
    parser = argparse.ArgumentParser(description='公文排版工具')
    parser.add_argument('input', help='输入的Markdown文件路径')
    parser.add_argument('--output', '-o', help='输出的Word文件路径（默认：同目录同名.docx）')
    
    args = parser.parse_args()
    
    input_path = Path(args.input)
    if not input_path.exists():
        print(f"错误：文件不存在 - {input_path}")
        sys.exit(1)
    
    # 读取内容
    content = input_path.read_text(encoding='utf-8')
    
    # 确定输出路径
    if args.output:
        output_path = args.output
    else:
        output_path = input_path.with_suffix('.docx')
    
    # 转换
    try:
        result = convert_to_docx(content, output_path)
        print(f"✅ 转换完成: {result}")
    except Exception as e:
        print(f"❌ 转换失败: {e}")
        sys.exit(1)


if __name__ == '__main__':
    main()


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)