Автоматическое сканирование в сетевую папку по нажатию кнопки «Scan»

    Стояла следующая задача:
    реализовать автоматическое сканирование при нажатии кнопки на сканере. Полученный материал должен попадать в сетевую папку и иметь уникальное имя. Сканер подключен к рабочей машине, все процедуры по сканированию не должны отвлекать человека работающего за этим компьютером под управлением Windows.

    В Linux эта задача решается парой строк кода и замечательной утилитой Sane. C Windows дела обстоят гораздо сложнее. Стандартный софт сканера UMAX Astra 4700 подобных вещей вытворять не позволял. Поиск в интернете результатов не дал, но нашлись простые утилиты, позволяющие сканировать из командной строки, например iCopy, IrfanView. К сожалению ни одна из них не могла по тихому зарегистрироваться, как обработчик нажатия кнопки сканера и так же тихо провести сканирование в нужную папку. Натолкнувшись на описание, как зарегистрировать любое приложение в качестве обработчика событий со сканера решил написать небольшую программку на JavaScript, тем более, что написанный скрипт можно скомпилировать в исполняемый файл при помощи Jscript Compiler в составе .NET Framework. В качестве консольного сканера была выбрана немного глючная iCopy, которая не воспринимает некоторые ключи из командной строки, что впрочем решается костылем — созданием двух копий программы, правкой настроек прямо в конфиге и запуском нужной копии по каждой кнопке.

    Скомпилировать скрипт проще простого, если у вас установлен .NET Framework, найдите приложение jsc.exe и выполните в командной строке:

    jsc.exe /target:winexe scan.js

    Получим скомпилированное приложение scan.exe. Ключ "-reg" зарегистрирует программу в системе, как обработчик сообщений от кнопок сканера, ключ "-unreg" вернет все обратно. После регистрации в системе, необходимо перезагрузить Windows. Программа имеет конфигурационный файл, в котором можно сопоставить сообщения получаемые от обработчика нажатия кнопки с нужным приложением. Для более простой настройки есть режим логирования, чтоб не искать идентификаторы событий по всему реестру. После нажатия кнопки на сканере выбираем наше приложение, смотрим в лог и видим вторым параметром id события нажатия кнопки, его то и прописываем в конфигурационный файл.

    Usage:
    scan.exe -reg //регистрация программы в реестре
    scan.exe -unreg //удаление информации о програме из реестра
    scan.exe param1 param2 //запуск приложения в соответствии с param2

    Конфигурационный файл (для моего сканера):
    1. [debug]
    2. debugflag=true
    3. logfile=debug.log
    4.  
    5. [flags]
    6. mail_flag=/StiEvent:{F61F8581-6105-11D6-AAF8-0050BA1ACA6F};
    7. scan_flag=/StiEvent:{F61F8582-6105-11D6-AAF8-0050BA1ACA6F};
    8. print_flag=/StiEvent:{F61F8583-6105-11D6-AAF8-0050BA1ACA6F};
    9.  
    10. [applications]
    11. mail_app=
    12. scan_app="C:\Program Files\iCopy\iCopy.exe" /f:"\\server\scanned\$date$.jpg" /r:150
    13. print_app="C:\Program Files\iCopy\iCopy.exe" /c
    Исходный код

    TODO:
    • Устранить потерю фокуса активного окна при запуске приложения.
      Решено: параметр метода Run должен быть 6
    • Избавиться от моргания консольного окна. Кто знает как, подскажите пожалуйста.
      Решено: jsc.exe /target:winexe scan.js
    • Столкнулся с проблемой, если на некоторых машинах поставить крыжик «использовать это приложение по умолчанию» после выбора приложения для обработки кнопки, повторное нажатие на эту кнопку ни к чему не приводит, приложения не запускается, приходится лезть в свойства принтера и выставлять для кнопки «выбор приложения».
      Решено: помог возврат статусов запуска служб Windows XP к стандартному. Критично чтобы сервис Windows Imaging Acquisition запускался автоматически, а не вручную.
    Скачать архив с программой
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 50

      +3
      а можно как нибудь обрабатывать кнопку сканера на МФУ HP M1522n подключенному по сети?
        0
        Надо экспериментировать, смотря как он будет представлен в системе, если в реестре он есть как Imaging device и раздел Event содержит кнопки, то можно и даже этим скриптом.
          0
          Аналогичный вопрос по Epson GT-2500.
          А где конкретно искать в реестре? И есть такое ощущение, что сканер передаёт информацию о нажатии на кнопку только по USB :(
            +1
            HKLM\System\CurrentControlSet\Control\Class\ Ищем класс «Устройства обработки изображений» / «Imaging devices», а там уже ищем свое устройство.
          0
          В стародавние времена на HP 3050 удавалось это сделать, но все равно выходит не очень надежно. Лучше всего использовать МФУ c функцией сетевого сканера или hp digital sender 9200 стоит дороговато но он того стоит.
            0
            А как именно это удавалось на hp3050? Кнопка ScanTo работает вроде как только по USB.
              +1
              Поставил старый терминал на VIA C3 под XP в качестве сервера подключил по USB, загрузка с флешки 2GB. Вообщем то было удобно там же не просто скан там ещё и можно выбирать адреса куда сканировать на самом МФУ (но больше 5-10 выбирать всетаки не удобно там однострочный дисплей был кажется). Из допила пришлось написать програмку которая следит чтобы сервис висящий в трее висел или в случае вылета перезапускался (очень нестабильный родной софт был) ну и что то там ещё с перехватом окон и простановкой галок делал потому что какието настройки все время сбивались. В 2005 году это произвело фурор и так облегчило всем что через полгода руководство дало добро на покупку HP DS 9200 который по функционалу в те годы был просто неземным девайсом.
                0
                кнопка работает и при ethernet-подключении, но крайне нестабильно.
              0
              C кнопкой не удалось, scanimage в моей сборке говорит unrecognized option '--wait-for-button'.

              Но я реализовывал сканирование для этого же МФУ со складыванием в сетевую папку вот так — habrahabr.ru/blogs/linux/82756/
              До сих пор работает =)
              0
              Избавиться от моргания консольного окна. Кто знает как, подскажите пожалуйста.
              Отсюда ничего не подойдет?
                0
                К сожалению нет, нужен способ в коде указать, чтобы исполняемый файл не создавал окон.
                  0
                  Уточните, какой именно файл не должен создавать окон?
                  Если iCopy — тогда давайте его запускать примерно так:

                  scan_app=hidcon.exe «C:\Program Files\iCopy\iCopy.exe» /f:"\\server\scanned\$date$.jpg" /r:150
                    0
                    scan.exe который получаем после компилятора из scan.js
              +2
              >В Linux эта задача решается парой строк кода и замечательной утилитой Sane.

              По ссылке реализован не совсем оптимальный вариант. Если помимо sane использовать еще scanbuttond, то можно на разные кнопки сканера повесить разные действия. Например — цветной или ч/б скан, формат файла PDF/jpeg, да хоть аварийное выключение компьютера :)
                0
                где можно почитать о ч/б сканировании? Что за аппарат? кого запускает scanbuttond, чтобы монохромно сканировать?
                  0
                  1) man scanimage на предмет строки "--mode Lineart|Gray|Color"
                  2) Epson Perfection 2400 Photo
                  3) scanbuttond запускает скрипт /etc/scanbuttond/buttonpressed.sh, передавая ему первым параметром номер нажатой кнопки, а вторым название устройства. В /etc/scanbuttond/buttonpressed.sh.exapmle находится пример скрипта. У меня он сканирует tiff размером A4 через scanimage, конвертит его в jpeg и уменьшает его размер через convert из ImageMagick и скидывает на шару в виде файла outXXXX.jpg, где XXXX — максимальный существующий на шаре номер + 1.
                +1
                Друзья закупили кучу МФУ hp M1212nf_MFP, в надежде сканировать по сети. Как оказалось утилита для сканирования будт сканировать только с того МФУ который был установлен в систему последний. В итоге пришлось слепить маленький сервер с debian и прикрутить к нему связку из hplip и самописного скрипт на php который сканит в папку доступную по http и samba.

                В техподдержке HP сказали что проблема не решаема, т.ч. друзья стали закупать какие-то kyocera которые сами умеют на сетевую шару сканировать.
                  0
                  Kyocera 1128MFP — проще вроде нет устройств 3\4в1 — безо всякого софта сканирует в сетевую папку, на почту, есть адресная книга, нормально работает доменными аккаунтами… при необходимости легко настраивается через web интерфейс.
                    0
                    да, иногда проще и намного эффективнее потратиться на хорошую железку, чем делать очередной костыль.
                      0
                      Kyocera KM-5050 отличная машинка.
                      0
                      Я делал аналогичную фигню, только вывод scanimage шел прямо по http. Пользователь как-бы «скачивал» файл по мере сканирования.
                        0
                        В случае с M1212nf_MFP scanimage не работал, пришлось делать на hp-scan
                      0
                      А XEROX под свои аппараты уже готовые решения такого рода продает, конкретно сканирование в сетевую папку с уникальным именем. Неужели подобного нет для аппаратов конкурентов ксерокса? Или ищем дешевый путь?
                        0
                        Есть, тот же Gestetner. Например, SP3400SF
                        –1
                        Вот чего только не придумают, чтобы не покупать HP Digital Sender…
                          +1
                          Ну не все готовы тратить 4-5 тысяч долларов на сканер.
                          Есть кстати скансервер Axis 7000 и стоит в 4 раза дешевле.
                            +1
                            Ну, на самом деле, 4-5 килобаксов для средней конторы — копейки. Кресло гендира, как правило, дороже :)
                            Да и как правильно заметили — есть и более дешевые решения. А вот городить огород с линуксами — это уже «экономия на туалетной бумаге», ИМХО.
                              +1
                              Ну не для всех копейки. У моих друзей в конторе порядка 10-ти мфу-шек, которые должны сканить по сети. Взяли они hp1212nf плюс я им слепил вебморду которая крутится на виртуалке. в итоге люди сэкономили эти самые 40 000 долларов без особых трудозатрат.

                              Мне кажется ненадо быть таким упертым моноплатформщиком, если задачу проще решить на другой платформе то стоит обратить на нее внимание.
                          0
                          не могу побороть iCopy — отказывается разрешение выставлять командной строкой. Полностью игнорирует все кроме первого параметра. Берет значения только из своего конфига iCopy.settings.

                          может кто сталкивался?
                            0
                            а просто из командной строки воспринимает?
                              0
                              нет. даже и не знаю на что думать.
                              0
                              У меня как оказалось iCopy тоже не воспринимает некоторые параметры командной строки. Решил ситуацию созданием 2х папок с iCopy (iCopy_low и iCopy_high) в которых уже в файлах конфигурации поменял настройки на нужные мне. Соответственно запускаю по разным кнопкам iCopy из разных папок.
                                0
                                Позвольте поинтересоваться, как вы настроили сканирование всей площади? У меня сканируется небольшой прямоугольник с угла. Сканер Canon MF4018. Через iCopy.settings я смог настроить только глубину цвета и разрешение.
                                  0
                                  Отказался от него вообще в пользу IrfanView.
                              0
                              и подскажите, как вы побороли потерю фокуса текущим окном, при старте iCopy по нажатию кнопки на сканере?
                                0
                                Можно изменить параметр запуска в wsh.Run на более подходящий. Вроде выставлял такой чтобы фокус не терялся.
                                0
                                Фокус отбирает точно wsh.Run, думаю как решить эту проблему.
                                  0
                                  вот решение:

                                  wsh.Run(get_ini_value("config.ini", "scan_app"),6);

                                  сейчас поправлю в исходниках
                                  0
                                  На прошлой работе была подобная проблема — куча сканеров и хочется забиндить кнопку на сканирование в шару.
                                  Решил так костялями:
                                  Поставил кучу виртуалок на сервере. Каждая виртуалка на винде с софтом вендора.
                                  Далее при помощи крякнутой usb2ethernet расшарил usb порты на рабочих компьютерах пользователей и приконнектил на виртуалках. Далее забиндил скан на кнопку на виртуалке, прописал путь сохранения на шару и все.

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

                                    0
                                    Системное администрирование… лол :)
                                      +1
                                      Хм, сканирую в сентябре, а в имя файла ставится 08 месяц. В конфиге прописано имя файла с переменной $date$.
                                        0
                                        Наблюдается такая же проблема, решение пока ищу, но не усердно, потому что жить не мешает.
                                        0
                                          0
                                          У меня прилага делает это сама с помощью ключей reg, unreg, достаточно было взглянуть на исходники

                                        Only users with full accounts can post comments. Log in, please.