Захотелось
олдскула, купил матричный принтер, 9-pin Dot Matrix Printer. Цели - печать этикеток для кассет с
играми ZX-Spectrum, просто всяких этикеток на кассеты с музыкой, и
вообще заметок чудесным матричным шрифтом из точек. В общем для фана и
не только.
УСТАНОВКА ДРАЙВЕРА #manjaro Linux
Выбрал impro по ссылке directly download PPD,
который успешно скормил обнаруженному принтеру.Кстати на сайте
openprinting.org можно поискать принтер в базе данных драйверов Linux.
Учстановить, настроить принтер можно утилитой:
Также дополнительные настройки и документация доступны по локальному адресу:
РАБОТА С ПРИНТЕРОМ ИЗ КОНСОЛИ #linuxstyle
Для работы с принтером из консоли сперва необходимо его выбрать:
Посмотреть состояние принтера и принтер по умолчанию:
Выбрать принтером по-умолчанию принтер "epson-lx-300p":
lpoptions -d epson-lx-300p
Приостановить печать, поставить принтер epson-lx-300p на паузу:
cupsdisable epson-lx-300p Возобновить печать на принтере epson-lx-300p: Посмотреть текущий статус принтера (подробнее чем lpstat)
Теперь можно распечатать строку прямо из стандартного ввода:
a="Linux RULEZ!"; echo $a | lpr либо из файла: cat printertest.txt | lpr
Посмотреть доступные опции принтера "epson-lx-300p": lpoptions -p epson-lx-300p -l В данном случае это: PageSize/Page Size: Custom.WIDTHxHEIGHT Letter *A4 3x5 4x6 5x7 5x8 6x8 8x10 8x12 11x14 11x14.Transverse 16x20 16x24 210x305mm 378x279mm.Transverse A3 FanFoldGerman Legal SuperB Просмотр очереди на печать: Удаление всех заданий из очереди, или по номеру: cancel -a lprm - cancel 123
Удаление текущего задания: lprm
ПОЛЕЗНЫЙ
ПРИЁМ — печать массива без форматирования и прокрутки листа после
печати. Задание печатается, позиция ПГ и лист остаются там, где их
застал конец печати. Очень удобно для самостоятельного форматирования
текста и работы в режиме телеграфа. При желании можно настроить чтение
смс с бумаги в реальном времени)
echo "Wake up, User!" | lpr -l
Согласно man lpr ключ -l эквивалентен -o raw.
(!) Внимание, при этом размер шрифта меняется в мелкий дефолтный, и
русские буквы не печатаются. Все команды даются в ручном режиме через
ESC-последовательности.
Чтобы в raw можно было печатать русскими буквами, следует произвести конвертацию кодировки из UTF-8, в которой работает консоль Linux, в cp866, которую знает этот принтер. В этом поможет добавление в конвеер пайпов утилиты iconv с ключом -t (to-encoding) Не перепутайте ключ с -f (from-encoding), он используется для конвертации входящих символов, а нам нужно конвертировать выходящие: a="Русские буквы работают!"; echo $a | iconv -t CP866 | lpr -o raw ЯЗЫК УПРАВЛЕНИЯ ПРИНТЕРОМ #epson ESC/PЕсли
вместо русских букв ерунда, и вы как я сбросили настройки принтера в
дефолт (для этого при включении принтера я удерживал нажатыми кнопки: LF/FF, Load/Eject, Pause), то придётся попотеть, и настроить 866 страницу через непростое меню принтера. Как это сделать, описано в инструкции по русификации, там даже видеоинструкция есть. Однако тоже самое можно сделать одной строкой с двумя командами: echo -e "\x1b\x28\x74\x03\x00\x30\x0e\x00\x1b\x74\x00" | lpr -l где \x1b\x28\x74\x03\x00\x30\x0e\x00 — выбор символов. (см. EPSON мануалSelect Characters R-15 page 249).А \x1b\x74\x00 — выбор текущей таблицы символов из четырёх доступных: 0,1,2,3. (см. EPSON мануалSelect character table С-77 page 85. ) NOTE: Команда echo переводит строку на принтере, что может быть лишним. Избежать этого можно командой printf. Дальнейшие примеры с ней.
Выбор качества печати, в один проход или в два:
printf "\x1b\x78\x30" | lpr -l # Select Draft printf "\x1b\x78\x31" | lpr -l # Select LQ Mode Чтобы изменить размер и тип шрифта, необходимо указать принтеру управляющие Escape-последовательности и код выбранного режима:
echo "Default (condensed) text" | lpr -l printf "\x1b\x21\x00" | lpr -l # Select 10cpi printf "\x1b\x21\x01" | lpr -l # Select 12cpi printf "\x1b\x21\x02" | lpr -l # Select proportional printf "\x1b\x21\x04" | lpr -l # Select condensed printf "\x1b\x21\x08" | lpr -l # Select bold printf "\x1b\x21\x10" | lpr -l # Select double-strike printf "\x1b\x21\x20" | lpr -l # Select double-width printf "\x1b\x21\x40" | lpr -l # Select italic printf "\x1b\x21\x80" | lpr -l # Select underline Коды также можно комбинировать:
a=$(echo 'print("{0:x}".format(0x01+0x08).zfill(2))' | python3); echo -e "\x1b\x21\x$a"01+08 12 cpi bold | lpr -l
Не забывайте перед отправкой русских символов из консоли с utf8 на принтер с dos кодировкой, выполнять перекодировку! echo -e "Русские буквы работают!" | iconv -t CP866 | lpr -o raw
Блок из девяти команд выше изменяет отдельные биты байта после \x1b\x21. Поэтому для включения и выключения сразу нескольких режимов следует оперировать непосредственно бинарным числом. Значение битов слева-направо: underline, italic, double-width, double-strike, bold, condensed, proportional, 12cpi. Выбрать шрифт 10pci можно выключив последний бит, или указав 00000000: double-strike ───┐┌─── bold double-width ──┐││┌── condensed italic ─┐││││┌─ proportional underline ┐││││││┌ 12-cpi a=$(printf %02x $(( 2#00011001 ))) ; printf "\x1b\x21\x$a" | lpr -l Например включить и сразу напечатать образец с флагами italic, double-width, bold, и proportional:
a=$(printf %02x $(( 2#01101010 ))) ; echo -e "\x1b\x21\x$a"Text FRAGment $a | lpr -l
Альтернативные верхним команды с тем же действием.
Печать жирным шрифтом:
printf "\x1b\x45" | lpr -l # Select bold Прекратить печать жирным шрифтом:
printf "\x1b\x46" | lpr -l # Select bold Печать наклонным шрифтом: printf "\x1b\x34" | lpr -l # Cancels italic Прекратить печать наклонным шрифтом: printf "\x1b\x35" | lpr -l # Cancels italic Шрифт в полвысоты и его отключение: printf "\x1b\x53\x30" | lpr -l # Select Superscript printf "\x1b\x53\x31" | lpr -l # Select Subscript printf "\x1b\x54" | lpr -l # Cancels super/subscript Для сравнения оба шрифта в одной строке. Первая часть занимает верх знакоместа, вторая нормального размера, и последняя — нижнюю его часть: echo -e "\x1b\x53\x30upper\x1b\x54NORMAL\x1b\x53\x31lower" | lpr -l Выбор печати пропорциональным шрифтом: printf "\x1b\x70\x31" | lpr -l # Sel Proportional printf "\x1b\x70\x30" | lpr -l # Cancel Proportional
Выбор
таблицы символов. (в мануале: Select character table С-77 page 85)
Всего их четыре: 0,1,2,3. Предположительно русский язык в таблице 1. При
выборе таблицы с другими символами печать на русском будет
кракозябрами: echo -e "\x1b\x74\x01"SelCharTab - русский язык | iconv -t CP866 | lpr -o raw
Моя строка инициализации шрифта: Select LQ Mode + Bold + 12cpi printf "\x1b\x78\x31\x1b\x21\x09" | lpr -l # LQ+Bold+12cpi
Моя строка полной инициализации принтера с русификацией и настройками шрифта как выше
echo -e "\x1b\x28\x74\x03\x00\x30\x0e\x00\x1b\x74\x00\x1b\x78\x31\x1b\x21\x09" | lpr -l
Пискнуть биппером принтера: Напечатать строку из 40 случайных букв и цифр: tr -dc a-zA-Z0-9 < /dev/urandom | fold -w 40 | head -1| lpr -l
Левая и правая границы строки (29-31стр С21-C23 EPSON мануала) Указать правую границу печати, то есть ширину бумаги. \x2d это десятичное число 45, половина ширины А4. После
этой команды можно печатать строки любой длины, они автоматически будут
переноситься при печати при выходе за указанную границу: echo -e "\x1b\x51\x2d" | lpr -l
Но удобнее сразу писать в десятичной системе. Установим правую границу в 78 символов: a=$(printf %02x $(( 78 ))) ;printf "\x1b\x51\x$a" | lpr -l # правая граница печати Установить ЛЕВУЮ граници печати. Двумя границами можно центрировать текст. a=$(printf %02x $(( 20 ))) ;printf "\x1b\x6c\x$a" | lpr -l # левая граница печати
Пропустить строку вверх, эквивалент кнопки LF/FF echo -e "\x1b\x0d" | lpr -l Прокрутить рулон на строку обратно вниз printf "\x1b\x6a\x47" | lpr -l
Таким образом можно проверить точность позиционирования, пропечатать надпись поверх самой себя, сделав её жирнее жирногоbold, скомбинировать из двух символов один. Пример: echo "( ШЕР )" | iconv -t CP866 | lpr -l printf "\x1b\x6a\x23" | lpr -l echo ") ШЕР (" | iconv -t CP866 | lpr -l
Чтобы
исключить перевод строки, можно использовать printf вместо echo. Будь в
примере ниже echo, буквы располагались бы по одной в строке, а так
будут напечатаны как если бы это была одна строка: HELL.
printf "H" |lpr -l printf "E" |lpr -l printf "L" |lpr -l printf "L" |lpr -l Почему-то команда может очень долго идти на принтер
for i in {a..z}; do echo -n $i| lpr -l; done
Любопытный процесс печати текста: for x in "Wake up, User", "The Windows has you...", "follow the GNU/Linux", "Knock, knock, User...";do sleep 2 && echo $x | lpr -l;done
Междустрочный интервал (line spacing)
Немаловажный
параметр для оформления текста. Чем он меньше, тем плотнее строки и
больше текста на листе, но тем труднее он считывается. По умолчанию
интервал между строк составляет 1/6-inch. 2.54 / 6 = 0.42333333333333334
см.
Выбрать стандартный 1/6" интервал, более плотный 1/8", и совсем без интервалов 7/72".
printf "\x1b\x32" | lpr -l # 1/6-inch line spacing printf "\x1b\x30" | lpr -l # 1/8-inch line spacing printf "\x1b\x317" | lpr -l # 7/72-inch line spacing. 9-pin printer only!
Также можно указать произвольный интервал в пределах n/180-inch, где n — 0..255. Например: printf "\x1b\x33\x18" | lpr -l # 216-inch\nLine spacing Кроме прямой функции
это позволяет применять любопытные эффекты. Скрипт ниже пятикратно
печатает слово SHADOW с увеличивающимся интервалом. Получается красивая
тень: for x in {1..5};do printf "\x1b\x33\x$(printf %x $x)SHADOW\n" | lpr -l; done
СИМВОЛЫ ПСЕВДОГРАФИКИ - ПЕЧАТЬ РАМОК Чтобы оформить печать в текстовом режиме таблицами, на помощь приходят символы псевдографики:
┌ ─ ┬ ─ ┐ ╔ ═ ╦ ═ ╗ ╒ ╤ ╕ ╓ ╥ ╖ │░░░│░░░│ ║░░░║░░░║ ╞ ╪ ╡ ╟ ╫ ╢ ░ ▒ ▓ █ ▀▄ ▌▐ ├ ─ ┼ ─ ┤ ╠ ═ ╬ ═ ╣ ╘ ╧ ╛ ╙ ╨ ╜ └ ─ ┴ ─ ┘ ╚ ═ ╩ ═ ╝
Поскольку
рамки нужны, чтобы печатать их на принтере, лучше сразу выводить в
кодировке CP866, а для вывода на экран использовать конвертацию.
Напечатаем их всех в консоли так: echo $(for x in {176..223}; do printf "\x$(printf %x $x)" ; done ;) | iconv -f CP866 Или так: echo $(for x in $( seq $((16#B0)) $((16#DF)) ); do printf "\x$(printf %x $x)" ; done ;) | iconv -f CP866
Теперь распечатаем эти символы на принтере так:
echo $(for x in {176..223}; do printf "\x$(printf %x $x)" ; done ;) | lpr -l
Или так:
echo $(for x in $( seq $((16#B0)) $((16#DF)) ); do printf "\x$(printf %x $x)" ; done ;) | lpr -l
Как можно заметить выше, iconv не используется, поскольку на принтер изначально идёт кодировка cp866.
Но
это генерация, а как быть с печатью уже готового текстового файла с
рамками? Во избежание неверной перекодировки полезно узнать, в какой
кодировке записан печатаемый файл:
Допустим
команда показала, что файл text/plain; charset=utf-8. Тогда можно смело
печатать с перекодированием для принтера в CP866:
cat filename.txt | iconv -t CP866 | lpr -l Да,
печатать рамки лучше всего жирным шрифтом, иначе вертикальные линии
будут неровными из-за особенностей матрицы принтера. Как я писал выше,
можно выбрать: Select LQ Mode + Bold + 12cpi echo -e "\x1b\x78\x31\x1b\x21\x09" | lpr -l
Ссылки:
|