@jun5952 (焼肉 店長)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

ESC/POS コマンド入力で領収書(横向き)を印字させたい

現状

Xamarin.Android (C#) にて、レシートプリンターに印字する部分を作成しています。

SDKなどを提供してもらえる有名メーカーさんのレシートプリンターは価格が高いため、
【ESC/POS 準拠】 の レシートプリンターで印字が出来ればと思っています。
(タブレット等からBluetooth接続)

幸いにも、サンプルソースなどを見つける事ができ、また本家の

■文字コード表
https://reference.epson-biz.com/modules/ref_charcode_ja/index.php?content_id=2

■コード順コマンド・リスト
https://reference.epson-biz.com/modules/ref_escpos_ja/index.php?content_id=72#commands

を参考にすることで、無事、縦に流れていくレシートは印刷できるようになりました。

IMG20220520233015 (1).jpg

解決したいこと(やりたい事)

領収書を印字したいのですが、レシートのように縦に流れるものではなく、

【横向き】に印字させたいのですが、方法がわからず困っています。

ESC/POS のコマンドを使って、横向き印字させる方法をご存知の方、参考になるサイトをご存知の方等いらっしゃいましたら、アドバイスをいただけると助かります。

↓↓↓↓ のように印字したい

IMG20220520233122 (1).jpg

印字部コード

例えば、プリンターを初期化する場合、

ESC/POS コマンドは、 【ESC @】のため、

文字コード表より変換すると、

ESC ⇒ 27
@ ⇒ 64

となるため、

// 初期化【ESC @】
writeByte(27);    // 27:ESC
writeByte(64);    // 64:@

private async Task writeByte(byte value)
{
    byte[] tempArray = { value };
    await _blueToothService.Print(deviceName, tempArray);
}


public async Task Print(string deviceName, byte[] buffer)
{
    using (BluetoothAdapter bluetoothAdapter = BluetoothAdapter.DefaultAdapter)
    {
        BluetoothDevice device = (from bd in bluetoothAdapter?.BondedDevices
            where bd?.Name == deviceName
            select bd).FirstOrDefault();
        try
        {
            using (BluetoothSocket bluetoothSocket = device?.
                CreateRfcommSocketToServiceRecord(
                    UUID.FromString("00001101-0000-1000-8000-00805f9b34fb")))
            {
                bluetoothSocket?.Connect();
                bluetoothSocket?.OutputStream.Write(buffer, 0, buffer.Length);
                bluetoothSocket.Close();
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}

のように記述しています。

自分で試したこと

コード順コマンド・リスト
https://reference.epson-biz.com/modules/ref_escpos_ja/index.php?content_id=72#commands

に記載されている中で横向き印字できそうなものを色々試してみましたが、
横向き印字できていない状況です。

以下のコマンドを実行しましたが、サーマルプリンターからは
何も出力されない状態です。

// プリンターの初期化
ESC @

// ページモード選択
ESC L

// ページモードにおける印字領域の設定
ESC W 140 0 118 0 104 1 16 2

// ページモードにおける文字の印字方向の選択: 始点=左下、展開方向=下→上
ESC T 1

// 印字したい文字
領収書

// ページモード一括印字
ESC FF

ESC L (ページモードの選択)
ESC T (ページモードにおける文字の印字方向の選択)
ESC W (ページモードにおける印字領域の設定)

あたりが色々と調べていると横向き印字に関係しそうなのですが、実現できていません。

~~~~~~~~~~~~~~~~~~~~~~~~

素人のため、レベルの低い質問、
また、質問のマナーに関して至らない点があれば申し訳ないです。

完全に行き詰っており、横向きでの印字を諦める前に質問させていただいております。

アドバイスいただけると本当に助かります。

よろしくお願い致します。

0 likes

2Answer

Comments

  1. @jun5952

    Questioner

    コメントありがとうございます。

    テストを行っているサーマルプリンターの実機をお借りしているメーカー様にも、
    同じ内容の質問をしてみました。

    横向き印刷は可能と回答をいただきましたが、
    残念ながらコードに関するアドバイスはいただけませんでした。

    代わりに
    領収書の画像データを作成して、画像を印字する方法を教えていただきました。

    あまりスマートな方法でない点と、
    画像の印字の処理も出力してみると、文字化けしてしまい簡単ではなさそうなため、
    引き続き横向き印字方法を調べていきたいと思います。
  2. @jun5952

    Questioner

    説明不足で申し訳ございません。
    質問本文に記載している

    ```
    // プリンターの初期化
    ESC @

    // ページモード選択
    ESC L

    // ページモードにおける印字領域の設定
    ESC W 140 0 118 0 104 1 16 2

    // ページモードにおける文字の印字方向の選択: 始点=左下、展開方向=下→上
    ESC T 1

    // 印字したい文字
    領収書

    // ページモード一括印字
    ESC FF

    ```

    の箇所は、ご指摘いただいたリンク先のプログラム例の中から必要と思われる箇所を
    抜き出し実行してみた箇所です。

    ドット密度の指定などプログラム例内にある内容は思いつく限り試しております。


    サンプル例をそのまま出力も試みましたが、文字化けしたものが出力されててしまい、
    サンプル内のどこの書き方が悪いのか全くわからない状態となってしまうため、
    必要箇所のみ抜き出して印字しようとしています。

    もちろん、私の書き方が悪く、上手く印字できていないわけなのですが、
    その原因がどうしてもわからない状態です。

    上手く説明できず申し訳ございません。
  3. まあ、何にしてもハード制御になると機種とコマンドの仕様書突き合せて
    試行錯誤するしかないんじゃないですかね。
    使用機種に対応してないコマンドを使ってるとかいう事はないですか?
    機種すら書いてないので、これ以上の事は第三者には判りませんが。

    > サンプル例をそのまま出力も試みましたが、文字化けしたものが出力されててしまい、
    > サンプル内のどこの書き方が悪いのか全くわからない状態となってしまうため、
    > 必要箇所のみ抜き出して印字しようとしています。
    >
    > もちろん、私の書き方が悪く、上手く印字できていないわけなのですが、
    > その原因がどうしてもわからない状態です。

    サンプルそのままでも文字化けするなら、書き方の問題とは関係ない気がしますけど。
    サンプルコードが動作しない、どのように出力されるかなど、現在の状況と合わせて、メーカーに詳しく伝えるべきです。
  4. @jun5952

    Questioner

    > 使用機種に対応してないコマンドを使ってるとかいう事はないですか?

    ESC/POS 準拠 という記載があるのみで、コマンドの内容はEPSONさん本家のサイトや、他の情報を掲載してくれているサイトさん頼みです。

    日本語が表示できないなどの機種特有の問題はWEB上でいくつか見つけました。
    (日本語の設定をしっかりしているかは不明)

    今回お借りしているサーマルプリンターでは日本語の出力は問題なくできています。

    横向き表示自体の情報をEPSONさんのサンプルソースの箇所以外で見つける事が出来ず、
    横向き表示に関して、機種的な実装の可否があるのかは不明です。

    ただ、基本的には特有のドライバーを使わず共通の仕様で印字できるESC/POSのコマンドの特性上、接続に関する記述、印字幅、ドット密度など機器特有の設定以外は共通の記述で問題ないという認識で作業を行っています。

    この認識が間違っていると、出来ない事をやろうとしている無意味な作業をやっている事になってしまいますが・・・



    > 現在の状況と合わせて、メーカーに詳しく伝えるべきです

    状況を伝え、助けを求めてはみたのですが、具体的なアドバイスをいただくのは難しいのかもしれません。

    ご厚意で、デモ機をお借りしておりますし、経験の浅い私が開発しており、
    何百台と機器を購入する予定もないため、なかなか強くは聞けない状況です。

    プリンターは、同等の性能のものを他メーカーで購入しようとすると2,3倍以上の値段がするため、価格的には大変魅力的なのですが、有名なPOSサービスなどにおいて、今回試している会社さんの端末に対応しているというサービスは見た事がないため、開発に手間がかかるなどの問題などもあるのかもしれません。


    まだ機器をお借りしている状況で、機器の購入もしていないため、
    今回使っているデモ機の機種に関しては、万が一迷惑がかかってはいけないため、非公開とさせていただきます。



    1週間以上はまっており、
    Xamarinに対応したSDKを公開している他メーカーさんのプリンターでは横向き出力ができているため、今回は縦向き領収書で一旦代用したいと思います。



    今後、十数台の購入予定があり、価格の魅力は捨てきれないため、
    また時間のある時に再挑戦してみたいと思います。


    色々とアドバイスいただき、本当にありがとうございました。

画像の印字の処理も出力してみると、文字化けしてしまい

文字列を画像にした時点で文字化けしていたら、プリンタにはぜんぜん関係ない話ですね。

サンプル例をそのまま出力も試みましたが、文字化けしたものが出力されててしまい

「出力されるのはでたらめな文字列だけ」なのか「ASCII文字は正しく印字されるが日本語文字は文字化け」かでまったく違う話になります。
前者なら横向き印字自体がうまくいってないけど、後者ならエンコーディングの問題だったり横向きモードは日本語に対応していないことも考えられます。

ひとまず「横向き印字」と「文字化け」は別の問題と考えて、引っかかっているのはどちらなのか特定した方がいいのではないでしょうか。
「組み合わせた場合だけおかしい」も十分ありえますが、「画像出力で文字化け」とのことなのでまずはエンコーディング関係を疑ってみた方がよさそうです。

0Like

Your answer might help someone💌