Содержание
Проблема: При печати строки текста съезжают "лесенкой"
Условия:
Со стороны сервера:
- любые ОС.
- характерно для очередей печати, сконфигурированных в raw-режиме (без использования фильтрования)
Со стороны принтера:
- характерно для принтеров с языком PCL (HP LaserJet и совместимые)
- не характерно для принтеров с языком ESC/P (Epson)
Тип печати:
- текстовая
- текстовые строки, вставленные в графическую форму
Симптомы:
Сообщения об ошибках отсутствуют. На распечатках последовательные строки текста в моноширинном фонте выглядят «лесенкой»:
::::::::::::::::::::::::::::::::::::::::::::::::::::: первая строка вторая строка третья строка и так далее :::::::::::::::::::::::::::::::::::::::::::::::::::::
Причина:
Признаком конца строки в текстовых файлах в формате UNIX является
единичный символ «перевод строки» (LineFeed, LF, '\n', '\x0A', Ctrl-L)
В формате DOS используется пара символов: CR+LF
(CR - «возврат каретки», CarriageReturn, '\r', '\x0D', Ctrl-M)
При выводе UNIX-текста на устройство DOS получается описанный выше эффект, т.к. не хватает «возврата каретки», т.е., перехода курсора в начало строки.
Принтеры с языком управления PCL (любой версии) по умолчанию работают в режиме:
CR=CR; LF=LF; FF=FF
то есть, воспринимают только формат DOS, что и вызывает указанную проблему.
Диагностика:
- Вывести на принтер строки текста в UNIX-формате, например:
printf "one\ntwo\three\n\f" | lp -d <имя-принтера>
Принтер PCL в дефоултной настройке напечатает текст «лесенкой»
::::::::::::::::::::::::::::::::::::::::::::::::::::: one two three :::::::::::::::::::::::::::::::::::::::::::::::::::::
- Вывод текста в формате DOS:
printf "one\r\ntwo\r\three\r\n\f" | lp -d <имя-принтера>
Любой принтер должен вывести три строки текста «столбиком»:
::::::::::::::::::::::::::::::::::::::::::::::::::::: one two three :::::::::::::::::::::::::::::::::::::::::::::::::::::
Решение:
Способ #1
Самый универсальный способ - установить на принтере и сохранить в энергонезависимой памяти (через меню или программу управления принтера) режим обработки концов строк:
CR=CR; LF=CR-LF; FF=CR-FF
При таком режиме строки, оканчивающиеся на одиночный символ LF, будут дополнены необходимым символом CR. В этом случае любые тексты (как в DOS-формате, так и в UNIX-формате) будут всегда нормально распечатываться (не только из БИСквита). Этот вариант нисколько не мешает нормально распечатывать файлы из DOS/Windows.
Способ #2
Перед печатью переводить текст из формата UNIX в формат DOS. Это реализуемо следующими способами:
- Утилиты типа unix2dos, например:
unix2dos <unix-file | lp ...
Это не очень удобный и плохо переносимый способ. Также не подходит для бинарных файлов (графика).
- Принтеры могут быть заведены в UNIX с использованием фильтрования.
Фильтр для PCL, помимо прочего, как раз и делает
прозрачное преобразование unix2dos. В таком режиме удобно печатать произвольные текстовые файлы из UNIX.
Однако, при этом бинарные файлы («графические» формы БИСквита) могут искажаться. Поэтому такой способ не подходит для печати графики и не рекомендуется.
Конфигурация UNIX-принтера в RAW-режиме отключает фильтрование.
Способ #3
Инициализировать принтер в режиме LF=CR+LF при каждой печати.
Для этого стандартные шаблоны настроек принтеров PCL, доступные на:
http://support.bis.ru/info/misc/index.php?id=printer
содержат в поле «Инициализация» строку:
"\e&k2G"
Всего возможны такие режимы:
\e & k # G # = 0 - CR=CR; LF=LF; FF=FF 1 - CR=CR-LF; LF=LF; FF=FF 2 - CR=CR; LF=CR-LF; FF=CR-FF 3 - CR=CR-LF; LF=CR-LF; FF=CR-FF Default = 0 Range = 0-3
Способы #1 и #3 (и даже #2) не мешают друг другу при совместном использовании. Рекомендуется использовать способ #3. Для этого можно загрузить стандартные шаблоны настроек принтеров или модифицировать свои. При желании и возможности, для удобства, в дополнение к способу #3, можно реализовать также способ #1.
Документация:
- «Настройки принтеров для работы с БИСквитом»
http://support.bis.ru/info/misc/index.php?id=printer
- PCL 5 Printer Language Technical Reference Manual
См. также:
raw-gni.txt raw-ff.txt