- PVSM.RU - https://www.pvsm.ru -

Можно вот так взять, и сделать из дешевого сканера МФУ в GNU\Linux

Встала задача помочь своей фирме сэкономить. Не покупать дорогие МФУ типа xerox 3300mfp за ~22 тыс. рублей, а обойтись подручными или более дешевыми средствами.

Задачи:
1. Сканировать в сетевую папку
2. Ксерокопировать документы
3. Делать pdf из отсканированного изображения

Что имеем:
1. ПК под управлением Kubuntu 12.04.1x64(Тестовый вариант. В дальнейшем будет перевод на бездисковый неттоп на atom'е + Ubuntu(Centos?) server)
2. Уже старый принтер HP p1505n
3. Взятый на пробу сканер HP Scanjet G2710

Перед тем как взяться за задачу, надо было выяснить какие есть самые дешевые сканеры в наличии в моем городе, и есть ли они в списке поддерживаемых моделей [1] у SANE [2].
Выбор пал на 2 сканера, G2710 и BearPaw. Выбран был HP исходя из того что под BearPaw необходимо закачивать файлик с драйверами, а нам необходим самый простой вариант. Неизвестно сколько этот файлик будет храниться на файлообменниках, но если вдруг что случится — лучше иметь «искоробочное» решение.

Поизучав форумы решение нашлось быстро. Необходима связка sane + scanbuttond [3]. Не смотря на устаревшую информацию на официальном сайте scanbuttond [3], последние сборки, по крайней мере в репах, более свежие. Обе утилиты есть в стандартных репозиториях. Использовал их без всяких PPA.

Версии утилит:
Можно вот так взять, и сделать из дешевого сканера МФУ в GNU\Linux [4]

Через sane сканер заработал без каких либо плясок с бубном. Но встал вопрос — как использовать 3 имеющиеся на борту кнопки? Вот здесь нам и поможет scanbuttond. Ставим утилиту. Правим конфиг. В убунте по дефолту он находится в /etc/scanbuttond/initscanner.sh.example. Копируем пример в рабочий вариант(я пользуюсь vi, так что копипастите аккуратно, не забудьте сменить vi на имя вашего любимого редактора):

cp /etc/scanbuttond/initscanner.sh{.example,} && vi /etc/scanbuttond/initscanner.sh

и пишем в конец строку

scanimage -L

Cохраняем.
Подключаем сканер, делаем sane-find-scanner. Если все ok, запускаем в терминале scanbuttond с ключом -f и нажимаем кнопки на сканере(у меня после запуска scanbuttond -f проходит ~7 секунд до момента когда он начинает обрабатывать нажатия).

Можно вот так взять, и сделать из дешевого сканера МФУ в GNU\Linux [5]

По «выхлопу» видно какой номер у каждой кнопки. Записываем или запоминаем их номера, после чего правим конфиг обработки нажатий.

cp /etc/scanbuttond/buttonpressed.sh{.example,} && vi /etc/scanbuttond/buttonpressed.sh

Разработчик(и) постарались и накидали нам уже несколько готовых примеров, которые помогут нам осуществить задуманное.
На 16 строке у нас есть две интересующие нас переменные — TMPFILE и TMPFILE_PDF. Для них прописываем путь куда будут класться отсканированные документы и документы сконвертированные в pdf соответственно.

Например:

TMPFILE="${SAVEPATH}${DATE1}scan.jpeg"
TMPFILE_PDF="${SAVEPATH}${DATE1}scan.pdf"

Переменные $DATE1, $DATE2 и $SAVEPATH прописаны мною выше и выглядят так:

DATE1=$(date +%Y_%m_%d_%H%M%S)
DATE2=$(date +%Y_%m_%d_%H:%M:%S)
SAVEPATH="/home/panda/Scan/"

SAVEPATH, понятно, может быть любым. Ну или почти любым. Планируется использовать подключенную сетевую папку через fstab, так что проблем быть не должно.
Остальные 2 переменные TMPFILE_PS и LOCKFILE я не трогал, ибо их дефолтные значения меня вполне устраивают.

Теперь что касается настройки кнопок. У меня это выглядит следующим образом

case $1 in

        1)
                echo "$DATE2 -- Button 1 has been pressed on $2"
               	echo -ne '07' > /dev/null 2>&1
		mplayer /usr/share/sounds/KDE-K3B-Insert-Medium.ogg > /dev/null 2>&1
		scanimage --resolution 300 --device-name $2 --mode Color -x 210 -y 297 | pnmtops -width=8.27 -height=11.69 > $TMPFILE_PS
                ps2pdf $TMPFILE_PS $TMPFILE_PDF
		echo "$DATE2 -- PDF create done"
                ;;

        2)
                echo "$DATE2 -- Button 2 has been pressed on $2"
		echo -ne '07' > /dev/null 2>&1
		mplayer /usr/share/sounds/KDE-K3B-Insert-Medium.ogg > /dev/null 2>&1
		SCAN_OPTIONS="--resolution 300"
		scanimage --device-name $2 $SCAN_OPTIONS | pnmtops -width=8.27 -height=11.69 | lpr -J $2 $PRINTER
                lockfile-remove $LOCKFILE
		echo "$DATE2 -- Print done"
		;;

	3)
		echo "$DATE2 -- Button 3 has been pressed on $2"
		echo -ne '07' > /dev/null 2>&1
		mplayer /usr/share/sounds/KDE-K3B-Insert-Medium.ogg > /dev/null 2>&1
		scanimage --resolution 300 --mode Color --format=jpeg -x 210 -y 297 --device-name $2 > $TMPFILE
		convert $TMPFILE -quality 70 $TMPFILE 
	        echo "$DATE2 -- Scan image done"
		;;

esac

Из кода понятно, что первая кнопка делает из полученного изображения PDF, вторая сканирует и выводит на печать на принтер по умолчанию(ксерокопия), а третья — просто сканирует.
Note: Надо заметить, что при сканировании у меня используется утилита convert, входящая в пакет imagemagic. Через нее получаем jpeg с приемлемым размером изображения.

Так же у меня на каждую кнопку повешены события типа

echo -ne '07' > /dev/null 2>&1

и

mplayer /usr/share/sounds/KDE-K3B-Insert-Medium.ogg > /dev/null 2>&1

Первое пищит спикером(что актуально для сервера без иксов), а второе через mplayer выводит звуковое уведомление(актуально для машин с иксами, т.к. первый пункт работает почему-то только из tty{1-6} ). Это сделано для того, что бы понять что кнопка на сканере была нажата. Потому что кнопки бывают разные, нажимаются иногда криво и не понятно, сработало нажатие, или нет. Понятно что это все можно закомментировать или оставить по вкусу.

Включить пищалку можно закомментировав в файле /etc/modprobe.d/blacklist.conf строки содержащие

blacklist snd_pcsp
и
blacklist pcspkr

Т.е. должно выглядеть так:

#blacklist snd_pcsp
и
#blacklist pcspkr

или установить пакет beep и вызывать его в скрипте.

Осталось всё это чудо записать в автозапуск. Создаем файлик /etc/init.d/scan и пишем в него:

#!/bin/bash
killall scanbuttond
scanbuttond -f >> /home/panda/Scan/scanlog.log 2>&1 &

Я сделал себе логирование, которое выглядит примерно так:

Можно вот так взять, и сделать из дешевого сканера МФУ в GNU\Linux [6]

Можете перенаправить вывод и в /dev/null, и в /var/log/, как хотите. Мое дело предложить ;)

Даем права на исполнение и прописываем в rc.d:

chmod +x /etc/init.d/scan && update-rc.d scan defaults 80

Собственно на этом настройка закончена. Куда класть изображения, формат логирования, наличие оного — всё зависит от вашей фантазии, благо в scanbuttond можно прописать любой скрипт.

Итог:
Данный способ подходит для тех мест, где уже есть принтер и ПК на который это все дело можно повесить. Что бы не покупать еще дорогое МФУ — проще купить сканер. Ежели покупать неттоп + принтер + сканер, то расценки в нашем городе такие:
Неттоп ~ 10 000 р
Принтер ~ 1 550 р
Сканер ~ 3500 р

Итого ~ 15 000 рублей (если брать все с нуля) против ~22 000 рублей за сетевой МФУ (с функцией сканировать в сетевую папку) которое мы брали в отделы. Для себя я задачу решил с экономией, т.к. взяли только сканер.

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

P.S. Полный листинг /etc/scanbuttond/buttonpressed.sh очищенный от всего лишнего:

#!/bin/sh


DATE1=$(date +%Y_%m_%d_%H%M%S)
DATE2=$(date +%Y_%m_%d_%H:%M:%S)
SAVEPATH="/home/panda/Scan/"
TMPFILE="${SAVEPATH}${DATE1}scan.jpeg"
TMPFILE_PDF="${SAVEPATH}${DATE1}scan.pdf"
TMPFILE_PS="/tmp/scan.ps"
LOCKFILE="/tmp/scan.lock"


# Lock file handling and GNOME examples for buttons 2, 3, 4 below contributed
# by Lutz Müller <lutz@topfrose.de>.


if ! lockfile-create --retry 2 $LOCKFILE; then
  echo "$DATE1 -- Error: scanning already in progress for $2"
  exit
fi

rm -f $TMPFILE
rm -f $TMPFILE_PDF
rm -f $TMPFILE_PS

case $1 in

        1)
                echo "$DATE2 -- Button 1 has been pressed on $2"
		echo -ne '07' > /dev/null 2>&1
		mplayer /usr/share/sounds/KDE-K3B-Insert-Medium.ogg > /dev/null 2>&1
		scanimage --resolution 300 --device-name $2 --mode Color -x 210 -y 297 | pnmtops -width=8.27 -height=11.69 > $TMPFILE_PS
                ps2pdf $TMPFILE_PS $TMPFILE_PDF
		echo "$DATE2 -- PDF create done"
                ;;

        2)
                echo "$DATE2 -- Button 2 has been pressed on $2"
		echo -ne '07' > /dev/null 2>&1
		mplayer /usr/share/sounds/KDE-K3B-Insert-Medium.ogg > /dev/null 2>&1
		SCAN_OPTIONS="--resolution 300"
		scanimage --device-name $2 $SCAN_OPTIONS | pnmtops -width=8.27 -height=11.69 | lpr -J $2 $PRINTER
                lockfile-remove $LOCKFILE
		echo "$DATE2 -- Print done"
		;;

	3)
		echo "$DATE2 -- Button 3 has been pressed on $2"
		echo -ne '07' > /dev/null 2>&1
		mplayer /usr/share/sounds/KDE-K3B-Insert-Medium.ogg > /dev/null 2>&1
		scanimage --resolution 300 --mode Color --format=jpeg -x 210 -y 297 --device-name $2 > $TMPFILE
		convert $TMPFILE -quality 70 $TMPFILE 
		echo "$DATE2 -- Scan image done"
		;;

esac

lockfile-remove $LOCKFILE

P.S.S. Не смог загрузить картинки на Habrastorage. Выдает

Только авторизованные пользователи «Хабрахабра» могут загружать файлы на habrastorage.org.

При этом на сайте авторизирован. Тем не менее приношу свои извинения, если причинил этим неудобства.

Автор: iidolm

Источник [7]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/linux/21944

Ссылки в тексте:

[1] списке поддерживаемых моделей: http://www.sane-project.org/sane-supported-devices.html

[2] SANE: http://ru.wikipedia.org/wiki/SANE

[3] scanbuttond: http://scanbuttond.sourceforge.net/

[4] Image: http://www.picshare.ru/view/628336/

[5] Image: http://www.picshare.ru/view/628338/

[6] Image: http://www.picshare.ru/view/628337/

[7] Источник: http://habrahabr.ru/post/161579/