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