В качестве первого примера -- распечатка документов.
На самом деле здесь будет две задачи. Первая задача была достаточно проста: двусторонняя печать на одностороннем принтере. Как оказалось, многие графические программы даже здесь оказались не на высоте: из обязательных требований, список которых ниже, не удовлетворяли в лучшем случае одному (в худшем -- всем). Итак, требуются такие возможности:
1. распечатывать по отдельности чётные и нечётные страницы;
2. печатать чётные страницы в обратном порядке (чтобы не приходилось вручную "перелистывать" всю пачку);
3. задавать разные поля для чётных и нечётных страниц (для последующей сшивки).
К счастью, все используемые нами программы имеют возможность "распечатывать" в файл PostScript, для работы с которым есть замечательный набор кнсольных утилит psutils. Да и принтер тоже может управляться простыми командами.
Для начала был написан такой скрипт:
Shell
t:~/bin$ cat pr
#!/bin/bash
s=0
[ "$1" == "-s" ] && {
s=$2
shift 2
}
case "$1" in
-o|-1|o|1) p="-o"; l="0(${s}mm,0)" ;;
-e|-2|e|2) p="-er"; l="0(-${s}mm,0)" ;;
*) exit 1;;
esac
[ -f "$2" ] || exit 1
psselect $p "$2" | pstops -p a4 $l | lpr
Как видите, всё просто: опцией -s задаётся сдвиг в миллиметрах; обязательный параметр только один и отвечает за то, какие страницы печатать. Т.е. механизм стал такой:
1. "распечатать" в файл нужный документ;
2. выполнить команду (к примеру) pr -s 10 1 имя-файла;
3. дождаться окончания печати и перевернуть стопку бумаги в принтере;
4. выполнить команду (к примеру) pr -s 10 2 имя-файла.
Конечно, тут же захотелось этот процесс автоматизировать. Но тут возникла "параллельная" мысль: хотелось бы распечатывать и читать не стопки листов А4, а книжки. Тут на помощь могут прийти всё те же psutils; в man pstops есть даже соответствующий пример, причём именно для А4. В итоге были написаны ещё три простых скрипта: для преобразования файла со страницами А4 в книгу; для автоматизации процесса печати; и для предварительного просмотра этой книги.
Shell
t:~/bin$ cat kniga
#!/bin/bash
[ -f "$1" ] || exit 1
cat "$1" | psbook -s16 |
pstops -pa4 "2:0L@.7(21cm,0)+1L@.7(21cm,14.85cm)"
Команда psbook переставляет страницы в "книжном" порядке; опция s задаёт размер тетрадки -- в страницах, потому число должно быть кратно 4. Пример команды pstops, как я уже говорил, был взят из мана.
Предпросмотр оказался совсем простым, т.к., оказывается, kde-шная "смотрелка" PostScript умеет принимать данные со stdin:
Shell
t:~/bin$ cat bookview
#!/bin/sh
kniga "$1" | kghostview -
Скрипт печати тоже не так уж сложен.
Shell
t:~/bin$ cat bookprint
#!/bin/bash
kniga "$1" >${1%.ps}_kniga.ps
pr 1 "${1%.ps}_kniga.ps" || exit 1
zenity --question --title=Печать --text='Печатать вторую сторону?' &&
pr 2 "${1%.ps}_kniga.ps"
В итоге процесс печати книжки стал, на мой взгляд, "проще некуда":
1. "распечатать" в файл;
2. если нужен предпросмотр, нажать одну из кнопочек на панели;
3. для печати нажать вторую кнопочку;
4. дождаться окончания печати первой стороны, перевернуть стопку и подтвердить продолжение печати в появившемся диалоге.
Единственное лишнее движение диктуется здесь как раз недостаточной гибкостью большинства графических программ, которые умеют сохранять "распечатку" в файл, но не умеют передавать её на stdout.