[Из песочницы] Сканирование на терминальном сервере бесплатно

На работе поставили задачу перевести нескольких сотрудников на терминальный сервер, чтобы все-все делалось на нем, в т. ч. сканирование с локального сканера. Пользователь работает в Windows. Можно было бы пробросить USB, но драйверов для Виндоус Сервера у этой модели сканера не было.

Поискал в сети по запросу Scan over RDP, нашел программы типа Scan Redirector RDP Edition, TSX Scan и т. п., за которые хотят в районе сотни-другой баксов за 1 лицензию, вроде бы даже видел за 800 баксов.

Я не люблю нелицензионный софт, поэтому решил реализовать сам:

390b815322ed468089ce2c503998ffe1.png

Здесь вы видите главную страницу управления удаленным сканером. Плюс моего решения в том, что на терминальном сервере (или любом другом компьютере, с которого захотите сканировать) решительно ничего устанавливать не нужно, нужен только браузер.

Если нажать New JPG scan, увидим следующее:

image

А потом:

image

Картинку можно сохранить по правой кнопке. Нажмем New PDF scan:

image

Нажмем пару раз Scan PDF next page:

e5305b06e37344efa83b301f7d7d0ee1.png

По клику по картинке видим ее на весь экран:

cc4e19acf9ba400a86d3fd456d8c12dc.png

Нажмем Delete page 2:

d8aaa41af3d24879a4cc9f0187071b6e.png

Нажмем Make PDF:

d5a26a8ffce44a60a04ab58f00c71f8e.png

Нажмем Browse images:

1656bbd32963426cb03a1bbd489c5cb7.png

Тут можно просмотреть все, что было отсканированно ранее. Как-то так оно работает. Поддерживается любой TWAIN-совместимый сканер. Протестировано в Хроме.

Опыта разработки у меня мало, поэтому код наверняка написан в худших традициях всего. Пинайте в комментариях.

Безопасность минимальная: чтобы сканером не воспользовался посторонний, файл называется scan57578.php (имя можно изменить на другое). А в index.php напишите «Access denied».

Что нужно установить на компьютер со сканером?

Как вы уже наверно догадались, нам понадобится веб-сервер. Я использовал Denwer, который в данном случае из пушки по воробьям, но можно использовать любой другой с поддержкой PHP. При этом нужно будет соответствующим образом поправить код, так как в нем используются пути Денвера (диск Z: и т. п.).

Что нужно еще: программа CmdTwain, которая собственно сканирует из командной строки, и консольная же утилита jpeg2pfg. Устанавливаем CmdTwain, запускаем из Пуска CmdTwain\Select Source и выбираем наш сканер. Устанавливаем Денвер, соглашаемся со всем по умолчанию.

Затем на диске Z нужно найти php.ini и задать параметр max_execution_time = 130. Значение выбираем, замерив, сколько длится одно сканирование на вашем сканере. Затем Restart Denwer. Берем с рабочего стола ярлык Start Denwer и кидаем его в автозагрузку. Задаем компьютеру статический IP.

Создаем в папке Z:\home папку с названием равным IP компьютера. В моем случае папка называется 10.74.0.98. В ней создаем папку www, а в ней папку, в которой будут лежать сканы. В моем случае она называется scans. Полный путь выглядит так: Z:\home\10.74.0.98\www\scans.

Веб-сервер настроен. Далее создайте папку Z:\jpeg2pdf. В нее скопируйте jpeg2pdf.exe, который вы скачали по ссылке, которую я давал выше. А также создайте в ней файл makepdf.bat со следующим содержимым:

@echo off
z:
cd z:\home\10.74.0.98\www\scans\%1
z:\jpeg2pdf\jpeg2pdf.exe -z none *.jpg -o %1.pdf
move *.pdf ..

Исправьте IP на нужный. Этот файл создает PDF из набора JPG. В качестве параметра ему передается имя папки с этим набором.

В папку Z:\home\10.74.0.98\www поместите index57578.php (или как вы хотите его назвать) со следующим содержимым:








      New PDF scan                 

      New JPG scan

      Browse images


Picture'); } if($_GET['scantype']=='pdf') { if($_GET['delete']!='') { $i = -2; $files = scandir($folder.'/'.$_GET['time']); foreach($files as $filename) { $i++; if ($filename[0] == '.') continue; if ($_GET['delete'] == $i) system('del '.'Z:\\home\\'.$ip.'\\www\\'.$folder.'\\'.$_GET['time'].'\\'.$filename); } } else { if (!is_dir($folder.'/'.$_GET['time'])) { system('md Z:\\home\\'.$ip.'\\www\\'.$folder.'\\'.$_GET['time']); $filename = 'Z:\\home\\'.$ip.'\\www\\'.$folder.'\\'.$_GET['time'].'\\0001.jpg'; $cmd = '"C:\Program Files\GssEziSoft\CmdTwain\CmdTwain.exe" "'.$filename.'"'; system($cmd); } else { $n = 1; $files = scandir($folder.'/'.$_GET['time']); foreach($files as $filename) { if ($filename[0] == '.') continue; $t = substr($filename, 0, -4)+0; if ($t > $n) $n = $t; } $n++; $fn = str_pad($n, 4, "0", STR_PAD_LEFT).'.jpg'; $filename = 'Z:\\home\\'.$ip.'\\www\\'.$folder.'\\'.$_GET['time'].'\\'.$fn; $cmd = '"C:\Program Files\GssEziSoft\CmdTwain\CmdTwain.exe" "'.$filename.'"'; system($cmd); } } $i = -2; $files = scandir($folder.'/'.$_GET['time']); foreach($files as $filename) { $i++; if ($filename[0] == '.') continue; echo "
Picture
Delete page ".$i."

"; } if ($i == 0) echo ''; } if($_GET['scantype']=='makepdf') { $cmd = $jpeg2pdf.' '.$_GET['time']; echo ''; system($cmd); echo "

Download PDF

"; } ?>

Вверху задаются 4 параметра: IP компьютера со сканером, имя файла php, имя папки со сканами, путь к makepdf.bat.

Минусы: нельзя задать качество сканирования — сканирует всегда в 200 DPI и в цвете. Может как-то можно поменять параметры (например в реестре), но для офисных задач они подходят.

И да, я знаю, что функцию gettime () можно написать короче и красивее. Предлагайте самые красивые варианты в комментариях.

Спасибо за внимание!

Комментарии (1)

  • 13 ноября 2016 в 18:49

    0

    Спасибо за CmdTwain, потестим
    Также рекомендую: http://unit6.ru/twain-web
    Установил в офисе — полёт нормальный 3 года. Единственный недостаток — мерзкий .Net — служба периодически зависает, решил перезапуском. Пробовал обновить версию — не увидела сканера, откатился. Надо будет не полениться и написать разработчикам.

    Сам же несколько лет назад писал на делфи консольную утилиту: сканирует в несколько форматов, разрешений и цветностей, и главное — заданную область — скорость сканирования маленьких бланков выросла в разы!

    А вообще отдельно разработчикам стандарта Twain и некоторым производителям сканеров хочется послать лучи поноса:
    1. Некоторые сканеры сканируют всегда всё, игнорируя параметры.
    2. Некоторые драйверы отображают сканер в системе при его физическом отсутствии.
    3. Два сканера одной модели в системе? Не, не слышали…

© Habrahabr.ru