如何确定“Ne”是什么? Adobe PDF 打印机所在的端口?
如何检测打印机所在的端口(Ne01:、Ne02:、Ne99:等)?
BigCorp 的计算机 (WinXP) 安装了 Adobe Acrobat(版本 7.0 Pro),它提供了一个名为“Adobe PDF”的虚拟打印机。如果您在录制宏时将 Excel (2003) 工作簿打印为 pdf,则打印机的全名是“Adobe PDF on Nexx:”,其中 xx 是两位数......并且有所不同,具体取决于具体内容电脑你试试。
我使用 Excel.Interop 编写了一个 C# 控制台应用程序(我强烈建议其他人不要开始这条通往地狱的道路),该应用程序会打开一系列电子表格。它在每个文件中运行一个宏,保存、打印为 pdf,然后将 pdf 移动到共享驱动器上的报告文件夹中。
我面临的问题是,每次安装 Acrobat 似乎都会为 PDF 打印机选择一个随机端口号...而我不知道如何获取它。
到目前为止,我已尝试使用 Win32_Printer 类像这样
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() 方法,它有时会起作用,有时会失败,并显示“文档无法打印”...我不明白为什么。
如果我传递一个硬编码的“Ne0x 上的 Adobe PDF:”以及适当的 x 值,它每次都会起作用。
如果我尝试所有可能的变化,Excel 会帮助打印到默认打印机。我无法更改默认打印机(安全策略限制)
任何人都可以向我指出正确拉出打印机端口的代码吗?
How can I detect what port (Ne01:, Ne02:, Ne99: etc) the printer is on?
Computers (WinXP) here at BigCorp have Adobe Acrobat (version 7.0 Pro) installed which gives a virtual printer named "Adobe PDF". If you print an Excel (2003) workbook to pdf while recording a macro, the printer's full name is "Adobe PDF on Nexx:" where xx is a double digit.... and differs depending on what computer you try.
I have written a C# console app using the Excel.Interop (I strongly discourage anyone else from starting down this road to hell) that opens a series of spreadsheets. It runs a macro in each one, saves, prints is as a pdf, then moves the pdf to a reports folder on a shared drive.
The problem I face is that every install of Acrobat seems to pick a random port number for the PDF printer... and I can't figure out how to get it.
So far I have tried using the Win32_Printer class like so
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;
}
}
I also poked around in the System.Drawing.Printing class. The PrinterSettings.InstalledPrinters will give you the name of the printer "Adobe PDF" but I can't figure out how to get the port info.
If I pass just "Adobe PDF" to the excel interop PrintOut() method it sometimes works and sometimes fails with "Document failed to print"... I cannot figure out why.
If I pass a hardcoded "Adobe PDF on Ne0x:" with an appropriate x value it works every time.
If I try every possible variation, Excel helpfully prints to the default printer. I do not have the option of changing the default printer (security policy restriction)
Can anyone point me to code that correctly pulls the printer port?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这就是我最终所做的
Here's what I ended up doing
上次我使用 Acrobat 时,它总是将自身安装在 LPT1 上:从而避免了该问题。但我认为你必须在注册表中卑躬屈膝,
HKCU\Software\Microsoft\Windows NT\CurrentVersion\Devices
有它们。Last time I used Acrobat it always used to install itself on LPT1: thus avoiding the problem. But I think you have to grovel around in the registry,
HKCU\Software\Microsoft\Windows NT\CurrentVersion\Devices
has them.正如您发现必须查询注册表一样,这就是我使用[在 VBA 中] 的方式,这是我从 Chip Pearson 出色的 Excel 网站:
然后我使用此函数来获取 PDF 打印机名称:
然后将 Application.ActivePrinter 设置为该字符串。
如果您确实只需要端口,则可以将其从绳子末端拉下来。
As you discovered you have to query the registry, the is the way I used [in VBA], which I got from Chip Pearson's great Excel site:
I then use this function to get the PDF printer name:
You then set Application.ActivePrinter to that String.
And if you really just need the port, you can pull it off of the end of the string.