Files
client/README.md
2026-05-23 18:16:50 +08:00

214 lines
7.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 云印享 - Windows 门店打印客户端
云印享 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 云印享 版权所有