Оптимизация сканирования в небольшом офисе

в 6:24, , рубрики: linux, Linux для всех, сканирование документов, метки: ,

Доброе время суток, сообщество!

Решил рассказать как в одной рабочей группе был организован «быстрый» перевод бумажного документа в цифровой вид.

Для начала расскажу что есть. А есть рабочая группа (около 10 компьютеров) во главе с отдельно стоящим системным блоком, гордо именуемым «сервер». На сервере установлена 64-разрядная Ubuntu Server с настроенным Samba.

Как раньше сканировали менеджеры: включался компьютер, к которому был подключен планшетный сканер HP ScanJet 2400 (если не был включен) и сканировался документ постранично с указанием места сохранения файла.
Очевидные недостатки: необходимо было включать компьютер (а затем его выключать), тратилось время на ожидание загрузки ОС, программы, долгий разогрев сканера перед первым сканированием.

Как это стало: менеджер подошел к сканеру, вставил документы пачкой (до 20 листов), нажал кнопку на сканере, забрал документы. Пока вернулся на своё место сканы уже в шаре.
Время получения цифровой копии уменьшился в десятки раз.

Реализация

Необходим был недорогой документ-сканер с возможность подключения к linux. Выбор пал на модель ADS-2100 фирмы Brother.
image
Итак, подключаем сканер 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. Сделаем скрипт для периодической чистки директории сканирования

/home/admin/del.sh

#! /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

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js