2026-05-23 18:16:50 +08:00
|
|
|
|
# 云印享 - Windows 门店打印客户端
|
2026-04-29 22:57:28 +08:00
|
|
|
|
|
2026-05-23 18:16:50 +08:00
|
|
|
|
云印享 Windows 门店打印客户端是部署在打印店本地 Windows 电脑上的 WPF 程序,负责连接真实 Go gRPC 后端、注册本机打印机、订阅打印任务、预处理文件并调用 Windows 打印系统执行打印。
|
|
|
|
|
|
|
|
|
|
|
|
本客户端只承担 **门店本地管理与打印执行** 职责,不替代微信小程序、React 管理后台或 Go 后端服务。
|
|
|
|
|
|
|
|
|
|
|
|
## 技术栈
|
|
|
|
|
|
|
|
|
|
|
|
| 技术 | 说明 |
|
|
|
|
|
|
|------|------|
|
|
|
|
|
|
| 框架 | .NET 8 + WPF |
|
|
|
|
|
|
| 语言 | C# |
|
|
|
|
|
|
| 架构 | MVVM |
|
|
|
|
|
|
| 通信 | gRPC + WebSocket |
|
|
|
|
|
|
| 协议 | Protobuf |
|
|
|
|
|
|
| 打印 | Windows Print Spooler API / PrintDocument |
|
|
|
|
|
|
| 文件处理 | PDFsharp / SharpCompress / LibreOffice Headless |
|
|
|
|
|
|
| 配置安全 | Windows DPAPI |
|
|
|
|
|
|
|
|
|
|
|
|
## 功能模块
|
|
|
|
|
|
|
|
|
|
|
|
- 🖨️ **打印机管理** - 枚举本机实体/网络打印机,过滤 PDF、XPS、OneNote、Fax 等虚拟输出设备
|
|
|
|
|
|
- 📋 **打印任务队列** - 订阅后端任务流,自动顺序处理,支持暂停、恢复、取消任务
|
|
|
|
|
|
- 📄 **文件预处理** - 支持 PDF、图片、Office/TXT、ZIP、RAR 等文件处理
|
|
|
|
|
|
- 📌 **PDF 处理** - 支持订单页码范围裁剪
|
|
|
|
|
|
- 📁 **文库管理** - 管理员上传本地资料到后端文库服务
|
|
|
|
|
|
- 🔐 **认证与配置** - API Key 注册打印机,管理员登录,敏感配置 DPAPI 加密保存
|
|
|
|
|
|
- 🔄 **连接保活** - 心跳、订阅恢复、指数退避重连、任务去重
|
|
|
|
|
|
- 📝 **日志记录** - UI 日志和异常堆栈落盘到本地日志目录
|
|
|
|
|
|
|
|
|
|
|
|
## 项目结构
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
client/
|
|
|
|
|
|
├── App.xaml # 应用入口
|
|
|
|
|
|
├── CloudPrint.Client.csproj # WPF 项目文件
|
|
|
|
|
|
├── Helpers/ # Windows API 与 PDF 工具
|
|
|
|
|
|
│ ├── PdfProcessor.cs
|
|
|
|
|
|
│ └── WindowsPrintApi.cs
|
|
|
|
|
|
├── Infrastructure/ # MVVM 基础设施
|
|
|
|
|
|
│ ├── AsyncRelayCommand.cs
|
|
|
|
|
|
│ ├── ObservableObject.cs
|
|
|
|
|
|
│ ├── RelayCommand.cs
|
|
|
|
|
|
│ └── WpfUiDispatcher.cs
|
|
|
|
|
|
├── Models/ # 领域模型
|
|
|
|
|
|
│ ├── ClientSettings.cs
|
|
|
|
|
|
│ ├── Document.cs
|
|
|
|
|
|
│ ├── Printer.cs
|
|
|
|
|
|
│ └── PrintJob.cs
|
|
|
|
|
|
├── Services/ # 业务服务
|
|
|
|
|
|
│ ├── Abstractions/ # 服务接口
|
|
|
|
|
|
│ ├── Grpc/ # gRPC metadata 与模型映射
|
|
|
|
|
|
│ ├── Printing/ # 打印执行器与队列服务
|
|
|
|
|
|
│ ├── FileService.cs # 文件校验、解压、转换
|
|
|
|
|
|
│ ├── GrpcService.cs # 后端 gRPC 通信
|
|
|
|
|
|
│ ├── JsonSettingsService.cs # 本地配置持久化
|
|
|
|
|
|
│ ├── PrintJobCoordinator.cs # 打印任务协调流程
|
|
|
|
|
|
│ ├── PrintService.cs # 打印服务门面
|
|
|
|
|
|
│ └── WebSocketService.cs # WebSocket 备用通道
|
|
|
|
|
|
├── ViewModels/ # 页面 ViewModel
|
|
|
|
|
|
│ ├── MainViewModel.cs
|
|
|
|
|
|
│ ├── PrintQueueViewModel.cs
|
|
|
|
|
|
│ ├── LibraryViewModel.cs
|
|
|
|
|
|
│ └── SettingsViewModel.cs
|
|
|
|
|
|
├── Views/ # WPF 页面
|
|
|
|
|
|
│ ├── MainWindow.xaml
|
|
|
|
|
|
│ ├── PrintQueueView.xaml
|
|
|
|
|
|
│ ├── LibraryView.xaml
|
|
|
|
|
|
│ └── SettingsView.xaml
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 环境要求
|
|
|
|
|
|
|
|
|
|
|
|
- Windows 10/11
|
|
|
|
|
|
- .NET 8 SDK 或 .NET 8 Desktop Runtime
|
|
|
|
|
|
- 可用的 Go gRPC 后端服务
|
|
|
|
|
|
- 真实有效的打印客户端 API Key
|
|
|
|
|
|
- 至少一台实体或网络 Windows 打印机
|
|
|
|
|
|
- PDF 打印建议安装 SumatraPDF
|
|
|
|
|
|
- Office/TXT 转 PDF 需要安装 LibreOffice 或配置 `SOFFICE_PATH`
|
|
|
|
|
|
|
|
|
|
|
|
## 快速开始
|
|
|
|
|
|
|
|
|
|
|
|
### 1. 还原依赖
|
|
|
|
|
|
|
|
|
|
|
|
```powershell
|
|
|
|
|
|
dotnet restore .\CloudPrint.Client.csproj
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 2. 启动客户端
|
|
|
|
|
|
|
|
|
|
|
|
```powershell
|
|
|
|
|
|
dotnet run --project .\CloudPrint.Client.csproj
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 3. 配置客户端
|
|
|
|
|
|
|
|
|
|
|
|
在“系统设置”页配置:
|
|
|
|
|
|
|
|
|
|
|
|
- 服务器地址:Go gRPC 后端地址,例如 `http://localhost:8080`
|
|
|
|
|
|
- API Key:后端为门店打印客户端分配的认证 Key
|
|
|
|
|
|
- 门店名称:当前打印店名称
|
|
|
|
|
|
- 本地文库目录:门店本地资料目录
|
|
|
|
|
|
- 允许 HTTP gRPC:本地开发或内网明文 HTTP/2 时启用,生产环境建议关闭
|
|
|
|
|
|
- 最大上传大小、心跳间隔等运行参数
|
|
|
|
|
|
|
|
|
|
|
|
### 4. 注册并订阅任务
|
|
|
|
|
|
|
|
|
|
|
|
1. 在主界面选择真实打印机
|
|
|
|
|
|
2. 点击连接后端
|
|
|
|
|
|
3. 点击订阅打印任务
|
|
|
|
|
|
4. 保持客户端在线,后端推送任务后自动进入打印队列
|
|
|
|
|
|
|
|
|
|
|
|
## 开发命令
|
|
|
|
|
|
|
|
|
|
|
|
```powershell
|
|
|
|
|
|
# 构建客户端
|
|
|
|
|
|
dotnet build .\CloudPrint.Client.csproj
|
|
|
|
|
|
|
|
|
|
|
|
# 检查依赖漏洞
|
|
|
|
|
|
dotnet list .\CloudPrint.Client.csproj package --vulnerable
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 对接服务
|
|
|
|
|
|
|
|
|
|
|
|
客户端基于 `backend/cloudprint-backend/proto/cloudprint.proto` 生成 C# gRPC Stub,主要对接以下服务:
|
|
|
|
|
|
|
|
|
|
|
|
| 服务 | 用途 |
|
|
|
|
|
|
|------|------|
|
|
|
|
|
|
| PrintService.RegisterPrinter | 注册本机打印机 |
|
|
|
|
|
|
| PrintService.PrinterHeartbeat | 上报打印机心跳和状态 |
|
|
|
|
|
|
| PrintService.SubscribeJobs | 订阅后端打印任务流 |
|
|
|
|
|
|
| PrintService.ReportJobStatus | 上报打印任务进度和结果 |
|
|
|
|
|
|
| PrintService.CancelPrintJob | 取消后端打印任务 |
|
|
|
|
|
|
| FileService.GetFile | 下载待打印文件 |
|
|
|
|
|
|
| LibraryService.UploadFile | 上传门店文库文件 |
|
|
|
|
|
|
| AdminService.Login | 管理员登录 |
|
|
|
|
|
|
|
|
|
|
|
|
## 文件处理能力
|
|
|
|
|
|
|
|
|
|
|
|
| 类型 | 格式 | 处理方式 |
|
|
|
|
|
|
|------|------|----------|
|
|
|
|
|
|
| PDF | `.pdf` | 支持页码范围裁剪,直接提交 PDF 打印 |
|
|
|
|
|
|
| 图片 | `.jpg`, `.jpeg`, `.png`, `.bmp`, `.gif` | 使用 `PrintDocument` 等比缩放打印 |
|
|
|
|
|
|
| Office | `.doc`, `.docx`, `.xls`, `.xlsx`, `.ppt`, `.pptx` | 通过 LibreOffice Headless 转 PDF 后打印 |
|
|
|
|
|
|
| 文本 | `.txt` | 通过 LibreOffice Headless 转 PDF 后打印 |
|
|
|
|
|
|
| 压缩包 | `.zip`, `.rar` | 使用 SharpCompress 解压首个可打印文件后继续处理 |
|
|
|
|
|
|
|
|
|
|
|
|
压缩包处理会限制条目数量、嵌套层级和单文件大小,并清理压缩包内路径,避免路径穿越。
|
|
|
|
|
|
|
|
|
|
|
|
## 打印行为
|
|
|
|
|
|
|
|
|
|
|
|
- 客户端只展示实体/网络打印机,默认过滤虚拟输出设备
|
|
|
|
|
|
- PDF 打印优先使用 SumatraPDF,未安装时回退系统默认 PDF 打印程序的 `printto` 动作
|
|
|
|
|
|
- 图片打印使用 `PrintDocument`
|
|
|
|
|
|
- 其他格式在预处理后无法匹配专用执行器时回退 RAW 打印
|
|
|
|
|
|
- Windows 队列 JobId 优先通过 WinSpool `EnumJobs` 捕获,WMI 兜底
|
|
|
|
|
|
- 取消任务时优先通过 WinSpool `SetJob` 删除/取消真实系统队列任务
|
|
|
|
|
|
|
|
|
|
|
|
## 配置与安全
|
|
|
|
|
|
|
|
|
|
|
|
本地设置保存到:
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
%APPDATA%\CloudPrint.Client\settings.json
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
安全策略:
|
|
|
|
|
|
|
|
|
|
|
|
- API Key 使用 Windows DPAPI 按当前用户加密保存
|
|
|
|
|
|
- 管理员 access token 使用 Windows DPAPI 按当前用户加密保存
|
|
|
|
|
|
- 设置文件复制到其他 Windows 用户后无法解密敏感字段
|
|
|
|
|
|
- 生产环境建议使用 HTTPS/TLS gRPC,并关闭 HTTP gRPC
|
|
|
|
|
|
|
|
|
|
|
|
## 日志
|
|
|
|
|
|
|
|
|
|
|
|
日志目录:
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
%APPDATA%\CloudPrint.Client\logs
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
记录内容包括:
|
|
|
|
|
|
|
|
|
|
|
|
- 连接和注册结果
|
|
|
|
|
|
- 打印任务状态
|
|
|
|
|
|
- 文件下载和预处理结果
|
|
|
|
|
|
- 打印失败异常
|
|
|
|
|
|
- 全局未处理异常
|
|
|
|
|
|
|
|
|
|
|
|
## 注意事项
|
|
|
|
|
|
|
|
|
|
|
|
- 本客户端不提供模拟后端或 DryRun,运行时必须连接真实后端和真实打印机
|
|
|
|
|
|
- Windows 自带的 `Microsoft Print to PDF`、`XPS Document Writer`、`OneNote`、`Fax` 等不会作为门店打印机展示
|
|
|
|
|
|
- 若门店电脑只安装虚拟打印设备,客户端打印机列表会为空
|
|
|
|
|
|
- Office/TXT 文件转换依赖 LibreOffice,请提前安装或配置 `SOFFICE_PATH`
|
|
|
|
|
|
- PDF 打印建议安装 SumatraPDF,以获得更稳定的命令行打印能力
|
|
|
|
|
|
|
|
|
|
|
|
## 后续优化
|
|
|
|
|
|
|
|
|
|
|
|
- 根据后端最终 WebSocket 消息结构,将备用通道消息映射为打印任务或控制事件
|
|
|
|
|
|
- 按后端任务字段接入 PDF 水印和合并业务流程
|
|
|
|
|
|
- 增强 LibreOffice/SumatraPDF 路径检测和设置页提示
|
|
|
|
|
|
- 增加托盘常驻、开机自启动、单实例运行和安装包
|
|
|
|
|
|
- 继续提升同名文档并发场景下的 Windows JobId 匹配准确性
|
|
|
|
|
|
|
|
|
|
|
|
## 许可证
|
|
|
|
|
|
|
|
|
|
|
|
MIT License
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
© 2026 云印享 版权所有
|