Доброе время суток, сообщество!
Решил рассказать как в одной рабочей группе был организован «быстрый» перевод бумажного документа в цифровой вид.
Для начала расскажу что есть. А есть рабочая группа (около 10 компьютеров) во главе с отдельно стоящим системным блоком, гордо именуемым «сервер». На сервере установлена 64-разрядная Ubuntu Server с настроенным Samba.
Как раньше сканировали менеджеры: включался компьютер, к которому был подключен планшетный сканер HP ScanJet 2400 (если не был включен) и сканировался документ постранично с указанием места сохранения файла.
Очевидные недостатки: необходимо было включать компьютер (а затем его выключать), тратилось время на ожидание загрузки ОС, программы, долгий разогрев сканера перед первым сканированием.
Как это стало: менеджер подошел к сканеру, вставил документы пачкой (до 20 листов), нажал кнопку на сканере, забрал документы. Пока вернулся на своё место сканы уже в шаре.
Время получения цифровой копии уменьшился в десятки раз.
Реализация
Необходим был недорогой документ-сканер с возможность подключения к linux. Выбор пал на модель ADS-2100 фирмы Brother.
Итак, подключаем сканер usb-кабелем к серверу и настраиваем.
1. Смотрим, подключен ли сканер
lsusb
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 004: ID 03f0:3817 Hewlett-Packard LaserJet P2015 series
Bus 001 Device 002: ID 04f9:60a1 Brother Industries, Ltd
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
2. Заходим на сайт производителя www.brother.ru/ и по ссылкам переходим на страницу welcome.solutions.brother.com/bsc/public_s/id/linux/en/index.html для загрузки драйверов и программ для Linux
Ищем Download → Scanner Driver /ADS Driver / Scan-Key-Tool → for ADS models файл brscan4 64bit формата deb, а также файл scan-key-tool 64bit такого же формата
Я качал драйвера с рабочего компьютера, потом просто закинул их в шару на сервере и оттуда устанавливал.
3. Переходим в директорию со скачанными файлами и устанавливаем драйвер сканера
dpkg -i brscan4-0.4.1-3.amd64.deb
Выбор ранее не выбранного пакета brscan4.
(Чтение базы данных ... на данный момент установлено 108594 файлов и каталогов.)
Распаковывается пакет brscan4 (из файла brscan4-0.4.1-3.amd64.deb)...
Настраивается пакет brscan4 (0.4.1-3) ...
This software is based in part on the work of the Independent JPEG Group.
4. Даем разрешения для сканирования под обычным пользователем
Открываем файл /lib/udev/rules.d/40-libsane.rules и до комментария "# The following rule will disable USB autosuspend for the device" добавляем
# Brother scanners
ATTRS{idVendor}=="04f9", ENV{libsane_matched}="yes"
5. Перезагружаем сервер
6. Аналогично п.3 устанавливаем Scan-key-tool
dpkg -i brscan-skey-0.2.4-0.amd64.deb
Выбор ранее не выбранного пакета brscan-skey.
(Чтение базы данных ... на данный момент установлено 108623 файлов и каталогов.)
Распаковывается пакет brscan-skey (из файла brscan-skey-0.2.4-0.amd64.deb)...
Настраивается пакет brscan-skey (0.2.4-0) ...
7. Исправляем конфигурационные файлы. При нажатии определенной клавиши запускается команда. Это прописано в /opt/brother/scanner/brscan-skey/brscan-skey-0.2.4-0.cfg
Его содержимое:
password=
IMAGE="sh /opt/brother/scanner/brscan-skey/script/scantoimage-0.2.4-0.sh"
OCR="sh /opt/brother/scanner/brscan-skey/script/scantoocr-0.2.4-0.sh"
EMAIL="sh /opt/brother/scanner/brscan-skey/script/scantoemail-0.2.4-0.sh"
FILE="sh /opt/brother/scanner/brscan-skey/script/scantofile-0.2.4-0.sh"
SEMID=b
На сканере три кнопки: включение/выключение сканера, запустить сканирование и сканирование на флешку.
Опытным путем было выяснено, что за кнопку сканирования отвечает переменная FILE=
Изменяем её на
FILE="sh /home/admin/file.sh"
Создаем скрипт /home/admin/file.sh
#! /bin/sh
set +o noclobber
#
# $1 = scanner device
# $2 = friendly name
#
## разрешение сканирования
resolution=300
device=$1
## создаем временную директорию для сканирования
temp_dir=/tmp/scan_"`date +%Y-%m-%d-%H-%M-%S`"
mkdir -p $temp_dir
cd $temp_dir
## это было в скрипте производителя
if [ "`which usleep 2>/dev/null `" != '' ];then
usleep 10000
else
sleep 0.01
fi
## сканируем
## число раз сканирования =40
## сканирование с двух сторон
## координаты для сканирования А4
## устройство сканирования
## разрешение сканирования сделано через переменную, в примере было так
## получаемый файл в формате tiff
<u>scanimage</u> --batch-count=40 --source 'Automatic Document Feeder(centrally aligned,Duplex)' -x 210 -y 297 --device-name "$device" --resolution $resolution –format=tiff
## конвертируем все tif-ы в jpg-и с качеством 90%
<u>convert</u> -quality 90% *.tif im.jpg
## удаляем все tif-ы из директории
rm *.tif
## переименовываем jpg-и
<u>exiftool</u> -d %Y-%m-%d_%H.%M-%S%%-c.%%e "-filename<FileModifyDate" $temp_dir
## файлы больше 111 кбайт перемещаем в шару для сканированных документов
## т.о. отсеиваем листы без информации
## предел подбирается опытным путем
find . -size +111k -exec mv {} /srv/scan ;
## удаляем директорию с оставшимися файлами
rm -r $temp_dir
## собственником скан-файлов делаем saned
## можно и не делать, тогда владелец будет root
cd /srv/scan
chown saned:saned *.jpg
В скрипте я подчеркнул, то чего не было в системе. Доустановим/создадим:
а) для scanimage
apt-get install libsane sane-utils
б) для convert
apt-get install imagemagick
в) для exifrool
apt-get install libimage-exiftool-perl
г) создаем шару /srv/scan видную в локальной сети как //server/scan для чтения всем пользователям
Выставляем права на скрипт 600
8. Не обязательный шаг. Я изменил скрипт запуска демона для отслеживания состояния клавиш сканера /opt/brother/scanner/brscan-skey/brscan-skey следующим образом:
#! /bin/sh
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
if [ "$2" = "2" ];then
echo ' no option :register all MFCs'
echo ' -t (--terminate) :terminate this tool'
echo ' -a (--add MFC) :register the specified MFC'
echo ' -d (--delete) MFC :exclude the specified MFC'
echo ' -p (--passwd) PASSWORD :set the password'
echo ' -u (--username) USERNAMR :set the user name'
echo ' -l (--list) :list the available MFCs'
echo ' -m (--mailto) :mail address (scan to e-mail)'
echo ' --refresh :refresh setting'
echo ' --reset :reset the configuration file'
echo ' --diagnosis :print diagnosis data'
echo ' -h --help :help'
fi
echo ' Copyright 2007-2012 Brother Industries, Ltd'
exit 0
fi
if [ "$1" = "-l" ] || [ "$1" = "--list" ]; then
/opt/brother/scanner/brscan-skey/brscan-skey-0.2.4-0 $*
exit 0
fi
if [ "$1" = "-f" ];then
/opt/brother/scanner/brscan-skey/brscan-skey-0.2.4-0 $*
else
/opt/brother/scanner/brscan-skey/brscan-skey-0.2.4-0 $*&
fi
#! /bin/sh
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
## if [ "$2" = "2" ];then
echo ' no option :register all MFCs'
echo ' -t (--terminate) :terminate this tool'
echo ' -a (--add MFC) :register the specified MFC'
echo ' -d (--delete) MFC :exclude the specified MFC'
echo ' -p (--passwd) PASSWORD :set the password'
echo ' -u (--username) USERNAMR :set the user name'
echo ' -l (--list) :list the available MFCs'
echo ' -m (--mailto) :mail address (scan to e-mail)'
echo ' --refresh :refresh setting'
echo ' --reset :reset the configuration file'
echo ' --diagnosis :print diagnosis data'
echo ' -h --help :help'
## fi
echo ' Copyright 2007-2012 Brother Industries, Ltd'
exit 0
fi
if [ "$1" = "-l" ] || [ "$1" = "--list" ]; then
/opt/brother/scanner/brscan-skey/brscan-skey-0.2.4-0 $*
exit 0
fi
if [ "$1" = "-f" ];then
/opt/brother/scanner/brscan-skey/brscan-skey-0.2.4-0 $*
else
/opt/brother/scanner/brscan-skey/brscan-skey-0.2.4-0 $*&
fi
Просто я не понял зачем нужен второй аргумент.
Добавляем этот скрипт в автозагрузку. Добавим в /etc/rc.local
/opt/brother/scanner/brscan-skey/brscan-skey
И можно его запустить:
brscan-skey
Что бы остановить демон
brscan-skey -t
9. Сделаем скрипт для периодической чистки директории сканирования
#! /bin/sh
work_dir=/srv/scan
archiv_dir=/srv/scan/Архив
mkdir -p $archiv_dir
## перемещаем файлы в архив, вдруг кто-то забыл забрать документ
cd $work_dir
mv *.jpg $archiv_dir
## find -maxdepth 1 -type f -mtime +1 -exec mv {} $archiv_dir ;
## файлы старше 7 дней удаляем
cd $archiv_dir
find . -type f -mtime +7 -delete
Права на скрипт выставляем 740
С помощью cron можно назначить переодичность выполнения скрипта очистки. Но так как каждый день сервер после рабочего дня выключается коротким нажатием на кнопку питания, то в файл /etc/acpi/powerbtn.sh я добавил
## удаление старых сканов
/home/admin/del.sh
Короткое видео, демонстрирующее работу сканера.
Спасибо за внимание!
Автор: DS2