Как сделать офисный сканер сетевым

Лирическое отступление


В одной маленькой организации (~10 компьютеров) было необходимо организовать резервное копирование информации. Для этого было решено установить компьютер с большим жестким диском и Ubuntu внутри, а на компьютеры пользователей – Cobian backup.

Пытливый читатель спросит: «А зачем ты это пишешь, автор? И при чем тут какой-то сканер?»
Дело в том, что в этой организации была только одна возможность отсканировать документ – попросить это сделать счастливого обладателя МФУ Samsung SCX-4200 (название, конечно же, непринципиально, но все произошло именно из-за этого устройства).
Во время установки Ubuntu на «сервер для резервного копирования» и возникла идея: «А если подключить это МФУ сюда, оставить клавиатуру подключенной, и по нажатию определенных клавиш заставить сканер сканировать, сохраняя результат в общую папку? Ведь тогда человек не будет отвлекаться от работы для сканирования чужих документов!»
Конечно же, в первую очередь искались готовые скрипты. Наиболее интересным показался этот – www.opennet.ru/base/sys/net_scanner.txt.html
Однако при ближайшем рассмотрении он оказался не таким уж хорошим, т.к. у меня совсем нет желания перекомпилировать программу для изменения настроек сканера, учить пользователей конвертировать картинки и создавать .pdf-файлы.
Попробую написать свой, хороший…


Итак, задача поставлена


1. Подключить к Ubuntu МФУ, сделать принтер общим, настроить сканер.
2. Написать скрипт, который будет ожидать нажатия клавиши на клавиатуре
Esc – отмена незавершенного сканирования
1 – режим сканирования в цвете
2 – режим сканирования в оттенках серого
0 – сохранить отсканированный файл (jpg, если была отсканирована одна страница или pdf, если несколько)
Enter – отсканировать страницу.

Решение


Пункт 1 отпал сам собой. Подключение принтера произошло неожиданно просто и не вызвало ни одного вопроса. Достаточно было просто подключить кабель USB к компьютеру, и через несколько секунд Ubuntu сообщила, что принтер должен печатать. Отправил пробную страницу – действительно печатает!
Теперь самое интересное.
Посмотрим, какие сканеры у нас есть в системе:
scanimage -L
Если система не может найти эту команду – значит, нужно установить пакет sane-utils:
sudo apt-get install sane-utils

Программа нашла устройство с именем `xerox_mfp:libusb:001:002`
Если сканер единственный в системе, то параметр «имя устройства» можно опустить; scanimage будет сканировать единственно возможным сканером.

Попробуем отсканировать страницу:
scanimage -d “xerox_mfp:libusb:001:002” --resolution 150 --mode Color --format=tiff > test.tif
Разрешение 150 dpi выбрано из-за желания уменьшить время сканирования и размер выходного файла, но при этом оставить пользователю возможность напечатать документ с читабельным текстом. Если когда-нибудь потребуется распознавание текста или сканирование фотографий – тогда появятся дополнительные опции.
Итак, у нас есть tiff. Либо один, либо несколько (отсканировали многостраничный документ). Понятно, что пользователи в 90% случаев сканируют документы для отправки по электронной почте, а tiff – формат не компактный. Значит, нужно сконвертировать результат в .jpg или .pdf.

Ставим пакет для редактирования/конвертирования растровых изображений:
sudo apt-get install imagemagick

Сжимаем единственное изображение:
convert -quality 60% test.tif test.jpg

Или все сразу:
convert -compress jpeg -quality 60% *.tif all.pdf

Остался только один момент. Я не собираюсь оставлять подключенным к этому компьютеру монитор – значит, пользователь остается без обратной связи. Ну что ж, сделаем компьютер говорящим.
Составим список звуков, которые должны воспроизводиться в ответ на нажатие той или иной клавиши на клавиатуре, берем в руки микрофон и записываем наши мини-фразы. Они максимально короткие по времени, ведь цель всего действа – не прослушивание mp3, а сканирование.
1. Жду команду (waitcommand.mp3)
2. Цветное сканирование (color.mp3)
3. Черно-белое сканирование (bw.mp3)
4. Сканирую страницу (scanpage.mp3)
5. Сохраняю результат (saveresult.mp3)

Ах да, ведь у нас «чистая» система, которая не умеет воспроизводить mp3 из консоли…
Исправляем ситуацию:
sudo apt-get install mpg321
Наслаждаемся:
mpg123 -q waitcommand.mp3

Теперь, кажется, все готово


Пишем скрипт /mnt/2tb/scan.sh

#!/bin/bash

# ==================================================
# Настройки

scannerdevice="xerox_mfp:libusb:001:002" #scanimage -L
workdir="/tmp/scanworkdir"
destdir="/mnt/2tb/Share/1Scanner"
dpi="150"
jpegquality="60%"

# ==================================================
# Собственно скрипт

sleep 10s

mkdir -p $workdir
rm $workdir/*.* 2>/dev/null
numpages=0
color="Gray"
mpg123 -q waitcommand.mp3

while true
do
#Нажмите клавишу
read -sn 1 Keypress

case "$Keypress" in
$'\e')
#Жду команду
rm $workdir/*.* 2>/dev/null
numpages=0
color="Gray"
mpg123 -q waitcommand.mp3
;;

$'1')
#Цвет
color="Color"
mpg123 -q color.mp3
;;

$'2')
#Ч/б
color="Gray"
mpg123 -q bw.mp3
;;

$'0')
#Сканирование завершено
mpg123 -q saveresult.mp3
filename=`date +%Y%m%d-%H%M%S`
if [ $numpages = 1 ]; then
convert -quality $jpegquality $workdir/1.tif $destdir/$filename.jpg
fi
if [ $numpages \> 1 ]; then
convert -compress jpeg -quality $jpegquality $workdir/*.tif $destdir/$filename.pdf
fi
rm $workdir/*.* 2>/dev/null
numpages=0
color="Gray"
mpg123 -q waitcommand.mp3
;;

$'')
#Новая страница
mpg123 -q scanpage.mp3
let "numpages=numpages+1"
scanimage -d $scannerdevice --resolution $dpi --mode $color --format=tiff >$workdir/$numpages.tif
mpg123 -q waitcommand.mp3
;;
esac

done


Говорим
chmod +x /mnt/2tb/scan.sh

Запускаем


Да, все работает как ожидалось. Теперь идем в меню Ubuntu Система -> Параметры -> Запускаемые приложения, Добавить, Обзор, выбираем файл со скриптом. Перезагружаем компьютер, и… сканер начинает непрерывно что-то сканировать, звуки не воспроизводятся.
Ладно, нажимаю Ctrl+C, читаю еще раз то что написал…
Со звуками все тривиально – их нет в той папке, откуда вызывается скрипт. Непрерывное сканирование происходит, видимо, из-за $'') внутри case’а.

Я не стал с этим детально разбираться, а просто изменил команду автозапуска на
/usr/bin/gnome-terminal -e /mnt/2tb/scan.sh --working-directory /mnt/2tb
Еще раз перезагружаю компьютер – все работает, пользователи довольны.
Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 39

    +2
    1) снесли бы gdm, получили бы голую консоль
    2) поставили бы в качестве шелла для юзера этот скрипт в /etc/passwd.

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

        -n -l <скрипт> вас спасут.
      –14
      на винде допустим cannon это без таких танцев с бубном умеет делать. на самом мфу кнопку жмешь — он и сканирует.
        +7
        и чо?
          +5
          Бубен тут ИМХО не нужен…

          А вот винду придется купить. «Canon с кнопкой» — тоже.
          И пользователей делать pdf учить придется (если вдруг книжку или что-то прошитое сканировать нужно).
            +11
            А у Бугатти Вейрон дивгатель мощностью в 1000 лошадинных сил, но пост ведь не про это, правда?
              +4
              «div»гатель. Простите, не смог удержаться:)
                0
                Мнда, точно, оговорка по Фрейду %)
              +2
              Путём нехитрый танцев кнопку можно и под Linux заставить работать. Она там, как обычное HID-устройство (а'ля джойстик или мышс с десятком кнопок). Соответственно можно повесить демона и обработчик.
                0
                Это интересно. Поделитесь ссылкой или примером, пожалуйста!
              0
              Самое логичное, что приходит в голову при словах «Как сделать офисный сканер сетевым» — Нажал на кнопку — Отсканенный jpg на определённом почтовом ящике.
                0
                Не все МФУ умеют слать отсканенное на эл.почту прямо из себя.
                  +7
                  Зато Ubuntu точно умеет
                0
                ASUS N16 с полпинка подружился с нашим МФУ HP (модель сейчас не помню) — сетевые печать и сканирование, с печатью более-менее понятно но вот то что сканиривание завелось меня очень удивило
                  0
                  да, обычно только печать через CUPS…
                    0
                    а не разбирались, это фича ASUS-а или может МФУ какой-то особенный? )
                    0
                    Я у себя сделал так: при нажатии на кнопку сканирования на МФУ результат сохраняется в специально созданную папку на сетевом жестком диске.
                      +1
                      Некоторым МФУ (Samsung SCX-4824, например) для этого необходим установленный и запущенный софт на той машине, в папку которой надо сохранять результат. И софт этот, как правило, виндовый, увы. Так что решение, описанное в статье, пусть и не всем, но многим окажется полезным.
                      +1
                      А поискать не пробовали в сети? Полно же разного.
                      У нас вот это успешно работает в московском и днепропетрвоском офисах:
                      sourceforge.net/projects/phpsane/

                      Есть еще:
                      ubuntu.online02.com/linux_scan_server

                      И куча разных других вариантов, включая нативные SANE-утилиты под винде/linux, которые коннектится к saned, который черех xinetd слушает :-)
                        +3
                        Конечно, искал.

                        Мое решение: человек подходит к МФУ, кладет бумажки (сколько угодно раз поднимает крышку сканера), потом все забирает с собой и идет на свое рабочее место.

                        phpsane etc: человек ходит от своего места к МФУ столько раз, сколько бумажек нужно положить на стекло сканера.
                        А если он работает в соседней комнате — то потенциально может случиться такая ситуация:
                        Он кладет документ для сканирования, идет к себе сканировать.
                        В это время к сканеру подходит другой человек, которому СРОЧНО нужно скопировать свой документ, убирает документ первого, копирует и уходит.
                        А первому нужно вернуться, положить свой документ и идти обратно…
                          0
                          Согласен, логично, удобно, особенно для большого офиса и при прочих равных условиях. В общем, простор для творчества, на то он и open source :-)

                          Сколько такого в жизни было сделано. Когда-то у меня удаленные магазины с рабочих мест на винде управляли шлюзом под столом, который дозванивался до офиса для проведения транзакций, по uucp отправлял почту в том же сеансе или отдельно, получал обновления и прочее и все это было автоматизировано на банальной samba и сообщениях её, то есть у юзеров был простой набор ярлыков с командами типа net send «CHECK_MAIL» и т.п.
                          Как я раньше любил все эти штуки делать, решать сложные задачи простыми путями (KISS :) Сейчас уже не так, но FLOSS остался моим мейнстримом в жизни.
                        +2
                        Есть еще варианты. Если у пользователей линукс, тут все просто, sane умеет шарить сканеры по сети и пользователи могут подхватить расшареный сканер своим xsane. Если у пользователей винда, то можно использовать sanetwain (http://sanetwain.ozuzo.net/) и тоже подхватить сканер, расшареный sane на сервере.
                          0
                          походу опоздал маленько.
                            0
                            З.Ы. Вариант с сетевым sane хорош для небольшого кабинета, когда до сканера «рукой подать» для всех пользователей, ваш вариант хорош если сканером пользуется много человек, но есть небольшой минус, не всегда хочется чтобы отсканированный документ лежал в общей папке.
                              0
                              sane — только для одного кабинета — совершенно согласен.
                              Однако, в моем случае не всем «рукой подать».
                              А если кому-то не хочется хранить документ в общей папке — пусть покупает персональный сканер, либо «большой» сканер с мейлбоксами и паролями.
                              Ибо, если отказаться от моего варианта,
                              а) человек, владеющий сканером, все равно кладет файл в общую папку
                              б) он же может скопипастить файл себе, а потом перепродать заинтересованным лицам
                              в) phpsane (ой, апач «по умолчанию»!) ведь использует http-протокол? Если захочется украсть — можно сниффером попользоваться, а потом программой для восстановления растровых файлов из потока байтов.

                              Сейчас начнется…
                                0
                                Если не убирать монитор, можно доработать скрипт так, чтобы он спрашивал почтовый адрес, куда отослать сканы, можно дать возможность человеку авторизоваться и выкладывать сканы в персональную папку. Линукс это хороший конструктор.
                                  0
                                  Не вопрос. Однако, это мне (той конторе) (пока) не нужно.

                                  (Вот вспомнилось, специально искал...)
                                  Сканер ~ Столовая
                                  www.xakep.ru/post/35784/
                                0
                                Или для сканера с податчиком бумаги.
                              0
                              Дома решил подобную проблему написав ~ 20 строк на богомерзком PHP, и соответственно Apache+ mod_php, прикрутил библиотечку для jquery чтобы область картинки из предпросмотра выбирать можно было, работает…
                              0
                              Неплохое решение проблемы. Смутило только одно…

                              Зачем вы так часто перезагружаетесь? Linux не требует от вас этих перезагрузок. Да и не нужны они, если вы не ядро меняете ;).
                                0
                                Чтобы убедиться, что программа будет стартовать «как надо» после загрузки.
                                Была еще одна перезагрузка — перед ней
                                sleep 10s
                                в начале скрипта появилось (чтобы не смешивались звук загрузки Гнома и «жду команду».
                                0
                                У нас админ Рома вообще гениальное решение придумал
                                У сканера есть режим сканирования на флешку
                                Вставил флешку и расшарил ее как сетевой диск :)
                                  0
                                  А чем не устраивает существующее решение для Apache?
                                  tuxologia.ru/netscan.html
                                  www.openkazan.info/remote-scanner-ubuntu-linux

                                  Это хорошо оттестированное и зарекомендовавшее себя.
                                  Лет 10 уже как работает без проблем…
                                    0
                                    Тудудудум-тудум! habrahabr.ru/blogs/linux/82756/
                                    Возможно кого-то заинтересует решение аналогичной проблемы, но с веб-интерфейсом в локальной сети ;)
                                      0
                                      А есть подобное решение для этого МФУ, подключенного к Wi-Fi маршрутизатору D-Link dir 320?
                                        0
                                        Мне кажется, порядок действий должен быть таким:
                                        1. Подробно расспросить Sap_ru.
                                        2. Прошить 320-й «прошивкой от Олега» (DD-WRT, OPEN-WRT, ...)
                                        3. Разобраться с sane под это дело. Возможно, еще подключить USB-жесткий диск к роутеру.
                                        4. Написать скрипт, который будет сохранять результаты в сетевую папку.

                                        Буду рад прочитать Вашу подробную статью о том, как подружить эти устройства!

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