C# WPF中如何通过代码检查系统是否存在「Microsoft Print to PDF」打印机
WPF/C# 校验「Microsoft Print to PDF」打印机存在性实现方案
核心思路
直接枚举系统本地已安装的打印机队列,匹配对应打印机的显示名称即可完成存在性校验,全程无需引入第三方依赖,适配WPF项目的运行环境。
方案1:调用WPF原生打印API(推荐首选)
该方案是WPF官方提供的打印操作入口,无额外兼容风险:
- 前置准备:在项目中添加
System.Printing程序集引用 - 核心实现代码:
using System.Printing; using System.Linq; public bool IsMicrosoftPrintToPdfInstalled() { // 加载本地打印服务器实例,获取所有本地打印机队列 using var localPrintServer = new LocalPrintServer(); var localPrinters = localPrintServer.GetPrintQueues(new[] { EnumeratedPrintQueueTypes.Local }); // 大小写不敏感匹配,兼容系统语言、版本差异带来的名称大小写问题 return localPrinters.Any(printer => string.Equals(printer.FullName, "Microsoft Print to PDF", StringComparison.OrdinalIgnoreCase)); }
- 适配特性:
- 获取的打印机列表和系统「打印机和扫描仪」设置页展示内容完全一致,不会出现列表遗漏
- 普通用户权限即可正常调用,不需要申请管理员权限
- 支持.NET Core、.NET 5+、.NET Framework全版本WPF项目
方案2:Win32 API P/Invoke实现(低版本兼容)
针对基于.NET Framework 3.5及更早版本开发、无法引入System.Printing程序集的项目,可通过平台调用方式引入WinSpool.drv中的打印枚举接口实现:
- 核心流程:通过
EnumPrinters接口枚举本地安装的打印机列表,沿用上述名称匹配逻辑完成校验 - 注意:该方案需要手动声明相关Win32 API签名,适配成本略高于原生API方案
实操注意事项
- 不建议通过硬编码读取注册表的方式获取打印机列表:Windows不同大版本下打印机配置的注册表存储路径存在调整,容易引发兼容问题
- 匹配逻辑不要做严格的大小写敏感判断:部分系统环境下的打印机名称可能存在大小写字符差异,会导致校验结果误判
- 校验未通过时,可直接引导用户在Windows「设置-应用-可选功能」中启用「Microsoft Print to PDF」虚拟组件,无需额外开发修复逻辑
系统打印选项界面参考示意图:
打印界面示例
内容的提问来源于stack exchange,提问作者ptPham
相关产品推荐
相关产品推荐

