====== Проблема: При печати строки текста съезжают "лесенкой" ====== ===== Условия: ===== __Со стороны сервера:__ * любые ОС. * характерно для очередей печати, сконфигурированных в **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