iidolm
Встала задача помочь своей фирме сэкономить. Не покупать дорогие МФУ типа 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