Pull to refresh

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

Reading time4 min
Views38K

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


В одной маленькой организации (~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
Еще раз перезагружаю компьютер – все работает, пользователи довольны.
Tags:
Hubs:
Total votes 54: ↑49 and ↓5+44
Comments39

Articles