Форум » Для флейма » Двусторонняя печать (HP M225) » Ответить

Двусторонняя печать (HP M225)

Sergy: Всем привет. Недавно к нам в систему попал новый принер - HP M225 с возможностью двусторонней печати. И имеет, он такую хитрую настройку: Тут получается, что для стандартного документа в Portrait mode нужно убирать галку "переплет сверху", а для накладной/счет-фактуры (Landscape mode) нужно эту галку ставить. Иначе вторая сторона в обоих случаях печатается вверх тормашками. Юзеры бесятся, жалутся и говорят, что "их ничего не волнует и они хотят "просто нажать кнопку и получить двусторонний результат". На всех остальных принтерах с двусторонней печатью просто есть галка "двусторонняя печать" и все работает "как нужно". То есть нет выбора - нет проблем... Кто-нибудь сталкивался? Как это победить?

Ответов - 10

SergKis: Sergy пишет:Как это победить? Заполнить самому, т.е. я бы сделал монитор на AutoIt3, запускал перед печатью, ловил окно (два) и ставил\снимал нужные галки и нажимал применить и OK и завершался. Все можно проделать и в hb, наверное, но мне лично проще так. Для doPdf7 была похожая примочка (ответы с галочкой) на 2-х окнах

Sergy: Мониторить окна - это значит они должны сначала появиться на экране. Это 5-6 лишних кликов для юзера. Если печатать из моего приложения или экселя, ворда на принтер "по умолчанию" - никаких окон не появляется. Нажатие на кнопку "печать" и всё... Или я неправильно понял?

SergKis: Sergy пишет:Это 5-6 лишних кликов для юзера Ничего кликать не надо. Запускаете монитор (Run без ожидания), свою печать (появление окон ожидает, ловит монитор), который и делает заполнения, клики и завершается после этого. У пользователя что то моргнуло по окнам и все - он ничего не делал. Вот пример для doPDF: [pre2] #NoTrayIcon Opt("TrayMenuMode" , 1) $proc = @ScriptName ; process name $capt = $proc & " started" If WinExists($capt) Then ; уже запущен $pidp = ProcessExists($proc) If $pidp Then WinClose($capt) Exit EndIf EndIf AutoItWinSetTitle($capt) ; set caption $pcap = "doPDF - Save PDF file" ; caption doPdf7 (print window) $idok = 1437 ; ID control button OK. вариант 1. $okid = "[CLASS:Button;INSTANCE:9]" ; ID control button OK. вариант 2. $scap = "Save" ; caption window Save $id_s = 1629 ; ID control button Yes. вариант 1. $s_id = "[CLASS:Button;INSTANCE:2]" ; ID control button Yes. вариант 2. $step = 1000 ; OnTimer millisec. $exit_item = TrayCreateItem("Exit",-1, 0, -1) TraySetState() TraySetToolTip($capt) AdlibRegister( "MonitorStop" , $step ) ; OnTimer set While 1 $msg = TrayGetMsg() Select Case $msg = 0 ContinueLoop Case $msg = $exit_item ExitLoop EndSelect WEnd Exit Func MonitorStop() If WinExists($pcap, "") Then AdlibUnRegister() ; OnTimer stop ControlClick($pcap, "", $idok) ; или ControlClick($capt, "", $okid) IF WinWaitActive($scap, "", $step) Then ControlClick( $scap, "", $id_s) ; Yes window Save EndIf AdlibRegister( "MonitorStop" , $step ) ; OnTimer set EndIf EndFunc [/pre2]


nick_mi: Вот так еще можно попробовать. У меня, правда из односторонней печати на двустороннюю переключается, а потом дальнейшие переключения не работает, возможно, потому-что сервер печати а не локальный принтер [pre2] #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" #include "hbvm.h" #include "hbwinuni.h" #include "hbdate.h" /**************************************************************** * ISPRNDUPLEX () * * Возврат: * * 0 - нет на принтере дуплекса (двухсторонняя печать) * * 1 - на принтере есть дуплекс * * * ****************************************************************/ HB_FUNC (ISPRNDUPLEX) { hb_retni( DeviceCapabilities (hb_parc(1 ), NULL, DC_DUPLEX, NULL, NULL ) ); } /*********************************************************** * SETDUPLEXMODE (par1, par2) * * par1 - имя принтера * * par2 - режим печати: * * 1 - обычная печать * * 2 - двусторонняя, листать влево * * 3 - двустороння, листать вверх * * * * Возврат * * RC > 0 - успешная установка * * RC < 0 - ошибки * ***********************************************************/ HB_FUNC (SETDUPLEXMODE) { HANDLE hPrinter; LPPRINTER_INFO_2 pPRINTER_INFO_2; DWORD dwNeeded; DWORD geter; dwNeeded = 0; /* Start by opening the printer */ if (!OpenPrinter(hb_parc(1), &hPrinter, NULL)) hb_retni (-1); /* * Step 1: * Allocate a buffer of the correct size. */ if (!GetPrinter(hPrinter,2,NULL,0,&dwNeeded)) hb_retni (-2); pPRINTER_INFO_2 = (LPPRINTER_INFO_2)malloc(dwNeeded); /* * Step 2: * Get the default DevMode for the printer and * modify it for your needs. */ if (!GetPrinter(hPrinter,2,pPRINTER_INFO_2,dwNeeded, &dwNeeded) ) hb_retni (-3); pPRINTER_INFO_2->pDevMode->dmDuplex = (short) hb_parni (2) ; /* DUPlEX MODE */ /* * Step 3: * Merge the new settings with the old. * This gives the driver an opportunity to update any private * portions of the DevMode structure. */ /* было 2 */ if (!SetPrinter(hPrinter,2,pPRINTER_INFO_2,PRINTER_CONTROL_SET_STATUS )) /* было 2 */ hb_retni (-4); geter = GetLastError(); if (!ClosePrinter(hPrinter)) hb_retni (-5); free(pPRINTER_INFO_2); hb_retni (geter); } /*********************************************************** * GETDUPLEXMODE (par1) * * par1 - имя принтера * * Возврат * * режим дуплекса * ***********************************************************/ HB_FUNC (GETDUPLEXMODE) { HANDLE hPrinter; LPPRINTER_INFO_2 pPRINTER_INFO_2; DWORD dwNeeded; short geter; dwNeeded = 0; /* Start by opening the printer */ if (!OpenPrinter(hb_parc(1), &hPrinter, NULL)) hb_retni (-1); /* * Step 1: * Allocate a buffer of the correct size. */ if (!GetPrinter(hPrinter,2,NULL,0,&dwNeeded)) hb_retni (-2); pPRINTER_INFO_2 = (LPPRINTER_INFO_2)malloc(dwNeeded); /* * Step 2: * Get the default DevMode for the printer and * modify it for your needs. */ if (!GetPrinter(hPrinter,2,pPRINTER_INFO_2,dwNeeded, &dwNeeded) ) hb_retni (-3); if (!ClosePrinter(hPrinter)) hb_retni (-5); geter = pPRINTER_INFO_2->pDevMode->dmDuplex ; free(pPRINTER_INFO_2); hb_retni (geter); } #pragma ENDDUMP [/pre2]

Dima: Может SDK какой есть к этому девайсу......

Sergy: SergKis пишет: Ничего кликать не надо. Запускаете монитор (Run без ожидания), свою печать (появление окон ожидает, ловит монитор), который и делает заполнения, клики и завершается после этого. У пользователя что то моргнуло по окнам и все - он ничего не делал. Вот пример для doPDF: Почитал про эту систему. Прикольная автоматизация. Только не могу понять - откуда она узнает, какой именно документ (Portrait/Landscape) сейчас будет напечатан? Вариантов минимум три: 1) Word 2) Excel 3) Утилита печати на GDI-принтерах, которая работает в связке с моим софтом.

Sergy: nick_mi пишет: Вот так еще можно попробовать. У меня, правда из односторонней печати на двустороннюю переключается, а потом дальнейшие переключения не работает, возможно, потому-что сервер печати а не локальный принтер А как этот сишный код связать с Excel/Word ? Ведь что ни посылай на принтер, новое приложение/новое задание полностью инициализирует порт.

SergKis: Sergy пишет:Только не могу понять - откуда она узнает На сайте http://autoit-script.ru/ есть русская справка, примеры, довольно хорошие и AutoIt v3 поставляется вместе с автономным инструментом, называемым AutoIt v3 Window Info (Program Files\AutoIt3\AU3Info.exe). AU3Info получает информацию об определённом окне, что позволяет эффективнее автоматизировать работу с этим окном. Следующая информация может быть получена: Заголовки окон Текст в окне (видимый и скрытый) Размеры окна и его позиция Содержимое строки состояния Положение курсора Цвет пикселя, находящегося под курсором Информация об элементе управления, находящемся под курсором Для использования AU3Info просто запустите его (из командной строки или меню Пуск). AU3Info имеет атрибут "поверх всех окон", что позволяет вам всегда прочитать необходимую информацию. Просто переместите курсор на интересующее окно и активируйте его - в окне AU3Info тут же появится доступная информация. С помощью AU3Info можно сильно облегчить создание скриптов автоматизации ...

nick_mi: Sergy А как этот сишный код связать с Excel/Word ? Эти установки выставляются на глобальном уровне для всех пользователей и для всех приложений. Если выводить из любого приложения не меняя никаких установок, печать будет идти двухсторонняя. Я предполагаю, конечно, что основной программой является программа на HARBOUR и в ней выставляется двухсторонняя печать. И из нее же вызываются затем модули печати Excel/Word/OpenOffice. Если нет, необходимо этот код перевести на VBA и эти установки можно привязать уже к конкретному документу, но это уже будут другие функции из API.

nick_mi: В приведеном выше коде необходимо заменить строку if (!SetPrinter(hPrinter,2,pPRINTER_INFO_2,PRINTER_CONTROL_SET_STATUS )) /* было 2 */ на if (!SetPrinter(hPrinter,2,pPRINTER_INFO_2,NULL )) Тогда производится устойчивое переключение между всеми режимами. Алгоритм работы следующий: Перед вызовом Excel/Word/OpenOffice установить необходимый режим, после возврата из приложений вернуть исходные настройки. Пользователю вообще не надо никаких телодвижений.



полная версия страницы