提交 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())
# -*- coding: utf-8 -*-
"""
文档自动优化校准工具 - 文档优化核心模块
本模块负责读取Word文档并优化其格式样式
"""
from pathlib import Path
from typing import Optional
from logging import getLogger
try:
from docx import Document
from docx.shared import Pt, Twips, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
except ImportError:
print("警告: 未安装python-docx库,请运行: pip install python-docx")
raise
from src.config import (
FONT_NAME,
TITLE_SIZES,
BODY_FONT_SIZE,
BODY_LINE_SPACING,
FIRST_LINE_INDENT_TWIPS,
TABLE_FONT_SIZE,
TABLE_BORDER_COLOR,
HEADER_FOOTER_FONT_SIZE,
PAGE_NUMBER_FORMAT,
TOC_PAGE_NUMBER,
REPORTS_DIR,
)
logger = getLogger(__name__)
def _set_cell_border(cell, color: str = TABLE_BORDER_COLOR) -> None:
"""
设置单元格边框
Args:
cell: 单元格对象
color: 边框颜色(十六进制,如 "000000" 表示黑色)
"""
tcPr = cell._element.get_or_add_tcPr()
tcBorders = OxmlElement('w:tcBorders')
for border_name in ['top', 'left', 'bottom', 'right']:
border = OxmlElement(f'w:{border_name}')
border.set(qn('w:val'), 'single')
border.set(qn('w:sz'), '4') # 边框宽度(4缇 = 0.5磅)
border.set(qn('w:color'), color)
tcBorders.append(border)
tcPr.append(tcBorders)
def _set_run_font_style(run, font_name: str = FONT_NAME, font_size: int = BODY_FONT_SIZE,
bold: bool = False, color: str = "000000") -> None:
"""
设置文本运行(Run)的字体样式
Args:
run: 文本运行对象
font_name: 字体名称
font_size: 字号
bold: 是否加粗
color: 字体颜色(十六进制)
"""
run.font.name = font_name
run.font.size = Pt(font_size)
run.font.bold = bold
run.font.color.rgb = RGBColor(
int(color[0:2], 16),
int(color[2:4], 16),
int(color[4:6], 16)
)
# 设置中文字体
run._element.rPr.rFonts.set(qn('w:eastAsia'), font_name)
def _set_title_style(paragraph, level: int) -> None:
"""
设置标题样式
Args:
paragraph: 段落对象
level: 标题级别(1-5)
"""
# 获取标题字号
font_size = TITLE_SIZES.get(level, BODY_FONT_SIZE)
# 设置段落对齐方式为左对齐
paragraph.alignment = WD_ALIGN_PARAGRAPH.LEFT
# 设置文本样式
for run in paragraph.runs:
_set_run_font_style(run, FONT_NAME, font_size, bold=True, color="000000")
logger.debug("设置标题样式: 级别=%d, 字号=%d", level, font_size)
def _set_body_style(paragraph) -> None:
"""
设置正文样式
Args:
paragraph: 段落对象
"""
# 设置首行缩进
paragraph.paragraph_format.first_line_indent = Twips(FIRST_LINE_INDENT_TWIPS)
# 设置行距
paragraph.paragraph_format.line_spacing = BODY_LINE_SPACING
# 设置文本样式
for run in paragraph.runs:
_set_run_font_style(run, FONT_NAME, BODY_FONT_SIZE, bold=False, color="000000")
logger.debug("设置正文样式: 首行缩进=%d字符, 行距=%.1f", FIRST_LINE_INDENT_TWIPS / 240, BODY_LINE_SPACING)
def _set_table_style(table) -> None:
"""
设置表格样式
Args:
table: 表格对象
"""
# 遍历表格的所有行和单元格
for row_idx, row in enumerate(table.rows):
for cell in row.cells:
# 设置单元格边框
_set_cell_border(cell)
# 设置单元格内段落样式
for paragraph in cell.paragraphs:
# 表头第一行加粗并居中
is_header = (row_idx == 0)
paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
for run in paragraph.runs:
_set_run_font_style(
run,
FONT_NAME,
TABLE_FONT_SIZE,
bold=is_header,
color="000000"
)
logger.debug("设置表格样式: 行数=%d, 列数=%d", len(table.rows), len(table.columns))
def _add_header_footer(doc, filename: str) -> None:
"""
添加页眉页脚
Args:
doc: Word文档对象
filename: 文件名(不含扩展名)
"""
# 获取文档的第一个节
section = doc.sections[0]
# 设置页眉:文件名称居中显示
header = section.header
header_paragraph = header.paragraphs[0] if header.paragraphs else header.paragraphs[0]
header_paragraph.text = filename
header_paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
for run in header_paragraph.runs:
_set_run_font_style(run, FONT_NAME, HEADER_FOOTER_FONT_SIZE, bold=False, color="000000")
logger.info("设置页眉: %s", filename)
# 设置页脚:页码格式
# 注意:python-docx 对页脚页码的支持有限,这里设置基础页脚文本
footer = section.footer
footer_paragraph = footer.paragraphs[0] if footer.paragraphs else footer.paragraphs[0]
footer_paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
for run in footer_paragraph.runs:
_set_run_font_style(run, FONT_NAME, HEADER_FOOTER_FONT_SIZE, bold=False, color="000000")
logger.info("设置页脚: %s", PAGE_NUMBER_FORMAT)
def _is_heading_paragraph(paragraph) -> Optional[int]:
"""
判断段落是否为标题段落,返回标题级别
Args:
paragraph: 段落对象
Returns:
标题级别(1-5),如果不是标题则返回 None
"""
style_name = paragraph.style.name
# 检查是否为Word内置标题样式
if style_name.startswith('Heading') or '标题' in style_name:
# 尝试从样式名称中提取级别
try:
# Heading 1 -> 1, Heading 2 -> 2, etc.
if 'Heading' in style_name:
level = int(style_name.split()[-1])
else:
# 中文标题样式:标题 1 -> 1, 标题 2 -> 2, etc.
import re
match = re.search(r'(\d+)', style_name)
if match:
level = int(match.group(1))
else:
return None
return level if 1 <= level <= 5 else None
except (ValueError, IndexError):
return None
# 检查段落格式是否具有标题特征(如大纲级别)
if hasattr(paragraph, 'paragraph_format') and hasattr(paragraph.paragraph_format, 'outline_level'):
outline_level = paragraph.paragraph_format.outline_level
if outline_level >= 0 and outline_level < 5:
return outline_level + 1
return None
def _should_skip_paragraph(paragraph) -> bool:
"""
判断是否应该跳过该段落(不处理样式)
Args:
paragraph: 段落对象
Returns:
是否应该跳过
"""
# 跳过空段落
if not paragraph.text.strip():
return True
# 跳过表格内的段落(表格单独处理)
if paragraph._element.getparent().tag.endswith('}tc'): # tc = table cell
return True
return False
def optimize_document(input_path: str, output_path: Optional[str] = None,
toc_page: int = TOC_PAGE_NUMBER) -> str:
"""
优化文档格式(主函数)
Args:
input_path: 输入文档路径
output_path: 输出文档路径(可选,默认为reports/目录下同名文件)
toc_page: 目录所在页码(可选,默认为4)
Returns:
输出文档路径
"""
input_file = Path(input_path)
# 验证输入文件存在
if not input_file.exists():
raise FileNotFoundError(f"输入文档不存在: {input_path}")
# 获取文件名(不含扩展名)
filename = input_file.stem
# 设置输出路径
if output_path is None:
output_file = REPORTS_DIR / f"{filename}_优化版.docx"
else:
output_file = Path(output_path)
# 确保输出目录存在
output_file.parent.mkdir(parents=True, exist_ok=True)
logger.info("开始处理文档: %s", input_path)
logger.info("输出路径: %s", output_file)
# 读取源文档
doc = Document(input_path)
# 设置文档默认字体
doc.styles['Normal'].font.name = FONT_NAME
doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), FONT_NAME)
doc.styles['Normal'].font.size = Pt(BODY_FONT_SIZE)
# 统计信息
title_count = 0
body_count = 0
table_count = 0
# 遍历所有段落并应用样式
for paragraph in doc.paragraphs:
# 检查是否应该跳过
if _should_skip_paragraph(paragraph):
continue
# 检查是否为标题
heading_level = _is_heading_paragraph(paragraph)
if heading_level is not None:
_set_title_style(paragraph, heading_level)
title_count += 1
else:
_set_body_style(paragraph)
body_count += 1
logger.info("段落处理完成: 标题=%d, 正文=%d", title_count, body_count)
# 遍历所有表格并应用样式
for table in doc.tables:
_set_table_style(table)
table_count += 1
logger.info("表格处理完成: 数量=%d", table_count)
# 设置页眉页脚
_add_header_footer(doc, filename)
# 保存优化后的文档
doc.save(str(output_file))
logger.info("文档优化完成: %s", output_file)
return str(output_file)
def generate_toc_from_document(doc_path: str) -> str:
"""
生成文档目录(辅助函数)
注意:python-docx 不支持直接生成目录,
此函数保留用于未来扩展或手动处理
Args:
doc_path: 文档路径
Returns:
目录内容(Markdown格式)
"""
doc = Document(doc_path)
toc_lines = ["# 目录\n\n"]
for paragraph in doc.paragraphs:
heading_level = _is_heading_paragraph(paragraph)
if heading_level is not None:
indent = " " * (heading_level - 1)
toc_lines.append(f"{indent}- {paragraph.text}")
return "\n".join(toc_lines)
# 文档内容国际化转换_优化需求文档
## 代码路径
- 代码路径:[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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论