打印机重定向系列 01:Windows 打印体系与重定向方案
前言
在云电脑和远程桌面场景中,打印机重定向是一个很典型的外设能力。
用户在本地终端旁边有一台打印机,但办公软件运行在云电脑中。用户希望在云电脑里点击打印后,纸张能从本地打印机输出。
这件事看起来像“把打印数据发到本地”,但真正落地时会涉及操作系统打印栈、打印机驱动、页面描述语言、端口监视器、后台打印服务和网络转发。
如果不了解 Windows 打印体系,很容易把打印机重定向误解成普通数据转发。实际上,打印机重定向的关键是选好拦截层级:是在驱动层转发,还是在端口层转发,还是传输 PDF/XPS 这类中间格式。
本文先从 Windows 打印体系讲起,再总结几类常见打印机重定向方案。
本文只保留公开技术思路,不展开内部模块名、函数名、私有协议和项目代码。
一、Windows 打印体系的基本链路
Windows 打印系统是分层架构。
一次典型打印作业可以简化为:
应用程序
-> GDI / XPS
-> 打印后台处理程序
-> 打印机驱动
-> 端口监视器
-> 物理打印机
每一层都有明确职责。
1. 应用程序层
应用程序负责发起打印。
传统应用通常通过 GDI 打印接口输出绘图命令,例如文本、线条、位图、路径等。现代应用也可能直接生成 XPS 文档,或者通过系统打印框架输出更高层的页面描述。
对应用来说,它通常只关心:
- 使用哪台打印机。
- 页面大小。
- 纸张方向。
- 份数。
- 双面打印。
- 彩色或黑白。
- 打印范围。
后续如何把页面转成打印机能理解的数据,由系统打印栈和驱动处理。
2. GDI / XPS 图形路径
Windows 打印路径中常见两类中间表达。
一类是 GDI/EMF 路径。GDI 会把应用的绘图命令记录为 EMF,也就是增强型图元文件。EMF 更像一组设备无关的绘图指令,包含文本、图像、线条、路径等描述。
另一类是 XPS 路径。XPS 基于 XML 相关规范,能更好表达现代图形能力,例如透明度、渐变和复杂页面布局。
可以粗略理解为:
传统应用
-> GDI 绘图命令
-> EMF
现代打印路径
-> XPS 文档
Windows 会根据应用、驱动和打印机能力在不同路径之间做适配。
3. 打印后台处理程序
打印后台处理程序通常由 spoolsv.exe 服务承载。
它负责:
- 接收应用提交的打印作业。
- 把作业假脱机到磁盘。
- 管理打印队列。
- 处理暂停、恢复、取消等队列操作。
- 调度打印作业给对应打印机驱动。
假脱机的意义是让应用不用一直等待打印机慢慢输出。应用把打印作业提交给系统后,后续排队、渲染和发送可以由后台处理。
4. 打印机驱动
打印机驱动负责把设备无关的页面描述转换成打印机能理解的页面描述语言。
常见页面描述语言包括:
- PCL。
- PostScript。
- ESC/P。
- ZPL。
- 厂商自定义指令集。
驱动会根据打印机能力处理:
- 字体。
- 图像压缩。
- 颜色转换。
- 分辨率。
- 纸盒选择。
- 双面打印。
- 装订、水印等功能。
最终输出的是打印机可识别的数据流。
5. 端口监视器
端口监视器负责把驱动生成的数据发送到目标设备。
常见端口包括:
- USB 端口。
- TCP/IP 端口。
- LPR/LPD 端口。
- 本地端口。
- 虚拟端口。
打印机重定向经常会在这一层做文章,因为打印数据经过驱动渲染后,已经变成目标打印机能理解的 PDL 数据流。此时如果拦截端口输出,就可以把数据通过网络转发到本地打印机。
二、EMF、XPS 和 PDL 的关系
理解打印机重定向,需要区分三个层次。
1. EMF / XPS:偏设备无关
EMF 和 XPS 更接近系统内部或中间层的页面描述。
它们表达的是“页面上有什么”,例如文字、图片、图形和布局。它们不一定绑定某一台具体打印机。
2. PDL:偏设备相关
PDL 是打印机最终要接收的数据。
同一页文档,在不同打印机驱动下生成的 PDL 可能不同。因为不同打印机支持的语言、分辨率、纸盒、颜色能力和厂商扩展不一样。
3. 打印驱动完成从中间格式到 PDL 的转换
打印驱动的核心职责,就是根据打印机能力把 EMF/XPS 这类中间描述转成 PDL。
可以抽象为:
EMF / XPS
-> 打印机驱动渲染
-> PDL 数据流
-> 端口发送
-> 打印机输出
打印机重定向如果选择在不同层级拦截,就会得到不同类型的数据。
三、打印机重定向的核心问题
在云电脑场景中,打印机通常位于本地终端侧,而应用运行在云电脑侧。
因此系统要回答几个问题:
- 云电脑侧是否需要安装本地打印机驱动?
- 云电脑侧看到的是虚拟打印机,还是真实网络打印机?
- 打印数据在云电脑侧渲染,还是本地终端侧渲染?
- 网络上传输的是 PDL,还是 PDF/XPS,还是更底层控制信息?
- 本地打印机状态如何反馈给云电脑?
- 打印作业取消、失败、缺纸、离线如何处理?
不同方案对这些问题的回答不同。
四、方案一:虚拟打印机驱动重定向
第一类方案是在云电脑侧创建虚拟打印机驱动或虚拟打印设备。
应用在云电脑中选择这台虚拟打印机打印。打印请求进入 Windows 打印栈后,被虚拟打印组件截获,再通过远程协议发送到本地终端。
简化链路如下:
云电脑应用
-> GDI / XPS
-> 打印后台处理程序
-> 虚拟打印机驱动
-> 远程协议
-> 本地终端
-> 本地打印机
这种方案的特点是可以深度控制打印流程。
它可以在较高层捕获打印作业,保留较多作业元数据,例如文档名、页数、打印选项、用户信息等。也可以和远程桌面协议结合,形成较完整的打印机映射体验。
但它的难点也明显:
- 需要处理 Windows 打印驱动和队列模型。
- 驱动安装和签名要求较高。
- 不同应用和不同打印路径兼容性复杂。
- 打印机能力映射需要设计清楚。
- 本地真实打印机状态反馈链路更复杂。
这类方案适合需要深度集成远程桌面体验的场景。
五、方案二:本地端口监听重定向
第二类方案是在云电脑侧使用真实打印机驱动,但把打印机端口配置为一个本地虚拟端口或本地监听服务。
应用打印时,云电脑完整打印栈先正常工作:应用输出、后台处理、驱动渲染。驱动生成目标打印机可识别的 PDL 数据后,端口层不直接发给物理打印机,而是把数据交给本地监听服务,再通过网络转发到本地终端。
简化链路如下:
云电脑应用
-> GDI / XPS
-> 打印后台处理程序
-> 真实打印机驱动
-> 虚拟本地端口
-> 网络转发服务
-> 本地终端
-> 本地打印机
这种方案传输的通常是已经渲染好的 PDL 数据流。
它的优势是:
- 云电脑侧使用真实打印机驱动,打印效果更接近直连。
- 转发层不需要理解复杂页面内容。
- 端口层拦截相对直观。
- 对网络打印机 RAW 9100 这类场景比较自然。
它的限制是:
- 云电脑侧需要有匹配驱动。
- 驱动安装和匹配会影响自动化体验。
- PDL 与具体打印机相关,换打印机可能不能复用。
- 打印机状态、双向通信、SNMP 查询等需要额外处理。
这类方案适合“云电脑侧能安装目标打印机驱动”的环境。
六、方案三:通用驱动加中间格式重定向
第三类方案是让云电脑侧使用通用打印驱动,生成 PDF、XPS 或其他中间格式,然后把中间格式传到本地终端,由本地终端完成最终打印。
简化链路如下:
云电脑应用
-> 通用 PDF / XPS 打印驱动
-> 生成中间格式文档
-> 网络传输
-> 本地终端解析文档
-> 本地打印机驱动渲染
-> 本地打印机输出
这种方案的优势是:
- 云电脑侧不需要安装每台真实打印机的专用驱动。
- 网络上传输的是相对通用的文档格式。
- 打印机差异主要交给本地终端处理。
- 更适合多型号打印机环境。
它的限制是:
- 打印效果取决于中间格式转换质量。
- 某些高级打印能力不容易完整映射。
- 本地终端需要具备解析和打印中间格式的能力。
- 作业选项在云电脑和本地之间需要重新映射。
这类方案适合追求通用性和部署简化的场景。
七、三种方案对比
| 维度 | 虚拟打印机驱动 | 本地端口监听 | 通用驱动 + 中间格式 |
|---|---|---|---|
| 拦截层级 | 打印驱动或虚拟设备层 | 端口输出层 | 中间文档层 |
| 云电脑是否需要真实驱动 | 不一定 | 通常需要 | 通常不需要 |
| 传输内容 | 作业数据、元数据或渲染数据 | PDL 数据流 | PDF/XPS 等中间格式 |
| 打印效果 | 取决于虚拟驱动和本地处理 | 接近真实驱动输出 | 取决于中间格式保真度 |
| 部署复杂度 | 高 | 中 | 中低 |
| 定制能力 | 高 | 中 | 中 |
| 打印机状态反馈 | 可设计较完整 | 需额外处理 | 需额外处理 |
| 适用场景 | 远程桌面深度集成 | 指定型号或网络打印机 | 多型号通用打印 |
没有一种方案绝对最好。实际产品中经常会组合使用。
例如:
- 对网络打印机,优先使用端口监听和转发。
- 对未知型号打印机,使用通用 PDF/XPS 路径。
- 对企业远程桌面,使用虚拟打印机统一承载体验。
八、Linux CUPS 打印体系
打印机重定向不只存在于 Windows。Linux 桌面通常基于 CUPS 管理打印。
CUPS 的典型链路可以简化为:
应用程序
-> CUPS 客户端接口
-> cupsd
-> 过滤器链
-> 后端
-> 物理打印机
1. cupsd
cupsd 是 CUPS 的核心守护进程,负责:
- 接收打印作业。
- 管理打印队列。
- 调度过滤器。
- 处理用户认证和权限。
- 提供 IPP 服务。
2. 过滤器链
CUPS 会根据输入文件类型和目标打印机能力,选择一组过滤器,把文档转换成打印机可接收的数据。
例如:
PDF
-> PDF 预处理
-> PostScript 或 Raster
-> 打印机专用数据
过滤器链承担了类似 Windows 打印驱动渲染的角色。
3. 后端
CUPS 后端负责最终传输。
常见后端包括:
ipp。socket。lpd。usb。smb。
其中 socket 常用于 RAW 9100 网络打印机。
4. PPD 和 IPP Everywhere
传统 CUPS 通过 PPD 描述打印机能力,例如纸张、分辨率、双面、颜色模式和过滤器。随着 IPP Everywhere 普及,越来越多打印机可以通过 IPP 自动通告能力,减少手动驱动和 PPD 配置。
九、打印机重定向的方案选择
选择打印机重定向方案时,可以按几个问题判断。
1. 云电脑侧能否安装驱动
如果云电脑侧能自动安装目标打印机驱动,本地端口监听方案更容易保持打印效果。
如果不能安装驱动,通用 PDF/XPS 路径更稳。
2. 是否需要完整打印机能力
如果需要纸盒、双面、装订、高级色彩等能力,真实驱动路径更有优势。
如果只是普通文档打印,通用中间格式通常足够。
3. 是否需要状态反馈
缺纸、离线、卡纸、墨粉不足等状态反馈,需要额外链路支持。仅转发 PDL 数据不一定能获得完整状态。
4. 打印机类型是否固定
企业内固定型号打印机,可以预置驱动和配置。
普通用户自带打印机,型号不可控,更适合通用方案或自动发现配置。
总结
打印机重定向的关键,是理解 Windows 和 Linux 打印体系中的数据流。
Windows 打印链路大致是应用、GDI/XPS、打印后台处理程序、打印机驱动、端口监视器、物理打印机。CUPS 则通过 cupsd、过滤器链和后端完成类似职责。
不同打印机重定向方案的本质差异,在于拦截层级不同:
- 虚拟打印机驱动方案偏深度集成。
- 本地端口监听方案偏真实驱动输出转发。
- 通用驱动加 PDF/XPS 方案偏通用性和易部署。
下一篇会继续讨论网络打印机重定向:如何发现网络打印机、如何捕获 RAW 9100 打印流、为什么 Linux 端还要处理 SNMP,以及自动配置流程中常见的工程问题。
浙公网安备 33010602011771号