DevTerm:レシート印刷

Twitter で見かけたレシート記述言語が気になりました!

おおお、DevTermのプリンタからレシート印刷してみたい!

レシート記述言語 ReceiptLine
https://www.ofsc.or.jp/receiptline_/

プログラムや資料は、こちらで公開されていました。node.js で動作するようですね。


ということで、DevTerm に node.js をインストール。node.js インストールはこちらを参考にしました。

Raspberry Pi でWebサーバを立てよう【Node.js】
https://it-evo.jp/blog/blog-813/

sudo apt install -y nodejs npm

最新版にする必要はないので、Nodeのバージョン管理パッケージ「n」は使ってないです。

適当な作業フォルダ作った後、ReceiptLine gitHub の Installtion に従って

npm install receiptline

でインストールします。


プリンタからレシートを印刷するためには、プリンタが ESC/POS か、Star 系POSコマンドに対応していなければいけないようでした。そりゃまあ、レシート印刷用のアプリですもんね。

でも、ReceiptLine には、プリンタに印刷するだけでなく、SVG画像ファイルとして出力できる機能がありました!やったー!

SVG画像ファイルを生成して、PNG ファイルに変換、それを印刷する方法やってみます。

// display example
const display = {
cpl: 42,
encoding: 'multilingual'
};
const svg = receiptline.transform(doc, display);

これで、SVG ファイルが作成できますので、

console.log(svg);

で標準出力に吐き出すようにします。

gitHub の example を参考にして、テスト出力スクリプト書いてみました。ファイル名 testEn.js で保存しておきます。

const receiptline = require('receiptline');

// ReceiptLine
const text = `|                      ~~New Order~~|
{image:iVBORw0KGgoAAAANSUhEUgAAAIAAAABAAQMAAADoGO08AAAABlBMVEUAAAD///+l2Z/dAAAAaUlEQVQ4y2P4jwYYRgUGh8AHBgY7BgbmAwwMFQwM/ECBBwwMMkCBBgaGAlwC///IyP//3/z//4d6sBlECwDNQBIAmgYyFEXgALoA0IgCFDPwCQBdChQ4gOJ0FAGQbyECPyACo8lhSAgAACgAlSKnht6nAAAAAElFTkSuQmCC}
|Table |    A05|Order #    |  0003-01|
|Time  |  19:00|Party Size |        2|
{width:3,*,4,9; border:line}
--------------------------------------
|     |    ITEM     | QTY |  AMOUNT  |
--------------------------------------
|^^[ ]|^^BEER       | ^^^2|   ^^13.00|
|^^[ ]|^^CHIDORI    | ^^^2|  ^^172.80|
--------------------------------------
{width:14,18; align:right}
       |    SUBTOTAL    |      185.80|
       | SERVICE CHARGE |        0.00|
       -------------------------------
       | ^^^TOTAL |         ^^^185.80|
       -------------------------------
{width:*; border:none; align:center}
{code:0003; option:code39,48}`;

const svg = receiptline.transform(text, { cpl: 60, encoding: 'multilingual', spacing: true });

console.log(svg);

標準出力先のプリンタを指定しておきます。

export LPDEST=devterm_printer

印刷は、Inkscape を使って、こういう感じでいけました!生成された PNG が横向きになるっぽいので、プリンタで回転させています。

node testEn.js |inkscape -p --export-type="png" -o - | lpr -o orientation-requested=3

おおっ、いいかんじ!!

日本語は、ちょっと詰まってしまいます。SVG ファイルの時点からこういう感じみたいなので、最初のレシートSVG生成の時に何か設定が必要なのかもしれないです。正しく変換して出力できてるのでOK!

印刷が少々つぶれてるので厳しいかと思ったけど、スマホのコードリーダでバーコードも読めました。

スクリプトで書いたとおりに

{code:0003; option:code39,48}`;

読めてます!

Inkscape での変換時にいくつかエラー出てるのですけれど、変換できてるのでひとまずスルーで…。


Inkscape、本来はGUIのドローツールなので、コマンドラインで画像変換だけに使うにはちょっとオーバースペックではあります。

Inkscape
https://ja.wikipedia.org/wiki/Inkscape

最初は、ImageMagik の convert や rsvg-convert で変換してみてたのですが、こちらだと変換で文字が寄ってしまう現象が発生してしまうのですよね…。