# 公文通 **Repository Path**: deepin20/GovDocFormatter ## Basic Information - **Project Name**: 公文通 - **Description**: 公文通 - 智能公文排版助手(GovDocFormatter):基于 PyQt5 的国标公文排版工具。读取杂乱的 Word(.docx)公文,自动提取标题、主送机关、正文、落款等要素,套用符合党政机关公文格式国标(GB/T 9704)的模板重新排版输出,支持单文档排版与批量并行处理。 - **Primary Language**: Python - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-09-16 - **Last Updated**: 2026-10-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 公文通 - 智能公文排版助手(GovDocFormatter) 基于 **PyQt5** 的国标公文排版工具。读取杂乱的 Word(.docx)公文,自动提取标题、主送机关、正文、落款等要素,套用符合党政机关公文格式国标(GB/T 9704)的模板重新排版输出,支持单文档排版与批量并行处理。 ## 功能特性 - **📄 快速排版**:选择单个文档 → 预览提取结果 → 一键排版 - **⚙️ 批量处理**:多选文件 / 整个文件夹递归扫描,多线程并行处理,支持取消与退避重试,实时进度条与日志 - **📁 模板管理**:三种公文类型(无红头公文 / 下行文 / 上行文)分别绑定模板文件 - **🔧 设置**:默认输出目录、并行数、重试次数 - **自动生成模板**:首次启动若检测到模板缺失,自动按国标参数生成默认模板 ### 智能提取规则 | 要素 | 识别策略 | |------|----------| | 标题 | 开头连续的"疑似标题"段落(≤50 字、不以句末标点结尾、排除章节编号),最多 3 段拼接 | | 主送机关 | 前 15 段内以冒号结尾的短行 | | 日期 | 文末 8 行"尾部区域"内,匹配 `2024年5月1日`、`2024-05-01`、`二〇二四年五月一日` 等格式 | | 发送机关 | 尾部区域内含单位/职务关键词(局、公司、委员会、局长、书记……)的短行 | | 正文 | 其余全部内容 | 防误判设计:段落内手动换行(``)拆分为独立行;日期/机关行限长且不得含句中标点;排除"一、""(一)"等章节编号行,避免正文中出现的日期或单位关键词干扰。 ### 国标模板参数(自动生成模板) - 页边距:上 3.7cm / 下 3.5cm / 左 2.8cm / 右 2.6cm - 标题:二号宋体、居中加粗,固定行距 28 磅 - 正文:三号仿宋、首行缩进 2 字符,固定行距 28 磅 - 落款:三号仿宋、右对齐 ## 快速开始 ### 方式一:源码运行(Linux) ```bash git clone <仓库地址> # 或直接下载解压 cd GovDocFormatter ./start.sh ``` `start.sh` 会自动完成:创建虚拟环境 → 按哈希比对安装依赖 → 检查 xcb 系统库 → 启动程序(已处理 Deepin 下的 Qt 插件路径问题)。 依赖(见 `requirements.txt`): - Python ≥ 3.8 - PyQt5 ≥ 5.15 - python-docx ≥ 0.8.11 - docxtpl ≥ 0.16.0 - pyyaml ≥ 5.4 ### 方式二:deb 包安装(deepin / Ubuntu / Debian) ```bash ./build_deb.sh sudo apt install ./dist/govdocformatter_1.0.0_amd64.deb ``` 安装后从应用菜单启动「公文通」,或执行 `govdocformatter`。打包方案为源码 + 预构建虚拟环境打入 `/opt`,目标机器仅需系统 python3 与基础 xcb 运行库,无需联网装依赖。 ## 模板变量 模板为普通 `.docx` 文件,使用 [docxtpl](https://docxtpl.readthedocs.io/)(Jinja2)语法插入变量: | 变量 | 含义 | |------|------| | `{{ title }}` | 标题 | | `{{ doc_no }}` | 发文字号 | | `{{ receiver }}` | 主送机关 | | `{{ content_lines }}` | 正文(按行拆分的列表,配合 `{%p for %}` 段落循环使用,每段保留首行缩进) | | `{{ attach }}` | 附件说明 | | `{{ sender }}` | 发送机关 | | `{{ write_date }}` | 成文日期 | | `{{ signature }}` | 落款(发送机关 + 换行 + 日期,兼容旧版模板) | 示例片段: ```text {%p for line in content_lines %} {{ line }} {%p endfor %} ``` ## 项目结构 ``` GovDocFormatter/ ├── main.py # 入口:模板检查/自动生成 → 启动 GUI ├── core/ │ ├── content_extractor.py # 内容提取器(要素识别主流程) │ ├── paragraph_classifier.py# 识别规则与段落分类器 │ └── template_engine.py # docxtpl 渲染封装 ├── gui/ │ ├── main_window.py # 主窗口(标签页容器) │ ├── quick_tab.py # 快速排版 │ ├── batch_tab.py # 批量处理(QThread + 线程池) │ ├── template_tab.py # 模板管理 │ └── settings_tab.py # 设置 ├── utils/config_manager.py # 配置管理(用户级配置目录) ├── create_final_template.py # 按国标生成默认模板 ├── templates/ # 模板文件(normal/up/down.docx) ├── start.sh # 源码运行脚本 ├── build_deb.sh # deb 打包脚本 └── config.yaml # 默认配置 ``` ## 配置说明 配置优先级:`~/.config/govdocformatter/config.yaml`(用户配置) > 应用目录 `config.yaml`(默认值)。 ```yaml output_dir: ~/Documents/公文排版输出 # 默认输出目录 parallel_workers: 4 # 批量处理并行数 retry_times: 2 # 排版失败重试次数 templates: 上行文: templates/up.docx 下行文: templates/down.docx 无红头公文: templates/normal.docx ``` 相对路径基于应用根目录解析(支持安装到 `/opt` 后从任意工作目录启动);应用目录只读时设置自动写入用户配置目录。 ## 运行测试 ```bash python tests/test_extractor.py # 或 pytest tests/ ``` 测试覆盖 8 个场景:常规公文、正文含日期、无落款、正文含单位关键词、中文大写日期、章节标题含关键词不误判为落款等。 ## 常见问题 - **Qt 界面无法启动 / 插件报错**:脚本已强制 `QT_QPA_PLATFORM=xcb` 并显式指定插件搜索路径;仍异常时可执行 `QT_DEBUG_PLUGINS=1 ./start.sh` 排查,或安装缺失的 xcb 库: `sudo apt install libxcb-cursor0 libxkbcommon-x11-0 ...`(start.sh 会自动列出缺失项) - **排版结果某要素为空**:先在快速排版页点「预览提取结果」查看识别情况,确认对应要素(如落款)确实存在于原文末尾且格式符合识别规则。