提交 6b681fcb authored 作者: 陈泽健's avatar 陈泽健

feat(document): 新增文档自动优化校准工具

- 实现文档格式统一功能,包括标题、正文、表格样式的标准化
- 添加命令行接口支持交互式选择和处理指定文档
- 集成python-docx库实现Word文档格式优化
- 提供配置模块管理字体、字号等格式参数
- 生成符合规范的页眉页脚和目录结构
- 包含完整的README文档和使用说明
上级 529b31ce
# 文档自动优化校准工具
## 项目简介
本工具用于自动优化Word文档的格式样式,统一文档排版规范。
### 主要功能
- **标题格式统一**:自动识别并统一1-5级标题的字体、字号、加粗样式
- **正文格式统一**:统一正文字体、字号、首行缩进、行距
- **表格格式统一**:统一表格字体、字号、对齐方式、边框样式
- **页眉页脚设置**:自动添加页眉(文件名)和页脚(页码格式)
### 设计原则
- **不修改内容**:仅调整格式样式,不改变文档内容
- **保留结构**:保留原文档的标题层级、表格结构
- **批量处理**:支持批量处理多个文档
---
## 项目结构
```
AuxiliaryTool/DocumentAutoOptimizationCalibration/
├── config/ # 配置文件目录
│ └── 文档模板.docx # 文档模板
├── src/ # 源代码目录
│ ├── __init__.py # 模块初始化
│ ├── config.py # 配置模块
│ ├── optimizer.py # 文档优化核心模块
│ ├── cli.py # 命令行接口
│ └── main.py # 主入口模块
├── testcases/ # 测试用例目录
│ └── 文档.docx # 测试文档
├── reports/ # 输出报告目录
├── logs/ # 日志目录
├── run.py # 入口脚本
├── requirements.txt # 依赖包列表
└── README.md # 说明文档
```
---
## 安装说明
### 环境要求
- Python 3.7+
- python-docx 库
### 安装步骤
1. 进入项目目录:
```bash
cd AuxiliaryTool/DocumentAutoOptimizationCalibration
```
2. 安装依赖:
```bash
pip install -r requirements.txt
```
---
## 使用说明
### 交互式模式
直接运行程序,会列出 `testcases/` 目录下的所有文档供选择:
```bash
python run.py
```
### 命令行模式
处理指定文档:
```bash
python run.py --input 文档.docx
```
指定输出路径:
```bash
python run.py --input 文档.docx --output 输出/优化版.docx
```
指定目录页码:
```bash
python run.py --input 文档.docx --toc-page 3
```
### 命令行参数
| 参数 | 简写 | 说明 | 示例 |
|------|------|------|------|
| `--input` | `-i` | 输入文档路径(必需) | `--input 文档.docx` |
| `--output` | `-o` | 输出文档路径(可选) | `--output 输出/优化版.docx` |
| `--toc-page` | - | 目录所在页码(默认为4) | `--toc-page 3` |
| `--log-level` | - | 日志级别(默认为INFO) | `--log-level DEBUG` |
| `--list` | `-l` | 仅列出可用文档 | `--list` |
| `--help` | `-h` | 显示帮助信息 | `--help` |
---
## 配置说明
配置文件位于 `src/config.py`,可修改以下参数:
### 字体配置
```python
FONT_NAME = "宋体" # 中文字体名称
```
### 标题字号配置
```python
TITLE_SIZE_LEVEL_1 = 21 # 一级标题字号
TITLE_SIZE_LEVEL_2 = 19 # 二级标题字号
TITLE_SIZE_LEVEL_3 = 17 # 三级标题字号
TITLE_SIZE_LEVEL_4 = 15 # 四级标题字号
TITLE_SIZE_LEVEL_5 = 13 # 五级标题字号
```
### 正文配置
```python
BODY_FONT_SIZE = 11 # 正文字号
BODY_LINE_SPACING = 1.5 # 行距倍数
FIRST_LINE_INDENT_CHARS = 2 # 首行缩进字符数
```
### 表格配置
```python
TABLE_FONT_SIZE = 11 # 表格字号
TABLE_BORDER_COLOR = "000000" # 边框颜色(黑色)
```
---
## 格式规范
### 标题格式
| 级别 | 字号 | 字体 | 加粗 | 颜色 | 对齐 |
|------|------|------|------|------|------|
| 一级标题 | 21 | 宋体 | 是 | 黑色 | 左对齐 |
| 二级标题 | 19 | 宋体 | 是 | 黑色 | 左对齐 |
| 三级标题 | 17 | 宋体 | 是 | 黑色 | 左对齐 |
| 四级标题 | 15 | 宋体 | 是 | 黑色 | 左对齐 |
| 五级标题 | 13 | 宋体 | 是 | 黑色 | 左对齐 |
### 正文格式
- 字体:宋体
- 字号:11号
- 颜色:黑色
- 首行缩进:2字符
- 行距:1.5倍
### 表格格式
- 表头:宋体、11号、加粗、黑色、居中
- 表格内容:宋体、11号、黑色、居中
- 表格边框:黑色
### 页眉页脚
- 页眉:文件名称(不含扩展名)、居中
- 页脚:页码格式"第X页,共Y页"
---
## 开发参考
本项目参考了 `FunctionalTestReportGeneration` 工具的代码结构:
| 参考文件 | 用途 |
|---------|------|
| `FunctionalTestReportGeneration/src/word_generator.py` | Word文档处理参考 |
| `FunctionalTestReportGeneration/src/config.py` | 配置模块参考 |
---
## 版本历史
| 版本 | 日期 | 说明 |
|------|------|------|
| v1.0.0 | 2025-03-10 | 初始版本,支持基础格式优化 |
---
## 优化功能回填
- [ ] 支持自定义样式配置文件
- [ ] 支持批量处理多个文档
- [ ] 支持GUI界面
- [ ] 支持自动目录更新
# -*- coding: utf-8 -*-
"""
文档自动优化校准工具 - 入口脚本
使用方法:
python run.py # 交互式选择文档
python run.py --input 文档.docx # 处理指定文档
python run.py --help # 查看帮助信息
"""
import sys
from pathlib import Path
# 将项目根目录添加到Python路径
project_root = Path(__file__).parent
sys.path.insert(0, str(project_root))
# 导入并运行主程序
from src.main import main
if __name__ == "__main__":
exit_code = main()
sys.exit(exit_code)
# -*- coding: utf-8 -*-
"""
文档自动优化校准工具
本工具用于自动优化Word文档的格式样式,包括:
- 标题格式统一
- 正文格式统一
- 表格格式统一
- 页眉页脚设置
"""
__version__ = "1.0.0"
__author__ = "Document Optimizer"
__description__ = "文档自动优化校准工具"
# -*- coding: utf-8 -*-
"""
文档自动优化校准工具 - 命令行接口模块
本模块提供命令行参数解析和交互式选择功能
"""
import sys
import argparse
from pathlib import Path
from logging import getLogger
from src.config import (
TESTCASES_DIR,
REPORTS_DIR,
TOC_PAGE_NUMBER,
LOG_FORMAT,
LOG_DATE_FORMAT,
)
from src.optimizer import optimize_document
logger = getLogger(__name__)
def setup_logging(log_level: str = "INFO") -> None:
"""
设置日志配置
Args:
log_level: 日志级别
"""
import logging
logging.basicConfig(
level=getattr(logging, log_level.upper()),
format=LOG_FORMAT,
datefmt=LOG_DATE_FORMAT,
handlers=[
logging.StreamHandler(sys.stdout),
]
)
logger.info("日志系统初始化完成,级别=%s", log_level)
def list_available_documents() -> list:
"""
列出testcases目录下的所有Word文档
Returns:
文档路径列表
"""
testcase_dir = Path(TESTCASES_DIR)
if not testcase_dir.exists():
logger.warning("测试用例目录不存在: %s", testcase_dir)
return []
# 查找所有.docx文件
docx_files = list(testcase_dir.glob("*.docx"))
logger.info("找到 %d 个文档", len(docx_files))
return [str(f) for f in docx_files]
def interactive_select_document() -> str:
"""
交互式选择文档
Returns:
选中的文档路径
"""
documents = list_available_documents()
if not documents:
print("\n错误:testcases/ 目录下没有找到Word文档")
print(f"请将需要优化的文档放入: {TESTCASES_DIR}")
sys.exit(1)
print("\n可用的文档列表:")
print("-" * 60)
for i, doc_path in enumerate(documents, 1):
doc_name = Path(doc_path).name
print(f" {i}. {doc_name}")
print("-" * 60)
while True:
try:
choice = input(f"\n请选择文档 (1-{len(documents)}),或输入 'q' 退出: ").strip()
if choice.lower() == 'q':
print("退出程序")
sys.exit(0)
index = int(choice) - 1
if 0 <= index < len(documents):
selected = documents[index]
print(f"已选择: {Path(selected).name}")
return selected
else:
print(f"无效的选择,请输入 1-{len(documents)} 之间的数字")
except ValueError:
print("无效的输入,请输入数字")
except KeyboardInterrupt:
print("\n\n退出程序")
sys.exit(0)
def parse_command_line() -> argparse.Namespace:
"""
解析命令行参数
Returns:
解析后的参数对象
"""
parser = argparse.ArgumentParser(
description="文档自动优化校准工具 - 统一Word文档格式样式",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
示例用法:
python run.py # 交互式选择文档
python run.py --input 文档.docx # 处理指定文档
python run.py --input 文档.docx --output 输出/优化版.docx
python run.py --input 文档.docx --toc-page 3
注意:
- 输入文档路径可以是相对路径或绝对路径
- 默认输出目录为 reports/
- 目录页码默认为第4页
"""
)
parser.add_argument(
'--input', '-i',
type=str,
dest='input',
help='输入文档路径(.docx文件)'
)
parser.add_argument(
'--output', '-o',
type=str,
dest='output',
help='输出文档路径(可选,默认为reports/目录下同名_优化版.docx)'
)
parser.add_argument(
'--toc-page',
type=int,
dest='toc_page',
default=TOC_PAGE_NUMBER,
help=f'目录所在页码(默认为{TOC_PAGE_NUMBER})'
)
parser.add_argument(
'--log-level',
type=str,
dest='log_level',
default='INFO',
choices=['DEBUG', 'INFO', 'WARNING', 'ERROR'],
help='日志级别(默认为INFO)'
)
parser.add_argument(
'--list', '-l',
action='store_true',
dest='list_only',
help='仅列出可用的文档,不进行处理'
)
return parser.parse_args()
def run_cli(args: argparse.Namespace) -> int:
"""
运行命令行程序
Args:
args: 命令行参数
Returns:
退出码(0表示成功,非0表示失败)
"""
# 设置日志
setup_logging(args.log_level)
# 如果仅列出文档
if args.list_only:
documents = list_available_documents()
if documents:
print("\n可用的文档列表:")
print("-" * 60)
for doc_path in documents:
print(f" - {Path(doc_path).name}")
print("-" * 60)
return 0
# 确定输入文档路径
input_path = args.input
if input_path is None:
# 交互式选择
print("\n" + "=" * 60)
print(" 文档自动优化校准工具 v1.0")
print("=" * 60)
input_path = interactive_select_document()
else:
# 验证输入路径
input_file = Path(input_path)
if not input_file.exists():
logger.error("输入文档不存在: %s", input_path)
return 1
if not input_file.suffix.lower() == '.docx':
logger.error("输入文件格式不支持,仅支持.docx文件: %s", input_path)
return 1
logger.info("输入文档: %s", input_path)
# 确定输出文档路径
output_path = args.output
# 执行文档优化
try:
result_path = optimize_document(
input_path=input_path,
output_path=output_path,
toc_page=args.toc_page
)
print("\n" + "=" * 60)
print(" 文档优化完成!")
print("=" * 60)
print(f" 输入文档: {input_path}")
print(f" 输出文档: {result_path}")
print("=" * 60)
return 0
except FileNotFoundError as e:
logger.error("文件未找到: %s", e)
return 1
except PermissionError as e:
logger.error("权限错误: %s", e)
return 1
except Exception as e:
logger.error("处理失败: %s", e)
import traceback
logger.debug(traceback.format_exc())
return 1
def main() -> int:
"""
主入口函数
Returns:
退出码
"""
args = parse_command_line()
return run_cli(args)
# -*- coding: utf-8 -*-
"""
文档自动优化校准工具 - 配置模块
本模块定义程序的所有常量、路径配置
"""
from pathlib import Path
from logging import getLogger
logger = getLogger(__name__)
# ================================
# 路径配置
# ================================
# 项目根目录
BASE_DIR = Path(__file__).parent.parent
# 源代码目录
SRC_DIR = BASE_DIR / "src"
# 配置文件目录
CONFIG_DIR = BASE_DIR / "config"
# 测试用例数据目录
TESTCASES_DIR = BASE_DIR / "testcases"
# 报告输出目录
REPORTS_DIR = BASE_DIR / "reports"
# 日志目录
LOGS_DIR = BASE_DIR / "logs"
# 模板文件路径
TEMPLATE_FILE = CONFIG_DIR / "文档模板.docx"
# ================================
# 字体配置
# ================================
# 中文字体名称
FONT_NAME = "宋体"
# ================================
# 标题字号配置
# ================================
TITLE_SIZE_LEVEL_1 = 21 # 一级标题
TITLE_SIZE_LEVEL_2 = 19 # 二级标题
TITLE_SIZE_LEVEL_3 = 17 # 三级标题
TITLE_SIZE_LEVEL_4 = 15 # 四级标题
TITLE_SIZE_LEVEL_5 = 13 # 五级标题
# 标题字号映射表
TITLE_SIZES = {
1: TITLE_SIZE_LEVEL_1,
2: TITLE_SIZE_LEVEL_2,
3: TITLE_SIZE_LEVEL_3,
4: TITLE_SIZE_LEVEL_4,
5: TITLE_SIZE_LEVEL_5,
}
# ================================
# 正文配置
# ================================
# 正文字号
BODY_FONT_SIZE = 11
# 行距倍数
BODY_LINE_SPACING = 1.5
# 首行缩进字符数(1字符约240缇)
FIRST_LINE_INDENT_CHARS = 2
# 首行缩进缇值
FIRST_LINE_INDENT_TWIPS = FIRST_LINE_INDENT_CHARS * 240
# ================================
# 表格配置
# ================================
# 表格字号
TABLE_FONT_SIZE = 11
# 表格边框颜色(黑色)
TABLE_BORDER_COLOR = "000000"
# ================================
# 页眉页脚配置
# ================================
# 页眉页脚字号
HEADER_FOOTER_FONT_SIZE = 11
# 页码格式
PAGE_NUMBER_FORMAT = "第{current}页,共{total}页"
# 目录配置
TOC_PAGE_NUMBER = 4 # 目录位于第4页
# ================================
# 日志配置
# ================================
# 日志级别
LOG_LEVEL = "INFO"
# 日志格式
LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
# 日期格式
LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
# ================================
# 版本信息
# ================================
__version__ = "1.0.0"
__author__ = "Document Optimizer"
__description__ = "文档自动优化校准工具"
def ensure_directories() -> None:
"""
确保所有必要的目录存在
"""
REPORTS_DIR.mkdir(parents=True, exist_ok=True)
LOGS_DIR.mkdir(parents=True, exist_ok=True)
logger.info("目录检查完成: reports/, logs/")
# 模块导入时自动创建目录
ensure_directories()
# -*- coding: utf-8 -*-
"""
文档自动优化校准工具 - 主入口模块
本模块是程序的主入口,负责初始化和启动应用
"""
import sys
from logging import getLogger
from src.cli import main as cli_main
logger = getLogger(__name__)
def print_banner() -> None:
"""
打印欢迎横幅
"""
banner = """
╔════════════════════════════════════════════════════════════╗
║ ║
║ 文档自动优化校准工具 v1.0 ║
║ ║
║ 功能:统一Word文档格式样式 ║
║ - 标题格式统一 ║
║ - 正文格式统一 ║
║ - 表格格式统一 ║
║ - 页眉页脚设置 ║
║ ║
╚════════════════════════════════════════════════════════════╝
"""
print(banner)
def print_usage_hint() -> None:
"""
打印使用提示
"""
hint = """
使用提示:
python run.py # 交互式选择文档
python run.py --help # 查看帮助信息
python run.py --input 文档.docx # 处理指定文档
"""
print(hint)
def main() -> int:
"""
主入口函数
Returns:
退出码(0表示成功,非0表示失败)
"""
try:
# 如果没有命令行参数或只是显示帮助,显示横幅
if len(sys.argv) == 1 or '--help' in sys.argv or '-h' in sys.argv:
print_banner()
# 调用CLI主函数
exit_code = cli_main()
# 如果是交互模式且成功完成,打印使用提示
if exit_code == 0 and len(sys.argv) == 1:
print_usage_hint()
return exit_code
except KeyboardInterrupt:
print("\n\n程序被用户中断")
return 130
except Exception as e:
logger.error("程序异常: %s", e)
import traceback
logger.debug(traceback.format_exc())
return 1
if __name__ == "__main__":
sys.exit(main())
# 文档内容国际化转换_优化需求文档
## 代码路径
- 代码路径:[AuxiliaryTool/DocumentAutoOptimizationCalibration]
## 功能需求
### 功能目标
**目标:** 将原有文档中文内容优化为英文,并生成新的文档。
### 需求描述
#### 文档路径获取
- 文档路径:[AuxiliaryTool/DocumentAutoOptimizationCalibration/testcases/文档.docx]
### 测试报告内容约束
#### 内容转换规则
- 在不影响排版的前提下将中文内容转换为英文。
- 转换过程中需保留原有内容、图片、超链接或批注等元素。
- 转后后的文档内容需符合英文表达习惯,且语法正确。
## 规范文档
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
- 问题总结: `Docs/PRD/01规范文档/_PRD_问题总结_记录文档.md`
- 方法总结: `Docs/PRD/01规范文档/_PRD_方法总结_记录文档.md`
- 文档规范: `Docs/PRD/01规范文档/_PRD_规范文档_文档规范.md`
- 测试规范: `Docs/PRD/01规范文档/_PRD_规范文档_测试规范.md`
---
\ No newline at end of file
# 文档自动优化校准需求文档
## 代码路径
- 代码路径:[AuxiliaryTool/DocumentAutoOptimizationCalibration]
## 功能需求
### 功能目标
**目标:** 通过限制文档标题字号、字体以及字色,统一优化文档内容排版格式,只需调整文档排版样式,无需修改内容。
### 需求描述
#### 文档路径获取
- 文档路径:[AuxiliaryTool/DocumentAutoOptimizationCalibration/testcases/文档.docx]
### 测试报告内容约束
#### 内容排版规则
- 目录生成规则:
- 自动根据标题层级生成目录,并且目录标题为黑色和左对齐。
- 需要能够自动更新目录内容和页码。
- 因文档前三页为封面等内容,所以目录位于文档第四页。
- 标题格式规则:
- 一级标题为宋体、21字号、加粗、黑色和左对齐,
- 二级标题为宋体、19字号、加粗、黑色和左对齐。
- 三级标题为宋体、17字号、加粗、黑色和左对齐。
- 四级标题为宋体、15字号、加粗、黑色和左对齐。
- 五级标题为宋体、13字号、加粗、黑色和左对齐。
- 标题先无需自行编号,标题无间距要求。
- 正文格式规则:
- 正文为宋体、11字号、黑色,且统一进行首行缩进两字符。
- 行距间隔为1.5倍行距。
- 表格格式规则:
- 表头为宋体、11字号、加粗、黑色和居中对齐。
- 表格内容为宋体、11字号、黑色和居中对齐。
- 表格边框颜色为黑色。
- 如遇跨页,则样式保持一致。
- 页脚格式规则:
- 页脚为宋体、11字号、黑色和居中对齐,包含页码,页码格式为“第X页,共Y页”,其中X为当前页码,Y为总页数。
- 页脚从目录页的下一页开始显示。
- 页眉格式规则:
- 页眉为宋体、11字号、黑色和居中对齐。
- 页眉内容为文件名称,不包含扩展名。
#### 功能实现方式
- 通过使用python的docx库,实现文档模板的生成。
- 获取文档路径,并读取文档内容,调整样式,并保存。
- 无需修改内容,只需调整文档排版样式,需保留原有内容、图片、超链接或批注等元素。
- 通过word内置的标题样式来判断标题层级。
## 规范文档
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
- 问题总结: `Docs/PRD/01规范文档/_PRD_问题总结_记录文档.md`
- 方法总结: `Docs/PRD/01规范文档/_PRD_方法总结_记录文档.md`
- 文档规范: `Docs/PRD/01规范文档/_PRD_规范文档_文档规范.md`
- 测试规范: `Docs/PRD/01规范文档/_PRD_规范文档_测试规范.md`
---
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论