基于 PRD.md 完整实现的 Windows 批量打印桌面应用(C# / .NET 8 / WPF)。
批量打印助手是一款面向办公场景的 Windows 桌面工具,用于一次性打印大量异构文档: 支持 PDF、Word、Excel、PowerPoint、图片、TXT、CSV 等多种格式混排批量打印, 支持逐文件独立设置打印参数(份数、单双面、彩色、纸张、缩放、N-up、水印等), 自动生成打印任务规划(相同参数合并、不同参数拆分)、后台队列监控与一键批量打印。
- 发布版(推荐,零依赖):把
dist文件夹中的BatchPrint.exe(主程序)+BatchPrint.Worker.exe(Office/LibreOffice 转换子进程) 一起发给对方(放在同一文件夹)。两者均为自包含单文件(已内嵌 .NET 8 运行时与 PDFium/Skia/SQLite 原生库),目标机器无需安装任何环境,双击即用(需 Windows x64,支持 Win10/11)。 - 开发版:需 .NET 8 SDK;
dotnet run --project src\BatchPrint.App。 - 可选功能依赖:Office 文档(.docx/.xlsx/.pptx)转换支持三种引擎(自动选择)——Microsoft Office、WPS Office(COM,Worker 子进程隔离)、LibreOffice。目标机器安装三者之一即可;未安装对应格式转换引擎时会提示,其余功能不受影响。转换模式可在"设置 → 转换"中选择(自动 / 优先 Office / 优先 WPS / 优先 LibreOffice / 仅某引擎)。
| 模块 | 说明 | 对应 PRD |
|---|---|---|
| 文件导入 | PDF / Word / Excel / PowerPoint / 图片 / TXT / CSV,拖拽导入、文件夹扫描、自然排序、智能模板 | §12 / §13 |
| 打印参数 | 逐文件设置:打印机、份数、页码、单双面、彩色、纸张、纸盒、方向、缩放、N-up、质量、DPI、水印、页眉页脚、手动双面 | §15 |
| 打印机 | 枚举、状态、能力检测(PrintCapabilities)、默认打印机、驱动属性窗口、测试页 | §14 |
| 任务规划 | 相同参数合并 / 不同参数拆分、独立任务、分组、暂停点、纸张估算 | §18 / §20 |
| 打印队列 | 队列状态监控(1 秒轮询)、暂停 / 恢复 / 取消、完成历史 | §21 |
| 打印执行 | 打印前检查、一键批量打印、进度显示、失败重试 | §22 |
| 模板 | 内置 5 种模板 + 自定义模板,参数一键套用 | §23 |
| 历史记录 | 打印历史自动保存、重新打印、清理 | §24 |
| 设置 | 语言、外观、安全(管理员权限 / 提示)、数据目录、兼容选项 | §25 |
| 转换 | PDF(PDFium)、图片(SkiaSharp)、TXT(编码自动识别)、Office(COM 隔离子进程 / LibreOffice Headless) | §16 |
| 拼版与排版 | N-up 多页拼版、证件照 1/2/4 张拼版、水印叠加、页眉页脚 | §17 |
- 首页:最近任务、快速开始(添加文件 / 文件夹)、模板入口
- 工作台:三栏布局(文件列表 / 预览 / 打印参数),预览支持页码导航与缩放(矢量重绘,高 DPI 清晰)
- 打印队列:实时任务列表与状态、暂停 / 恢复 / 取消
- 打印机:打印机列表、状态、能力、测试页、默认打印机
- 模板:内置 + 自定义模板管理
- 历史:打印历史记录、重新打印
- 设置:语言、外观、安全、数据目录、兼容选项
# 还原并构建(依赖已配置 NuGet 国内镜像,见 src/NuGet.Config)
dotnet build BatchPrint.sln -c Release
# 运行冒烟测试(含真实打印提交验证)
dotnet run --project tests\SmokeTest -c Release
# 发布自包含单文件(零依赖分发版)
dotnet publish src\BatchPrint.App -c Release -r win-x64 --self-contained true `
-p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -p:DebugType=None
dotnet publish src\BatchPrint.Worker -c Release -r win-x64 --self-contained true `
-p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -p:DebugType=Nonesrc/
BatchPrint.Core/ 领域模型、文件导入、打印参数、任务规划引擎(无 UI 依赖)
BatchPrint.Printing/ Win32 Spooler 封装(EnumJobs/SetJob)、PrintCapabilities/PrintTicket、静默提交
BatchPrint.Pdf/ PDFium 封装(渲染、缩略图、页面处理、TXT→PDF)、打印渲染管线
BatchPrint.Imaging/ SkiaSharp 图片解码、N-up/证件照拼版、颜色转换
BatchPrint.Office/ Office COM 转换(Word/Excel/PowerPoint,宏禁用)
BatchPrint.LibreOffice/ LibreOffice 检测与 Headless 转换
BatchPrint.Persistence/ SQLite 存储(模板、历史、设置)、内置模板
BatchPrint.Worker/ 转换子进程(COM 隔离,JSON 协议)
BatchPrint.App/ WPF 主程序(MVVM、DI、Serilog)
tests/
SmokeTest/ 端到端冒烟测试(含真实打印)
- .NET 8 / WPF / CommunityToolkit.Mvvm / Microsoft.Extensions.DependencyInjection
- PDFium(PDF 渲染)、SkiaSharp(图像处理)、Microsoft.Data.Sqlite(SQLite 存储)
- Microsoft Office Interop(可选)、LibreOffice Headless(可选)
- Serilog(日志,崩溃报告自动收集)
- 打印出来模糊? 打印渲染固定 300 DPI 输出(按打印机分辨率自动提升,上限 450 DPI),确保位图分辨率不低于物理打印分辨率。
- 队列页任务列表为空? 使用 Win32 EnumJobs 枚举(System.Printing 的 GetPrintJobInfoCollection 在部分打印机上返回空)。
- Office 文档提示"未检测到"? 目标机器需安装 Microsoft Office 或 LibreOffice。
- Worker 启动失败?
BatchPrint.Worker.exe必须与主程序位于同一文件夹。
本项目代码仅作学习与内部使用,请勿用于商业用途。