Проблема: При печати строки текста съезжают "лесенкой"

Условия:

Со стороны сервера:

  • любые ОС.
  • характерно для очередей печати, сконфигурированных в 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