Shiqvlizi Name 47572fefb8 fix: 细节修改
2026-05-23 18:28:00 +08:00
2026-05-23 18:16:50 +08:00
2026-05-23 18:16:50 +08:00
2026-05-23 18:16:50 +08:00
2026-05-23 18:16:50 +08:00
2026-05-23 18:16:50 +08:00
2026-05-23 18:28:00 +08:00
2026-05-23 18:16:50 +08:00
2026-05-23 18:16:50 +08:00
2026-05-23 18:16:50 +08:00
2026-05-23 18:16:50 +08:00
2026-05-23 18:16:50 +08:00

云印享 - 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 日志和异常堆栈落盘到本地日志目录

项目结构

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. 还原依赖

dotnet restore .\CloudPrint.Client.csproj

2. 启动客户端

dotnet run --project .\CloudPrint.Client.csproj

3. 配置客户端

在“系统设置”页配置:

  • 服务器地址Go gRPC 后端地址,例如 http://localhost:8080
  • API Key后端为门店打印客户端分配的认证 Key
  • 门店名称:当前打印店名称
  • 本地文库目录:门店本地资料目录
  • 允许 HTTP gRPC本地开发或内网明文 HTTP/2 时启用,生产环境建议关闭
  • 最大上传大小、心跳间隔等运行参数

4. 注册并订阅任务

  1. 在主界面选择真实打印机
  2. 点击连接后端
  3. 点击订阅打印任务
  4. 保持客户端在线,后端推送任务后自动进入打印队列

开发命令

# 构建客户端
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 删除/取消真实系统队列任务

配置与安全

本地设置保存到:

%APPDATA%\CloudPrint.Client\settings.json

安全策略:

  • API Key 使用 Windows DPAPI 按当前用户加密保存
  • 管理员 access token 使用 Windows DPAPI 按当前用户加密保存
  • 设置文件复制到其他 Windows 用户后无法解密敏感字段
  • 生产环境建议使用 HTTPS/TLS gRPC并关闭 HTTP gRPC

日志

日志目录:

%APPDATA%\CloudPrint.Client\logs

记录内容包括:

  • 连接和注册结果
  • 打印任务状态
  • 文件下载和预处理结果
  • 打印失败异常
  • 全局未处理异常

注意事项

  • 本客户端不提供模拟后端或 DryRun运行时必须连接真实后端和真实打印机
  • Windows 自带的 Microsoft Print to PDFXPS Document WriterOneNoteFax 等不会作为门店打印机展示
  • 若门店电脑只安装虚拟打印设备,客户端打印机列表会为空
  • Office/TXT 文件转换依赖 LibreOffice请提前安装或配置 SOFFICE_PATH
  • PDF 打印建议安装 SumatraPDF以获得更稳定的命令行打印能力

后续优化

  • 根据后端最终 WebSocket 消息结构,将备用通道消息映射为打印任务或控制事件
  • 按后端任务字段接入 PDF 水印和合并业务流程
  • 增强 LibreOffice/SumatraPDF 路径检测和设置页提示
  • 增加托盘常驻、开机自启动、单实例运行和安装包
  • 继续提升同名文档并发场景下的 Windows JobId 匹配准确性

许可证

MIT License


© 2026 云印享 版权所有

Description
No description provided
Readme 106 KiB
Languages
C# 100%