本项目基于Python 3.12,采用策略模式+注册器模式的模块化处理器架构,支持批量打印多种文档格式:Word、PowerPoint、Excel、PDF、图片和文本文件。提供直观的图形用户界面,支持拖拽导入、智能文件类型过滤、精确页数统计、WPS格式兼容、灵活打印设置等功能,能显著提升办公文档打印效率。
- 主要编程语言: Python 3.12+
- GUI框架: tkinter, tkinterdnd2 (拖拽支持)
- 架构模式: 策略模式 + 注册器模式 + 插件化架构
- 文档处理库:
- python-docx (Word文档处理)
- python-pptx (PowerPoint处理)
- xlwings (Excel处理,精确页数统计)
- PyPDF2/pypdf (PDF处理)
- comtypes/pywin32 (Windows COM接口,用于调用Office应用)
- 打印控制: win32print, win32api (Windows打印API)
- 应用打包: PyInstaller (生成独立exe文件)
- 文件操作: pathlib, os (文件系统操作)
- 版本控制: Git
- 其他工具:
- pytest (单元测试)
- black (代码格式化)
- cx_Freeze 或 auto-py-to-exe (备选打包方案)
printer/
├── src/
│ ├── handlers/ # 🆕 文档处理器模块 (核心架构)
│ │ ├── __init__.py # 处理器导出
│ │ ├── base_handler.py # 基础处理器接口
│ │ ├── handler_registry.py # 处理器注册中心
│ │ ├── pdf_handler.py # PDF文档处理器
│ │ ├── word_handler.py # Word文档处理器
│ │ ├── powerpoint_handler.py # PowerPoint文档处理器
│ │ ├── excel_handler.py # Excel文档处理器
│ │ ├── image_handler.py # 图片文档处理器
│ │ ├── text_handler.py # 文本文档处理器
│ │ └── print_utils.py # 打印工具类
│ ├── gui/ # 图形用户界面模块
│ │ ├── components/ # GUI功能组件
│ │ │ ├── __init__.py # 组件导出
│ │ │ ├── file_import_handler.py # 文件导入功能处理器
│ │ │ ├── list_operation_handler.py # 列表操作功能处理器
│ │ │ ├── window_manager.py # 窗口管理器
│ │ │ └── tooltip.py # 浮窗提示组件
│ │ ├── main_window.py # 主窗口界面 (纯界面层)
│ │ ├── print_settings_dialog.py # 打印设置对话框
│ │ └── page_count_dialog.py # 页数统计对话框
│ ├── core/ # 核心业务逻辑模块 (重构)
│ │ ├── document_manager.py # 文档管理器
│ │ ├── print_controller.py # 基于处理器架构
│ │ ├── page_count_manager.py # 基于处理器架构
│ │ ├── settings_manager.py # 设置管理器
│ │ ├── printer_config_manager.py # 打印机配置管理器
│ │ └── models.py # 数据模型定义
│ └── utils/ # 工具类和辅助函数
│ └── config_utils.py # 配置文件操作
├── data/ # 应用数据存储目录
├── resources/ # 资源文件目录
│ └── app_icon.ico # 应用程序图标
├── main.py # 程序入口点
├── requirements.txt # Python依赖管理
├── build_v5.0.bat # v5.0构建脚本
├── 办公文档批量打印器v5.0.spec # PyInstaller打包配置
└── README.md # 项目文档
📋 v5.0 完整分层架构
┌─────────────────────────────────────────────────────────┐
│ 应用入口层 │
│ main.py - 程序启动入口和系统初始化 │
├─────────────────────────────────────────────────────────┤
│ GUI界面层 │
│ 主界面 │ 设置对话框 │ 页数统计对话框 │ 帮助界面 │
├─────────────────────────────────────────────────────────┤
│ GUI功能处理器层 🆕 │
│ FileImportHandler │ ListOperationHandler │ WindowManager │
├─────────────────────────────────────────────────────────┤
│ 核心业务逻辑层 │
│ DocumentManager │ PrintController │ SettingsManager │
├─────────────────────────────────────────────────────────┤
│ 文档处理器层 🆕 │
│ WordHandler │ PDFHandler │ PPTHandler │ ExcelHandler │ ImageHandler │ TextHandler │
├─────────────────────────────────────────────────────────┤
│ 基础工具层 │
│ ConfigUtils │ HandlerRegistry │ Models │ Types │
└─────────────────────────────────────────────────────────┘
定义所有文档处理器必须实现的统一接口:
class BaseDocumentHandler(ABC):
@abstractmethod
def get_supported_file_types(self) -> Set[FileType]
def get_supported_extensions(self) -> Set[str]
def can_handle_file(self, file_path: Path) -> bool
def print_document(self, file_path: Path, settings: PrintSettings) -> bool
def count_pages(self, file_path: Path) -> int负责管理和分发各种文档格式的处理器:
- 动态处理器注册和发现
- 基于文件类型和扩展名的智能路由
- 支持运行时添加新的处理器
- 统一的错误处理和日志记录
| 处理器 | 支持格式 | 功能 |
|---|---|---|
| PDFDocumentHandler | .pdf |
PDF打印 + 页数统计 |
| WordDocumentHandler | .doc, .docx, .wps |
Word打印 + 页数统计,支持WPS文字 |
| PowerPointDocumentHandler | .ppt, .pptx, .dps |
PPT打印 + 幻灯片统计,支持WPS演示 |
| ExcelDocumentHandler | .xls, .xlsx, .et |
Excel打印 + 工作表统计,支持WPS表格 |
| ImageDocumentHandler | .jpg, .png, .bmp, .tiff, .webp |
图片打印 + 页数统计(TIFF多页支持) |
| TextDocumentHandler | .txt |
文本打印 + 页数估算,智能编码检测 |
- 拖拽导入: 支持多种格式的拖拽数据解析
- 文件选择: 文件/文件夹选择对话框
- 格式过滤: 根据用户设置过滤文件类型
- 路径解析: 智能处理复杂文件路径
- 智能排序: 列表头点击排序,支持多字段排序
- 文件操作: 删除、清空、打开文件位置
- 右键菜单: 上下文相关的操作菜单
- 列表导出: CSV/文本格式的文档列表导出
- 几何状态: 窗口位置和大小的保存/恢复
- 用户偏好: 文件类型过滤器等设置持久化
- 窗口行为: 居中显示、最小尺寸、关闭处理
- 配置管理: 与ConfigManager的集成
- 基于处理器架构: 不再包含具体的格式处理逻辑
- 智能路由: 根据文件类型自动选择合适的处理器
- 统一接口: 所有文档类型使用相同的打印接口
- 增强错误处理: 处理器级别的错误隔离
- 并行优化: 支持多个处理器并行工作
- 模块化统计: 每种格式由专门的处理器负责
- 并行计算: 多线程并发处理大批量文档
- 统一结果格式: 所有处理器返回标准化的统计结果
- 缓存机制: 避免重复计算相同文档的页数
- 进度追踪: 大批量统计时提供实时进度更新
- 文档管理器 (
document_manager.py): 支持多种添加方式、文件格式过滤验证、文档列表管理与预览 - 设置管理器 (
settings_manager.py): 打印机选择、纸张设置、打印参数配置、用户偏好持久化 - 配置工具 (
config_utils.py): 应用程序配置文件操作、用户偏好设置、窗口状态保存
- 支持6种文档格式:PDF、Word、PowerPoint、Excel、图片、文本文件
- 统一的BaseDocumentHandler接口,确保所有处理器的一致性
- 智能注册中心HandlerRegistry,支持运行时动态加载处理器
- WPS兼容性:完整支持.wps、.dps、.et格式
- 实现了界面与业务逻辑的完全分离
- 添加新文档格式只需实现新的处理器类,无需修改现有代码
- 插件式架构支持第三方扩展
- 配置驱动的功能开关
- 处理器级别的错误隔离,单个格式的问题不影响其他格式
- 并行处理能力,支持多文档同时处理
- 详细的错误信息和建议
- 图片文件支持:.jpg, .jpeg, .png, .bmp, .tiff, .tif, .webp
- 文本文件支持:.txt,智能编码检测(UTF-8, GBK, GB2312等)
- WPS格式支持:.wps, .dps, .et,通过复用Office处理器实现
- 智能的文件类型识别和过滤
- 流畅的拖拽导入体验
- 详细的处理进度显示
- 提示系统:仅在文件类型过滤器显示tooltip提示
- 单个处理器的错误不会影响其他处理器
- 更好的错误定位和调试能力
- 提供详细的错误信息和建议
- 职责分离: 界面与功能逻辑彻底分离
- 代码可读性: 从1357行巨大文件拆分为4个清晰模块
- 维护便利: 修改功能无需接触界面代码
- 测试友好: 功能处理器可独立进行单元测试
- 复用性强: 功能处理器可在其他界面中复用
- 操作系统: Windows 10/11 (64位)
- Python版本: Python 3.8+ (推荐3.12+)
- Office软件: Microsoft Office 2016+ (用于.docx/.pptx/.xlsx文件处理)
- 系统权限: 需要打印机访问权限
# 1. 下载最新版本
https://github.com/icescat/batch-document-printer/releases/latest
# 2. 解压并运行
办公文档批量打印器v5.0.exe# 1. 克隆仓库
git clone https://github.com/icescat/batch-document-printer.git
cd batch-document-printer
# 2. 创建虚拟环境
python -m venv .venv
.venv\Scripts\activate
# 3. 安装依赖
pip install -r requirements.txt
# 4. 运行程序
python main.pypip install batch-document-printer
batch-printerclass PDFDocumentHandler(BaseDocumentHandler):
def count_pages(self, file_path: Path) -> int:
"""使用PyPDF2库解析PDF页数"""
def print_document(self, file_path: Path, settings: PrintSettings) -> bool:
"""通过Adobe Reader或Windows默认程序打印"""class WordDocumentHandler(BaseDocumentHandler):
def count_pages(self, file_path: Path) -> int:
"""通过python-docx或COM接口获取页数"""
def print_document(self, file_path: Path, settings: PrintSettings) -> bool:
"""使用Microsoft Word COM接口执行打印"""class PowerPointDocumentHandler(BaseDocumentHandler):
def count_pages(self, file_path: Path) -> int:
"""通过python-pptx或COM接口获取幻灯片数"""
def print_document(self, file_path: Path, settings: PrintSettings) -> bool:
"""使用Microsoft PowerPoint COM接口执行打印"""class ExcelDocumentHandler(BaseDocumentHandler):
def count_pages(self, file_path: Path) -> int:
"""
使用xlwings获取Excel精确打印页数:
1. 通过Excel原生API访问HPageBreaks和VPageBreaks
2. 计算实际打印页数: (水平分页符+1) × (垂直分页符+1)
3. 遍历所有工作表累加总页数
4. 确保每个工作表至少统计1页
"""
def print_document(self, file_path: Path, settings: PrintSettings) -> bool:
"""使用Microsoft Excel COM接口执行打印"""class ImageDocumentHandler(BaseDocumentHandler):
def count_pages(self, file_path: Path) -> int:
"""
智能图片页数统计:
- 一般图片格式(jpg, png, bmp, webp): 1页
- TIFF格式: 使用PIL检测实际页数(支持多页TIFF)
"""
def print_document(self, file_path: Path, settings: PrintSettings) -> bool:
"""通过Windows关联程序或系统打印服务打印图片"""class TextDocumentHandler(BaseDocumentHandler):
def count_pages(self, file_path: Path) -> int:
"""
智能文本页数估算:
1. 多编码检测: UTF-8, GBK, GB2312, ANSI等
2. 行数统计: 分析换行符和自动换行
3. 页数估算: 基于标准A4纸张尺寸和字体大小
4. 文件大小限制: 最大支持100MB文本文件
"""
def print_document(self, file_path: Path, settings: PrintSettings) -> bool:
"""使用notepad /p命令打印文本文件"""Excel页数统计技术细节:
- xlwings集成: 利用xlwings库直接访问Excel的原生分页符API,获得真实的打印页数
- 分页符分析: 统计水平分页符(HPageBreaks)和垂直分页符(VPageBreaks),精确计算页数
- 工作表遍历: 逐个处理每个工作表,累加总页数
- 错误处理: 单个工作表失败时自动补偿,确保统计结果的可靠性
def detect_file_type(file_path: Path) -> FileType:
"""
多层次文件类型识别:
1. 文件扩展名检查
2. MIME类型检测
3. 文件头魔数验证
"""class ParallelProcessor:
"""
基于线程池的并行文档处理:
- 动态调整工作线程数量
- 智能任务分配和负载均衡
- 实时进度监控和异常处理
"""class ErrorRecoveryManager:
"""
多级错误恢复策略:
- 自动重试机制
- 降级处理方案
- 详细错误日志记录
"""# 1. 克隆开发分支
git clone -b develop https://github.com/icescat/batch-document-printer.git
# 2. 安装开发依赖
pip install -r requirements-dev.txt
# 3. 安装pre-commit钩子
pre-commit install# 运行所有测试
pytest
# 运行特定模块测试
pytest tests/test_handlers/
# 生成测试覆盖率报告
pytest --cov=src --cov-report=html# 代码格式化
black src/
# 静态类型检查
mypy src/
# 代码风格检查
flake8 src/# 使用提供的构建脚本
.\build_v5.0.bat
# 或手动使用PyInstaller
pyinstaller 办公文档批量打印器v5.0.spec# 创建分发包
python setup.py sdist bdist_wheel
# 上传到PyPI
twine upload dist/*本项目采用 MIT许可证 - 查看LICENSE文件了解详情。
- ✅ 多格式支持扩展: 新增图片文件(.jpg, .jpeg, .png, .bmp, .tiff, .tif, .webp)和文本文件(.txt)支持
- ✅ WPS兼容性: 完整支持WPS格式(.wps, .dps, .et),复用Office处理器
- ✅ 智能提示系统: 优化的tooltip提示,仅在必要位置显示帮助信息
- ✅ 增强编码支持: 文本文件智能编码检测(UTF-8, GBK, GB2312等)
- 🔧 策略模式+注册器: 全新的模块化处理器架构,每种文件格式独立处理器
- 🔧 GUI组件分离: GUI功能模块化,提升代码可维护性
- 🔧 并发优化: 改进的多线程页数统计,提升处理效率
- 📈 支持Python 3.12+,向下兼容3.8+
- 📈 改进内存管理,减少大文件处理时的内存占用
- 📈 更快的启动速度和更稳定的COM接口调用
- 🐛 拖拽导入修复: 解决文件名包含空格时的导入失败问题
- 🐛 路径解析优化: 改进含特殊字符路径的处理逻辑
- ✅ 拖拽导入功能: 支持直接拖拽文件和文件夹到程序窗口
- ✅ 递归文件夹扫描: 自动搜索子文件夹中的支持文档
- ✅ 智能路径解析: 自动处理文件路径格式和特殊字符
- 🎨 更直观的文件添加方式
- 🎨 实时的文件类型过滤器应用
- 🎨 改进的操作反馈提示
- ✅ 页数统计功能: 全新的文档页数/张数统计功能
- ✅ 统计结果展示: 专用的页数统计对话框,提供详细结果
- ✅ 批量统计: 支持多文档同时统计,大幅提升效率
- ✅ 成本预估: 为用户提供打印页数参考,便于成本评估
- 🔧 优化数据模型,增加页数相关字段
- 🔧 完善界面交互,增强用户体验
- ✅ Excel文件支持: 新增.xls和.xlsx格式支持
- ✅ 文件类型过滤器: 独立的Word、PPT、Excel、PDF过滤开关
- ✅ 界面优化: 重新设计过滤器布局,提升使用便利性
- 🎨 文件类型可视化选择
- 🎨 改进的文件添加逻辑
- 🎨 优化的界面布局和交互
- ✅ 核心打印功能: 支持Word(.doc/.docx)、PowerPoint(.ppt/.pptx)、PDF文件的批量打印
- ✅ 图形化界面: 基于tkinter的直观用户界面
- ✅ 打印设置: 完整的打印参数配置(打印机、纸张、份数等)
- ✅ 文档管理: 支持添加、删除、清空文档列表
- 🔧 基于Python + tkinter的跨平台桌面应用
- 🔧 COM接口调用Microsoft Office组件
- 🔧 PyPDF2处理PDF文档
- 🔧 模块化的代码架构设计
⭐ 如果这个项目对您有帮助,请给个Star支持一下! | 💬 欢迎提出建议和反馈