1

ESC POS 言語を使用してサーマル プリンターでチケットを印刷できるアプリがあります。私が現在使用しているコードは次のとおりです。

       /* <-40char-> */
                    Socket sock = new Socket(Impresora.getImpresora_Tickets().getIp(), Impresora.getImpresora_Tickets().getPuerto());
                    OutputStreamWriter osw = new OutputStreamWriter(sock.getOutputStream(), Charset.forName("CP1252"));
                    PrintWriter oStream = new PrintWriter(osw);

       /*Start*/
                    for(int i = 0; i<Impresora.getImpresora_Tickets().getInic().size(); i++)
                        oStream.print(Impresora.getImpresora_Tickets().getInic().get(i));

       /*Set Font Size*/
                    for(int i = 0; i<Impresora.getImpresora_Tickets().getLetra4().size(); i++)
                            oStream.print(Impresora.getImpresora_Tickets().getLetra4().get(i));

       oStream.println("HELLO WORLD");

そして、それはうまくいきます。問題は、タブレットでユーザーの署名を取得していて、それをチケットの最後に印刷したいということです。ビットマップ オブジェクトとして持っていますが、プリンターに送信する方法がわかりません。誰かが私を助けることができますか?ありがとう!

編集1:

何かをしようとしているのですが、うまくいかないと思います...

/**
* Redimensionar imagen
*/
Bitmap firma = Current_Mesa.getT().getFirma_credito();
firma = Bitmap.createScaledBitmap(firma, 255, 64, false);

/**
* Print imagen
*/
ByteArrayOutputStream stream = new ByteArrayOutputStream();
firma.compress(CompressFormat.JPEG, 70, stream);
byte[] firma_bytes = stream.toByteArray();

byte[] SELECT_BIT_IMAGE_MODE = {0x1B, 0x2A, 33};
byte[] SET_LINE_SPACE_24 = {0x1B, 0x33, 24};
byte[] PRINT_AND_FEED_PAPER = new byte[]{0x0A};

for(byte b : SELECT_BIT_IMAGE_MODE)
oStream.print((char)b);

for(byte b : SET_LINE_SPACE_24)
oStream.print((char)b);

for(int i = 0; i < firma_bytes.length; i+=8)
{
    for(int plus = 0; plus < 8; plus++)
    oStream.print(firma_bytes[i+plus]);

    for(byte b : PRINT_AND_FEED_PAPER)
        oStream.print((char)b);
}
4

1 に答える 1

1

以前に C++ でこのタスクを完了しましたが、簡単ではありません。画像へのピクセルごとのアクセスを取得する必要があります (ビットマップがある場合は簡単なはずです)。

次に、イメージを 8 ピクセルの水平バンドに分割し、8 ピクセルの各列を表す文字を取得する必要があります (ビットごとの OR を使用)。POS のドキュメントには、この方法を使用して 1 行のグラフィックスを印刷する方法が記載されています。

これはどれも非常に難しいことではありませんが、すべての画像サイズと形状に完全に合わせるには少し手間がかかりました.

より詳細な説明: プリンターは画像を 8 ピクセルの垂直バンドで左から右に印刷できます。つまり、最初に画像の上部 8 ピクセルを印刷し、次に用紙をスクロールして次の 8 ピクセル行を印刷します。したがって、次のようにします。

画像を上から下に移動し、8 ピクセルの高いバンドに分割します。各バンドについて:

プリンターを「グラフィック モード」にする ESC POS シーケンスを送信します。イメージ バンドを左から右にループします。バンド内の 8 ピクセルの列ごとに:

ピクセルのビット値を上から下に計算します。これを IsPixelBlack(0)*1+IsPixelBlack(1)*2+IsPixelBlack(2)*4+...+IsPixelBlack(7)*128 のような単純なバイト値に変換します。x列のピクセルは黒または 0 です。次に、このバイト値を文字としてプリンターに送信します。

したがって、印刷されるデータの 1 バンドの文字列として表現される 8 ピクセル列ごとに 1 文字を送信することになります。

また、エプソンには ESC/POS デバイス用の Android SDK があると思いました。使ったことはありませんが、無料で使えると思います。

于 2015-06-23T12:11:31.290 に答える