Печать MS Word документа из командной строки

Обычно для пользователя при формировании различного рода документов в формате MS Word формировались файлы и просто открывались.

Для этого вызывалась процедура host и передавалась строчка запуска.

Например, фрагмент кода

cmd  := 'cmd /c start winword.exe "'||pi_fname||'"';
host(cmd);

Однако возникла задачка массовой печати. Т.е. есть подготовленные файлы, и их надо, например, при нажатии на кнопку распечатать на принтере. Естественно, пользователь не должен открывать, печатать, закрывать каждый документ.

В итоге вызов видоизменился до следующего


cmd  := 'cmd /c start /wait winword.exe "'||pi_fname||'" /q /n /mFilePrintDefault /mFileSave /mFileExit';
host(cmd);

Что добавилось

  • start /wait – дает нам возможность запустить приложение и ждать его завершения. В нашем случае мы должны в определенном порядке получать на принтере документы, т.е. они должны и попадать в очередь последовательно, а без ожидания маленькие документы могут встать в очередь быстрее
  • далее пойдут параметры уже непосредственно для MS Word
  • /q – не показывать окно заставки (splash screen)
  • /n – не создавать новый документ (new default document)
  • /m – выполнение макроса (runs a macro [/mmacroname])
  • /mFilePrintDefault – печать на принтере по умолчанию
  • /mFileSave – сохранение документа
  • /mFileExit – закрытие документа

Сначала все работало без параметра сохранения документа, но почему-то некоторые документы при открытии получали статус измененных и, соответственно, при закрытии выводился запрос на сохранение. Его нам не надо получать, т.к. процесс печати приостанавливается; соответственно, добавляем сохранение.

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

Если же использовать такой вызов не в рамках данный задачи, а например, просто использовать его для печати документов из командной строки, то, лучше выкинуть параметр /mFileSave из строки вызова.

 

Oracle Developer 6i: Forms – Questions

Периодически получаются переходы на мой сайт по запросам по Oracle Forms.

Если есть желание – задавайте вопросы 🙂

Могу попробовать ответить практически на все вопросы, но только не FFI, т.к. в проектах избегаю его использования. Да и в трех-уровневой модели он будет проблематичен 🙂

Проблема с кодовыми страницами

Навеяло 😉 перестановкой машины у коллеги

Имеем Windows XP (возможны варианты)

После установки машины с чистого листа поехали шрифты в Oracle Forms, выражается в кракозябрах при выводе сообщений (Alerts) на русском языке.

Раньше лечили через Font Substitution (если правильно помню 🙂 ключ в реестре)

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes

Но как уже упоминал, было это давно. Потом был найден на просторах интернета 🙂 другой способ, т.к. проблемы были не только с Oracle Forms.

Это решение – меняем значения для кодовых страниц

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
  • HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Nls\CodePage
  • HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\Nls\CodePage

Изменяемые строковые параметры

Параметр Старое значение Новое значение
1250 c_1250.nls c_1251.nls
1252 c_1252.nls c_1251.nls

После чего перегружаем машину и наслаждаемся 😛 отсутствием проблем с кодировкой.

Реестр под 64-разрядной Windows

Реестр 64-разрядных версий Windows подразделяется на 32- и 64-разрядные разделы.

Большинство 32-разрядных разделов имеют те же имена, что и их аналоги в 64-разрядном разделе, и наоборот.

В 32-разрядной Windows приложения обращаются к ключам реестра

HKEY_LOCAL_MACHINE\SOFTWARE\<company>\<product>

В 64-разрядной Windows когда 32-разрядные приложения обращаются к реестру

HKEY_LOCAL_MACHINE\SOFTWARE\<company>\<product>

они на самом деле обращаются к ветке

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\<company>\<product>

По умолчанию в 64-разрядных версиях Windows используется отображение (“registry reflector”) 32-разрядных разделов в узле WOW6432Node. Процесс отображения прозрачен для 32-разрядных приложений, т.е. они могут получать доступ к разделам реестра так, как будто бы они работали в 32-битном окружении несмотря на то, что данные хранятся в другом месте.

Наблюдалась особенность отражения в 64-разрядный ключ: если очищалось значение ключа в 32-разрядной ветке, по какой-то причине не происходил автоматический сброс этого значения в 64-разрядной ветке.

Создание документов с помощью шаблонов (.dot) в MS Office 2007 и MS Office 2010

В самых первых проектах формирование MS Word документов было организовано с использованием OLE-технологии (использовался Office XP).

Это удобно: создаем шаблон (.dot), а дальше программно создаем документ на основании этого шаблона и подставляем в него необходимые данные.

Соответственно, шаблоны хранятся на сети, в определенной папке.

При переходе на MS Office 2007 возникла проблема: не формировался документ на основании шаблона. Было выяснено, что виной всему было наличие в вызове полного пути к шаблону.

Решилась данная проблема настройкой самого MS Word, для этого в настройках MS Word переопределяем путь к шаблонам (где на сети лежат .dot-файлы)

  • Открываем MS Word
  • Создаем пустой документ
  • Нажимаем кнопку “Office”
  • Выбираем «Параметры Word»
  • Выбираем «Дополнительно»
  • Нажимаем кнопку «Расположение файлов…»
  • Изменяем путь к общим шаблонам
  • Успешно выходим
  • Если будет выводиться ошибка о невозможности прочитать/записать шаблон Normal.dotm, то надо указать/изменить на локальную папку путь для пользовательских шаблонов (C:\Documents and Settings\…\My Documents)
  • Возможно, надо будет запустить MS Word и выйти из него, при этом шаблон Normal.dotm автоматически создастся в текущей папке пользовательских шаблонов.

После чего при вызове убираем путь к шаблону.

В MS Office 2010:

  • Открываем MS Word
  • Создаем пустой документ
  • Переходим на закладку «Файл»
  • Выбираем «Параметры»
  • Выбираем «Дополнительно»
  • далее как описано выше

Reports 6i под Windows 7

Последняя версия клиент-серверных приложений Oracle Developer 6i вполне нормально живет под Windows 7.

Единственная проблема возникла под 64-разрядной версией Windows 7, при которой из форм невозможно было вызвать отчет.

Методика решения ее очень проста, надо заменить всего две dll, а именно: NN60.dll и NNB60.dll, которые можно взять из Oracle Developer 6i Patch 3, или задать в критериях поиска наименования этих двух файлов.