📑

receiptlineをラズパイとHonoで扱う

2024/05/06に公開

receiptlineとは?

OSFCが作成しているレシート記述言語です。ほぼマークダウンに近い書き心地でレシートを記述できます。素晴らしいです。
honoといったフレームワークで扱う際は、receiptlineではなくreceiptioを使ったほうが使いやすいと思います。

https://github.com/receiptline/receiptline

https://github.com/receiptline/receiptio

試してみたい方はこちら。

https://www.ofsc.or.jp/receiptline_/designer/index.html

ラズパイへのhonoとreceiptlineのインストール

nvm → pnpm → hono → receiptio の流れでインストールしていきます。

nvmのインストール

https://github.com/nvm-sh/nvm

こちらに沿ってインストールします。
NVMのインストール

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

パスの設定

export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm

nodeのインストール(最新のLTSを入れる場合)

nvm install --lts

pnpmのインストール

https://pnpm.io/ja/installation

npm install -g pnpm

honoの設定

今回はprinter-appというディレクトリにhonoを構成していきます。

pnpm create hono printer-app
cd printer-app

receiptioのインストール

pnpm add receiptio

lpグループにユーザーを入れます。

sudo gpasswd -a USER lp

再起動します。

sudo reboot

これでラズパイで使う準備が整いました。

最後にindex.tsを編集する。

./printer-app/src/index.tsを下記のように編集していきます。
今回は3000ポートで待ち受けをし、
POSTされたreceiptlineをUSB接続したサーマルプリンターで印刷するように設定しています。
corsの設定などはよしなにしていきます。

server.ts
import { serve } from '@hono/node-server'
import { Hono } from 'hono'
import { cors } from 'hono/cors'
import * as receiptIo from 'receiptio'

const app = new Hono()
app.use(cors());
app.post('/print',async(c)=>{
 
  const {markdown} =await c.req.json()
  console.log(markdown);
  receiptIo.print(markdown,'-d /dev/usb/lp0 -l ja -p -c 42');
  return c.text('Printed!')
})

const port = 3000
console.log(`Server is running on port ${port}`)

serve({
  fetch: app.fetch,
  port
})

後はpackage.jsonに以下の通りstartを追記します。

package.json

{
  "scripts": {
    "dev": "tsx watch src/index.ts",
+    "start": "tsx src/index.ts"
  },
  "dependencies": {
    "@hono/node-server": "^1.11.1",
    "hono": "^4.3.1",
    "receiptio": "^1.9.0"
  },
  "devDependencies": {
    "@types/node": "^20.11.17",
    "tsx": "^4.7.1"
  }
}

最後にpnpm startするとPOSTされたreceiptlineがそのまま印刷されるようになると思います。

デーモンで起動するには

pm2をインストールします。

npm install pm2 -g

必ずnpmでインストールする。
そして起動します。

pm2 --name printer-app start npm -- start

これでデーモン起動できると思います。

Discussion