编程语言
首页 > 编程语言> > c# – 如何确定Adobe PDF打印机的“Ne”端口?

c# – 如何确定Adobe PDF打印机的“Ne”端口?

作者:互联网

如何检测打印机所在的端口(Ne01:,Ne02:,Ne99:等)?

BigCorp的计算机(WinXP)安装了Adobe Acrobat(版本7.0 Pro),它提供了一个名为“Adobe PDF”的虚拟打印机.如果在录制宏的同时将Excel(2003)工作簿打印为pdf,则打印机的全名为“Nexx上的Adobe PDF:”,其中xx是两位数….并且根据您尝试使用的计算机而有所不同.

我已经使用Excel.Interop编写了一个C#控制台应用程序(我强烈反对其他任何人开始这条路走向地狱),这会打开一系列电子表格.它在每个中运行一个宏,保存,打印为pdf,然后将pdf移动到共享驱动器上的报告文件夹.

我面临的问题是,每次安装Acrobat似乎都会为PDF打印机选择一个随机端口号…我无法弄清楚如何获得它.

到目前为止,我已经尝试过像这样使用Win32_Printer class

var searcher = new ManagementObjectSearcher( @"SELECT * FROM Win32_Printer" );
foreach ( ManagementObject printer in searcher.Get() )
{
   if ( Regex.IsMatch( printer["Name"].ToString(), @"(adobe|pdf)", RegexOptions.IgnoreCase ) )
   {
       //printer["Name"];    => "Adobe PDF"
       //printer["PortName"] => "my documents/*.pdf"
       foreach ( PropertyData pd in printer.Properties )
       {
           Console.WriteLine(string.Format("{0}, {1}", pd.Name, pd.Value));
       }
           break;
      }
}

我还在System.Drawing.Printing类中探讨过. PrinterSettings.InstalledPrinters将为您提供打印机“Adobe PDF”的名称,但我无法弄清楚如何获取端口信息.

如果我只将“Adobe PDF”传递给excel interop PrintOut()方法,它有时会工作,有时会因“文档无法打印”而失败……我无法弄清楚原因.

如果我使用适当的x值传递硬编码的“Nexx上的Adobe PDF:”,它每次都有效.

如果我尝试所有可能的变化,Excel可以帮助打印到默认打印机.我没有更改默认打印机的选项(安全策略限制)

有人能指出我正确拉动打印机端口的代码吗?

解决方法:

这就是我最终做的事情

using Microsoft.Win32;
...

        var devices = Registry.CurrentUser.OpenSubKey( @"Software\Microsoft\Windows NT\CurrentVersion\Devices" ); //Read-accessible even when using a locked-down account
        string printerName = "Adobe PDF";

        try
        {

            foreach ( string name in devices.GetValueNames() )
            {
                if ( Regex.IsMatch( name, printerName, RegexOptions.IgnoreCase ) )
                {
                    var value = (String)devices.GetValue( name );
                    var port = Regex.Match( value, @"(Ne\d+:)", RegexOptions.IgnoreCase ).Value;  
                    return printerName + " on " + port;
                }
            }
        }
        catch
        {
            throw;
        }

标签:c,pdf,printing,interop,excel-interop
来源: https://codeday.me/bug/20190531/1188084.html