1

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

「Serial」が正しい位置に印刷されない理由がわかりません。

これを理解するために、「x」を 1cm 間隔で 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 Reference Manualです。これは、set8LPI() メソッドを実装するために少し変更したプリンター コマンドの送信に使用しているサードパーティ コードです。

リファレンス マニュアルでは、絶対水平印刷位置を設定するコマンドは C-31 にあります。

私はこれを数日間自分で理解しようとしましたが、解決策を見つけることに近づいていません.

追加情報

テスト データを 0.0cm から 19.8cm の位置まで 0.2cm 間隔で改行して印刷する別のテスト プログラムを作成しました。

印刷したテスト データは、指定した絶対水平位置でもあります (識別しやすくするため)。

正確な印刷出力を示すことは実際的ではないため、できる限り説明します。

水平位置を 5.4 まで 0.0 に設定すると、出力は次のようになります。

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

その後、10.8cm まで絶対水平位置を 5.6cm に設定しても無視されます。プリンターは、用紙の一番左の部分にのみ印刷します。

「絶対水平位置の設定」コマンドは、11.0cm から 16.2cm まで再び機能します。16.4cmから19.8cmまでまた無視。

上でリンクした ESC/P リファレンス マニュアルを理解しているので、指定された位置が右マージンを超えている場合、プリンターはこのコマンドを無視します。他には何も指定されていません。

明らかに、私の値はすべてマージン内です。

では、これはプリンターのハードウェアの問題でしょうか?

--> ハードウェアの問題ではありません。別のプリンターを使用しても同じ結果が得られました。

アップデート

絶対水平位置を設定するコマンドが与えられた場合: ESC $ nl nh

nh および nl パラメータを直接入力する別のテスト プログラムを作成しました。

nl 値が 127 を超えると、このコマンドが無視されることに気付きました。

リファレンス マニュアルでは nl の最大値が 255 であることが示されているため、これは驚くべきことです。

この結果は、水平位置をセンチメートル単位で入力した最初のテスト プログラムと一致しています。無視されるコマンドの対応する nh 値と nl 値にセンチメートルを変換すると、結果の nl 値は 127 より大きくなります。

4

2 に答える 2

1

ESC/P 絶対水平印刷位置の設定

ESCPrinter.java の指定されたサード パーティの Java コードから、ESC/P 制御コードをプリンター ポートに送信するアプローチは、災害を待っています。あなたの場合、値が7ビットデータ(127 / 0x7F)より大きい場合。

絶対水平位置を設定するコマンドが与えられた場合:

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

nL 値が 127 を超えると、値が正しく変換されず、プリンター ポートに送信されます。誤った変換は、システム ロケールに基づいてデフォルトの文字セット エンコーディングを呼び出す PrintStream() クラスが原因で発生します (内部的に java.io.Writer() クラスを作成します)。これが、値 nL がプリンター ポートに正しく送信されない理由です。

この問題を解決するには、String() クラスまたはその他の文字セット エンコーディング関連のクラスを使用して制御コードを記述しないでください (例: .toString()、.toByteArray(charset)、Writer)。

PrintStream() の UTF-8 エンコーディングを試して、バグが修正されるかどうかを確認できます。

于 2014-11-10T15:29:42.543 に答える
0

私が見つけた問題は、UTF-8 はマルチバイト エンコーディングであり、ESC-P はコマンドを 0 ~ 256 の 1 バイトにする必要があることです。

ISO-8859-1 は、256 までのシングル バイト エンコーディングです。

Java バイトは符号付き 2 の補数からの 10 進数であるため、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");
}
于 2020-09-24T17:09:47.417 に答える