Подавить диалоговое окно печати при печати в Microsoft Document Image Writer из Oracle BPM 10g

У нас есть действие Oracle BPM 10g, которое:

  1. Читает защищенный шаблон документа Word с заполнением формы.
  2. Объединяет данные в поля.
  3. Сохраняет объединенную/заполненную копию в файловую систему.
  4. Распечатывает документ на выбранном заранее заданном принтере ИЛИ на принтере по умолчанию.

Все это прекрасно работает при печати на «настоящий» принтер. Однако теперь необходимо вывести документ Word в TIFF. Попытка использовать «Microsoft Document Image Writer» в качестве одного из вариантов выбора принтера не работает должным образом. Обычно при прямой печати в Microsoft Document Image Writer из Word (или любого другого приложения) вам будет предложено указать место для сохранения результирующего файла. Этот запрос не появляется при попытке печати из этого конкретного действия в BPM 10g.

В идеале мы на самом деле хотели бы обойти диалоговое окно и вывести TIFF непосредственно в файловую систему. Однако я не нашел способа управлять этим программно. То есть возможность указать имя файла назначения в коде. Прямо сейчас я просто пытаюсь получить вывод в Microsoft Document Image Writer, чтобы убедиться, что он работает.

Итак, главный вопрос (вопросы) таков:

  • Можно ли это сделать? То есть, печать в Microsoft Document Image Writer
  • Если да, можно ли отключить диалоговое окно расположения файла?
  • Как?

person PattMauler    schedule 21.10.2011    source источник


Ответы (2)


Вы ничего не сказали о том, как вы автоматизируете Word. В Word VBA вы можете использовать этот образец для немедленной печати активного документа без отображения диалогового окна печати:

Public Sub PrintToXPS()
'Presume that Microsoft XPS Document Writer was already
'set up as ActivePrinter   
Dim strFilePath As String    
strFilePath = "C:\temp\helloworld.xps"    
ActiveDocument.PrintOut Background:=False, outputfilename:=strFilePath
End Sub

Вместо этого нет необходимости использовать диалоговое окно печати. Однако, если вы хотите работать через объект диалога, это можно сделать в Word, используя переменную типа Word.Dialog и предоставив необходимые параметры, например.

   Dim dlgFilePrint As Word.Dialog
Set dlgFilePrint = Application.Dialogs(wdDialogFilePrint)
dlgFilePrint.Update
dlgFilePrint.PrToFileName = strFilePath
dlgFilePrint.printtofile = True
'add other parameters as needed ...
'lock up parameter names in  Word VBA Online Help using "WdWordDialog-Enumeration"
'as key word
dlgFilePrint.Execute

То, что я сделал здесь с принтером XPS, вы, конечно, можете сделать и с любым другим принтером.

person domke consulting    schedule 22.10.2011
comment
Это выполняется в действии BPM через предоставляемую Oracle службу COMBridge; это уровень адаптера между COM-компонентами (в данном случае Word) и кодом процесса BPM. Я не знаю, могу ли я получить ссылку на объект Dialog внутри, но мне интересно, можно ли это закодировать как макрос внутри самого шаблона; Возможно, я смогу выполнить макрос из BPM. Я должен попробовать это. - person PattMauler; 25.10.2011
comment
Я ничего не знаю об этой службе COMBridge, но я предполагаю, что она позволяет вам общаться с другим приложением через COM. Обычно это означает, что вы можете вызывать его методы или задавать его свойства, как в программе сценария Windows Scripting Host или PowerShell — теперь вам нужно только указать имена методов, поскольку Intellisense обычно недоступен. Лучшей практикой является предварительное макросирование и повторное использование кода. - Добавление кода в шаблон точно будет работать (я делал это часто), но добавляет еще один уровень зависимостей, который, вероятно, трудно поддерживать в рабочей среде. - person domke consulting; 25.10.2011

Спасибо, домке консалтинг.

После дополнительных поисков я нашел это сообщение на форуме в MSDN.

Добавление этих записей реестра для подавления диалогового окна и подавления вывода после генерации, похоже, помогло:

В HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\MODI\MDI Writer

  • PrivateFlags = 17 (десятичное число)
  • OpenInMODI = 0 (десятичный)

Для наших целей это работает нормально, если мы вызываем метод printOut() со следующими соответствующими аргументами (другие аргументы здесь для краткости опущены):

document.printOut(outputFileName : "C:\\temp\\fileName.tif", printToFile : true);
person PattMauler    schedule 08.11.2011