通过自动化在MS Word中设置正确的打印机

时间:2009-08-05 10:38:30

标签: delphi printing automation ms-word

我有以下自动化代码:

lPrintSetup := fWordObject.Application.Dialogs.Item(wdDialogFilePrintSetup);
lPrintSetup.Printer := 'MyPrinter';
lPrintSetup.DoNotSetAsSysDefault := True;
lPrintSetup.Execute;
lPrintSetup := Null;

Printer属性给了我一些问题,有时候Execute崩溃并出现EOleException(0x800A1460(错误代码5216):由于错误的printername而出现打印机错误。

我有一份_PRINTER_INFO_2记录中所有打印机的打印机信息,这是我通过EnumPrinters API调用获得的。如果_PRINTER_INFO_2记录中的信息,我如何为Word撰写正确的printername?它至少适用于Windows 2000,Word 2000和Citrix。

一些背景信息:

我们的应用程序首先使用自构造的printername填充Printername。这给Citrix客户端带来了问题,因此对于Citrix客户端,我们使用了_PRINTER_INFO_2.pPortName并删除了客户端:#:part。 这适用于我们的大多数客户,但有时仍会出现打印机错误。

到目前为止我尝试过的(在Windows XP SP3,Word 2007上):

  • 只需_PRINTER_INFO_2.pPrinterName。问题是,当您故意修改printernames时(将'PDFCreator'重命名为'MY DES上的HP DESKJET 520')它会在后者崩溃(在Word中选择此打印机时)。
  • 像这样编写一个这样的公主:lPrintSetup.Printer := PRINTER_INFO_2.pPrinterName + ' on ' + PRINTER_INFO_2.pPortname。似乎总是工作!但谷歌搜索显示“开启”是本地化的,所以我不确定这是否适用于非英语Windows版本。 编辑:始终不起作用:(

我在网上找到的另一种解决方案:

从Word中读取printername时,它的形式为“Ne01上的Printername:”,其中Ne01的范围是Ne00:到Ne99:。该解决方案建议使用printername并尝试在从Ne00:到Ne99循环时设置它:当.Execute没有崩溃时,你就得到了正确的。我不太喜欢这种“追踪和错误”的方法。

4 个答案:

答案 0 :(得分:0)

我不确定您是否尝试过这个,或者它是否有用,但您可以从Printer.Printers对象获取系统中所有打印机的列表,确保将Printers添加到Uses子句中你单位的。

然后,应该列出系统上的实际名称,您可以使用此信息来执行您想要的操作。

答案 1 :(得分:0)

如上所述,您可以使用Printer.Printers获取打印机名称列表,这是一个TStringList,每个项目都有打印机的名称。

此代码提供默认的打印机名称

Printer.Printers[Printer.PrinterIndex]

答案 2 :(得分:0)

几分钟前,我了解到,word2k不仅希望Printernames像“Ne01上的Printername:”它只想要端口(NEnn)大写“NE01上的Printername:”

答案 3 :(得分:0)

我明白了。 Word具有“NE01上的Printername:”形式的printername。 Ne01:是devices section of win.ini中指定的printerport。所以现在我将printername编写为_PRINTER_INFO_2.pPrinterName + ' on ' + <PrinterPort from win.ini>并为FilePrintSetup对话框的printer属性设置该名称。

这比使用我的问题中提到的跟踪错误方法要好得多。