[英]Setting correct printer in MS Word through automation
我有以下自动化代码:
lPrintSetup := fWordObject.Application.Dialogs.Item(wdDialogFilePrintSetup);
lPrintSetup.Printer := 'MyPrinter';
lPrintSetup.DoNotSetAsSysDefault := True;
lPrintSetup.Execute;
lPrintSetup := Null;
Printer
属性给我一些问题,有时由于错误的打印机名称而导致EOleException(0x800A1460(错误代码5216):存在打印机错误)导致Execute
崩溃。
我通过EnumPrinters API调用获得的_PRINTER_INFO_2
记录中具有所有打印机的打印机信息。 给定_PRINTER_INFO_2
记录中的信息,如何为Word组成正确的_PRINTER_INFO_2
? 它至少可与Windows 2000,Word 2000和Citrix一起使用。
一些背景信息:
我们的应用程序首先用一个自建的打印机名填充Printername。 这给Citrix客户端带来了问题,因此对于Citrix客户端,我们采用_PRINTER_INFO_2.pPortName
并删除了Client:#:部分。 这适用于大多数客户,但有时仍会显示打印机错误。
到目前为止,我已经尝试过(在Windows XP SP3,Word 2007上):
_PRINTER_INFO_2.pPrinterName
。 问题是,当您有意修改打印机名称时(将“ PDFCreator”重命名为“ MYPC上的HP DESKJET 520”),它将在后者上崩溃(在Word中选择此打印机时有效)。 lPrintSetup.Printer := PRINTER_INFO_2.pPrinterName + ' on ' + PRINTER_INFO_2.pPortname
: lPrintSetup.Printer := PRINTER_INFO_2.pPrinterName + ' on ' + PRINTER_INFO_2.pPortname
。 似乎总是可以工作! 但是谷歌搜索显示“ on”已本地化,因此我不确定这是否适用于非英语的Windows版本。 编辑:并不总是工作:( 我在网上找到的另一个解决方案:
从Word读取打印机名称时,其格式为“ Ne01:上的打印机名称”,其中Ne01的范围从Ne00:到Ne99:。 该解决方案建议采用打印机名称,并尝试在从Ne00:到Ne99:循环时进行设置。 当.Execute不崩溃时,您已经找到了正确的选择。 我不太喜欢这种“跟踪与错误”方法。
我不确定您是否尝试过此方法,或者它是否有任何用途,但是您可以从Printer.Printers对象获取系统上所有打印机的列表,确保将Printers添加到设备的Uses子句中。
然后,这应该列出系统上的实际名称,您也许可以使用此信息来执行所需的操作。
如前所述,您可以使用Printer.Printers获取一个打印机名称列表,该列表是一个TStringList,其中每个项目均带有打印机名称。
此代码提供默认的打印机名称
Printer.Printers[Printer.PrinterIndex]
几分钟前,我了解到,word2k不仅希望使用打印机名称,例如“ Ne01上的打印机名称:”,还希望端口(NEnn)大写“ NE01上的打印机名称:”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.