GrabDuck

Можно вот так взять и сделать МФУ из дешевого сканера в 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

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

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

Версии утилит:

Через 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 секунд до момента когда он начинает обрабатывать нажатия).

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

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 '\007' > /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 '\007' > /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 '\007' > /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 '\007' > /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 &

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

Можете перенаправить вывод и в /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 '\007' > /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 '\007' > /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 '\007' > /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