Сканируем, копируем, печатаем с командной строки

Sep 28, 2010 12:24

Есть старенький сканер HP 2400. Под линукс работает только через "костыли" - при этом разработчик костылей не стал утруждать себя поддержкой различных опций сканирования и ограничился выводом в RGB. Представляете, каких размеров файл получается, если отсканировать А4-страницу с разрешением уже в 300 DPI? А 600?

Есть ещё и принтер, Lexmark Optra E312L. Этот, в принципе, работает нормально - если не считать, что от времени у него высохли ролики захвата бумаги, и теперь он хронически не отличает один листочек от целой стопки. Т.е. бумагу ему нужно скармливать поштучно. Он осиливает около 10 страниц в минуту, а то и меньше.

А теперь представьте ситуацию: заходит преподаватель и просит сделать для студентов 6 копий материалов. И вручает стопку из 20 листов. Нужно 1) отсканировать, 2) обработать (хотя бы перевести из цвета в gray, чтобы не нагружать старичка-принтера огромным файлом печати), 3) отправить в печать, 4) стоять возле принтера и всовывать ему поштучно лист за листом.

Ладно. Один раз сделал. Но на следующий день преподаватель пришёл с новой порцией материалов. К тому же некоторые страницы (я точно помню!) я уже печатал ему несколько лет назад. И тут я задумался.

В результате нарисовалось несколько скриптов для существенного облегчения жизни.

#!/bin/bash

COPIES=$1
DENSITY=$2
RESOLUTION=300

if [ "z$COPIES" = "z" ] ; then
   COPIES=1
fi

if [ "z$DENSITY" = "z" ] ; then
   DENSITY=65
fi

CMD="--format=tiff --resolution $RESOLUTION --mode Color -x 209.9 -y 297.0 | convert - -colorspace Gray -threshold $DENSITY% -colors 2 -compress Group4"
LPR="lpr -#$COPIES"

if [ "z$OUTFILE" = "z" ] ; then
   FIN="scanimage $CMD tiff:- | $LPR"
else
   FIN="scanimage -p $CMD $OUTFILE"
fi

eval $FIN

Что делаем? Да очень просто. Запускаем консольный scanimage. Из него изображение по трубопроводу отправляем в imagemagick, который переводит в grayscale, а потом и вообще в 1-битный ч/б. Получившийся небольшой совсем файлик отправляется на принтер. А в качестве параметров указываем число копий и пороговое значение для перевода в ч/б. Работает "на ура"! Скрипт я назвал немудрёно: "copy" - и поместил в /usr/local/bin. Теперь для одиночной копии я просто кладу оригинал на сканер и запускаю "copy". Всё! А если нужно несколько копий (скажем, 4) - запускаю "copy 4". Картинка сканируется, обрабатывается и отправляется на принтер.

А ещё что? А ещё - если установлена переменная $OUTFILE - то на принтер не выводим, а сохраняем конечную картинку в файл. Зачем? А об этом ниже.

Второй скрипт: /usr/local/bin/copya

#!/bin/bash

FILE=`date +"./$FOLDER/%_d_%b_%Y_%H_%M_%S.tiff"`
PREFIX=`date +"/tmp/%_d_%b_%Y"`
A=100
[ -e "$PREFIX" ] && rm -R $PREFIX
mkdir -p $PREFIX
while true; do
   export OUTFILE="$PREFIX/$A.tiff"
   copy $@
   printf "Page $((A-99)) memorized. 's' to stop and output, other to continue"
   A=$((A+1))
   read B
   if [ "z$B" = "zs" ] ; then
     break
   fi
done

convert -adjoin "$PREFIX/*.tiff" "$FILE"

rm -R $PREFIX

COPIES=$1
if [ "z$COPIES" = "z" ] ; then
   FIN="tiff2ps -a $FILE | lpr -C \"$FILE\""
else
   FIN="tiff2ps -a $FILE | lpr -#$COPIES -C \"$FILE\""
fi

eval $FIN

Здесь развиваем идею. Я заметил, что если одновременно печатать и сканировать следующую копию, то сканер "заикается". Видимо оттого, что по одному usb-кабелю (через хаб) идёт и сканирование, и печать - USB 1.1 со скоростью 12 Мбит/с просто не справляется. Поэтому делаем разделение задач: сперва всё сканируем, потом всё печатаем. Следующий шаг - покуда всё равно всё сканируем - почему бы не сохранить это на будущее? Вдруг тот же преподаватель снова приедет и снова даст копировать те же материалы? Мне тогда будет проще распечатать то, что имеется. Наконец - покуда бывают многостраничные форматы, незачем хранить папку с файлами по страничке в каждом. Лучше создавать по файлу на каждую сессию копирования.

Итак - берём текущую дату, время - это и будет название конечного документа. Затем - сканируем документ, обрабатываем и сохраняем во временную папку. Сканируем следующий - и т.д., пока не отсканируем всё, что нужно. А по окончании - собираем из отсканированных файлов многостраничный tiff - и отправляем его в печать с помощью tiff2ps. Кстати, это получается гораздо быстрее, чем просто отправить tiff демону lpr. Единственное, что нам нужно - это чтобы была установлена переменная $FOLDER с путём к папке, куда мы будем складывать готовые сканы. А параметры вызова у скрипта точно такие же, как у предыдущего - т.е. число копий и порог ч/б.

Наконец, у этого преподавателя одни материалы, у другого - другие. Поэтому делаю ещё вот такой скрипт:

#!/bin/bash

export FOLDER="Isaev"
copya $@

Скрипт назван "isaev" и лежит в домашней папке. Там же создана и папка Isaev, куда собираются итоговые материалы.

Итак, приходит профессор Исаев со стопкой бумаг и просит сделать 4 копии.
Я запускаю "./isaev 4" и по очереди скармливаю его бумаги сканеру. Затем подхожу к принтеру и кормлю его бумагой. И в конечном итоге получаю быстро сделанные копии + небольшой файл на будущее. (1-битный tiff с факсовым сжатием Group2 занимает очень немного места. Практически как djvu, но последний обрабатывается существенно медленнее).

Вот как-то так.
Previous post Next post
Up