You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 03:24:01