Настройка правильного принтера в MS Word с помощью автоматизации - PullRequest
0 голосов
/ 05 августа 2009

У меня есть следующий код автоматизации:

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

Свойство Printer вызывает у меня некоторые проблемы, иногда Execute завершается с ошибкой EOleException (0x800A1460 (код ошибки 5216): ошибка принтера) из-за неправильного имени принтера.

У меня есть информация о принтерах всех принтеров в записи _PRINTER_INFO_2, которую я получил с помощью вызова API EnumPrinters. Как мне составить правильное имя принтера для Word, учитывая информацию в записи _PRINTER_INFO_2? Он работает как минимум с Windows 2000, Word 2000 и Citrix.

Некоторая справочная информация:

Наше приложение сначала заполнило Имя_принтера самостоятельно созданным именем_принтера. Это создавало проблемы с клиентами Citrix, поэтому для клиентов Citrix мы взяли _PRINTER_INFO_2.pPortName и удалили часть Client: #:. Это работает для большинства наших клиентов, но иногда все равно появляется ошибка принтера.

Что я уже пробовал (в Windows XP SP3, Word 2007):

  • Просто возьмите _PRINTER_INFO_2.pPrinterName. Проблема в том, что когда вы целенаправленно изменяете имена принтеров (переименовывая «PDFCreator» в «HP DESKJET 520 на MYPC»), происходит сбой последнего (при выборе этого принтера в Word работает).
  • Составление имени принтера следующим образом: lPrintSetup.Printer := PRINTER_INFO_2.pPrinterName + ' on ' + PRINTER_INFO_2.pPortname. Кажется, работает всегда! Но поиск в Google показал, что «on» локализован, поэтому я не уверен, сработает ли это для неанглийских версий Windows. Редактировать: не всегда работает: (

Еще одно решение, которое я нашел в Интернете:

При чтении имени принтера из Word он имеет вид «Имя принтера в Ne01:», где Ne01 находится в диапазоне от Ne00: до Ne99 :. В решении было предложено взять имя принтера и просто попытаться установить его во время цикла от Ne00: до Ne99 :. Когда .Execute не падает, у вас есть правильный. Мне не очень нравится этот метод «след и ошибка».

Ответы [ 4 ]

0 голосов
/ 02 сентября 2009

Я понял это. Word имеет имя_принтера в форме "Имя_принца на NE01:". Ne01: порт принтера, указанный в разделе devices файла win.ini . Поэтому теперь я задаю имя принтера как _PRINTER_INFO_2.pPrinterName + ' on ' + <PrinterPort from win.ini> и задаю это имя для свойства принтера в диалоге FilePrintSetup.

Это намного лучше, чем прибегать к методу "след и ошибка", упомянутому в моем вопросе.

0 голосов
/ 09 августа 2009

Как уже говорилось, вы можете получить список имен принтеров, используя Printer.Printers, который представляет собой TStringList с именем принтера на каждом элементе.

Этот код дает имя принтера по умолчанию

Printer.Printers[Printer.PrinterIndex]
0 голосов
/ 28 августа 2009

Несколько минут назад я узнал, что word2k не только хочет Printernames, например "Printername на Ne01:" он хочет только порт (NEnn) в верхнем регистре "Printername на NE01:"

0 голосов
/ 09 августа 2009

Я не уверен, что вы пробовали это, или если это имеет какое-либо применение, но вы можете получить список всех принтеров в системе из объекта Printer.Printers, убедитесь, что вы добавили принтеры в предложение Uses вашего подразделения.

Затем в этом списке должны быть указаны действительные имена в системе, и вы сможете использовать эту информацию, чтобы делать то, что вы хотите.

...