ESC/P Установить абсолютную горизонтальную позицию печати

У меня проблемы с настройкой горизонтальной позиции печати в матричном принтере Epson LX-300 II. Команда для установки горизонтальной позиции печати иногда не работает.

Мне нужно это, чтобы выровнять данные для печати в соответствующем столбце в предварительно напечатанной бумажной форме.

Учитывая следующий код:

        // row 1
        escp.setAbsoluteHorizontalPosition(1);
        escp.print("Equipment");
        escp.setAbsoluteHorizontalPosition(10);
        escp.print("Serial");
        escp.setAbsoluteHorizontalPosition(13);
        escp.print("Remarks");

        // row 2
        escp.lineFeed();
        escp.setAbsoluteHorizontalPosition(1);
        escp.print("Equipment");
        escp.setAbsoluteHorizontalPosition(10);
        escp.print("Serial");
        escp.setAbsoluteHorizontalPosition(13);
        escp.print("Remarks");

Это ожидаемый результат:

Equipment                  Serial     Remarks
Equipment                  Serial     Remarks

Тем не менее, это фактический вывод на печать:

EquipmentSerial                        Remarks
EquipmentSerial                        Remarks

Я не могу понять, почему "Серийный номер" не напечатан в правильном положении.

Чтобы попытаться это выяснить, я создал тестовую программу, которая печатает "х" на расстоянии 1 см в одну строку.

Вот пример кода из тестовой программы:

    ESCPrinter escp = new ESCPrinter(sharedPrinterName, false);
    if((escp.initialize()) == false) {
        return;
    }
    escp.select10CPI();
    escp.set8LPI();
    escp.setCharacterSet(ESCPrinter.USA);                
    for(int x = 1; x < 15; x++) {
        escp.setAbsoluteHorizontalPosition(x);
        escp.print("x");
    }
    escp.formFeed();
    escp.close();

Ожидаемый результат:

x    x    x    x    x    x    x    x    x    x    x    x    x    x

Фактический вывод:

x    x    x    x    xxxxxx                    x    x    x    x

Это справочное руководство Epson ESC/P, и это сторонний код, который я использую для отправки команд принтера, который я немного изменил для реализации метода set8LPI().

В справочном руководстве команда для установки абсолютной горизонтальной позиции печати находится в C-31.

Я пытался понять это сам в течение нескольких дней, но я не приблизился к поиску решения.

Дополнительная информация

Я сделал еще одну тестовую программу, которая печатает тестовые данные с позиций от 0,0 см до 19,8 см с шагом 0,2 см и переводом строки между ними.

Данные теста, которые я напечатал, также являются абсолютной горизонтальной позицией, которую я указал (для облегчения идентификации).

Было бы непрактично показывать вам точную печатную информацию, поэтому я просто опишу их как можно лучше.

Установка горизонтального положения от 0.0 до 5.4, кажется, работает, с выводом, похожим на это:

0.0
 0.2
  0.3
   0.4
   .
   .
   .
   -------->  5.4

После этого установка абсолютного горизонтального положения на 5,6 см до 10,8 см игнорируется. Принтер просто печатает на самой левой части бумаги.

Команда "Установить абсолютное горизонтальное положение" снова работает для 11.0 см до 16.2 см. Игнорируется снова для 16.4cm до 19.8cm.

Как я понимаю справочное руководство по ESC / P, которое я связал выше, принтер игнорирует эту команду, когда указанная позиция находится за правым полем. Больше ничего не указано.

Очевидно, что мои ценности все в пределах.

Итак, это может быть аппаратная проблема с принтером?

-> Не аппаратная проблема. Я получил те же результаты, используя другой принтер.

Обновить

Дана команда для установки абсолютного горизонтального положения: ESC $ nl nh

Я сделал другую тестовую программу, где я непосредственно вводил параметры nh и nl.

Я понял, что эта команда игнорируется всякий раз, когда значение nl превышает 127.

Я нахожу это удивительным, поскольку в справочном руководстве указано, что максимальное значение для nl составляет 255.

Этот вывод согласуется с первой тестовой программой, в которой я вводил горизонтальное положение в сантиметрах. Когда я конвертирую сантиметры в соответствующие значения nh и nl для игнорируемых команд, результирующие значения nl превышают 127.

1 ответ

ESC/P Установить абсолютную горизонтальную позицию печати

Исходя из данного стороннего Java-кода в ESCPrinter.java, подход к отправке управляющего кода ESC/P на порт принтера ждет катастрофы. Для вашего случая, когда значение больше 7-битных данных (127 / 0x7F).

Дана команда для установки абсолютного горизонтального положения:

ESC $ nL nH
nL value: 0 <= nL < 256

Когда значение nL превышает 127, значение преобразуется неправильно и отправляется на порт принтера. Неправильное преобразование вызвано классом PrintStream(), который будет вызывать кодировку кодировки по умолчанию в зависимости от языкового стандарта вашей системы (внутренне создайте класс java.io.Writer ()). Вот почему значение nL никогда не отправляется правильно на порт принтера.

Чтобы решить эту проблему, вы никогда не должны пытаться использовать класс String() или любой другой связанный с кодировкой charset класс для записи управляющего кода (например,.toString(), .toByteArray(charset), Writer).

Вы можете попробовать кодировку UTF-8 для PrintStream(), чтобы увидеть, исправляет ли она ошибку или нет.

Проблема, которую я обнаружил, заключается в том, что UTF-8 является многобайтовой кодировкой, а ESC-P требует, чтобы команды были в одном байте, от 0 до 256.

ISO-8859-1 - это однобайтовая кодировка до 256.

Байт Java является десятичным числом от дополнения со знаком 2, поэтому числа более 127 отрицательны.

public byte getN1(int total) {

    // a java byte can only be -127 > 127
    // so the negative numbers represent the numbers greater than 127

    int n1 = total % 256;
    if (n1 > 127) {
        n1 = n1 - 256;
    }
    return (byte) n1;
}

public byte getN2(int total) {

    // N2 is a factor of 256. so it is multiplied by 265 and added to N1.
    // generally it is either 1 or 0 but can be more for things like vertical
    // position.

    int n2 = total / 256;
    return (byte) n2;
}



public String setAbsoluteHorizontalPosition(int dots) throws UnsupportedEncodingException {

    byte[] x = { ESC, '$', this.getN1(dots), this.getN2(dots) };
    return new String(x, "ISO-8859-1");
}
Другие вопросы по тегам