ある日のことでした
ふと思いました。
家にレシートプリンタがあったら楽しいだろうな。
さらに思いました。
ブラウザで見ているページや選択した文章を、右クリックでそのまま印刷できたら最高だろうな。
この時点で「何を言っているんだ、こいつは」と思った方は正常です。今すぐこの記事を読むのをやめてください。
【やめる】 【読む】
中古の業務用レシートプリンタを家庭内LANへ接続し、Chromeの右クリックメニューから印刷できるようにします。
- ページタイトル
- 選択した文章
- 元ページを開くためのQRコード
買い物メモ、料理の材料、家族への伝言などが「ジジジッ」と爆速で紙になって出てきます。インクジェットプリンタのスピードなど、目じゃありません。
機種選定、プログラム、Chrome拡張、Linuxサーバーの構築は、すべて生成AIに相談しながら進めました。
完成するとこうなる
ブラウザで文章を選択し、右クリックします。
「レシートに印刷」を選ぶと、家庭内のレシートプリンタから次のような紙が出てきます。
スマートフォンのメモでも、普通のプリンタのA4用紙でもなく、細長いレシートとして出てくる。ただそれだけのことが、妙に楽しいです。
紙になった瞬間、ただのメモが「秘密指令」のように見えてきます。
今回使ったもの
| 項目 | 使用したもの |
|---|---|
| レシートプリンタ | EPSON TM-T88V(LANモデル) |
| 用紙 | 80mm感熱ロール紙 |
| サーバー | Proxmox上のDebian LXC |
| 印刷サーバー | Pythonで作成した小さなWeb API |
| ブラウザ連携 | Chrome拡張(Manifest V3) |
| 開発支援 | 生成AI |
| プリンタ購入価格 | 約1,000円 |
構成は次のようになります。
Chrome拡張からプリンタへ直接送るのではなく、間に小さな印刷サーバーを置きました。
こうしておくと、将来はスマートフォン、Home Assistant、Slack、レシピ管理サーバーなどからも同じプリンタを使えます。
レシートプリンタを仕入れる
LANへ直接接続できる業務用レシートプリンタは、中古市場にかなり流れています。飲食店や小売店で大量に導入され、システム更新時にまとめて放出されるのでしょう。某オークションサイトを探したところ、EPSONのTM-T88Vを発見しました。
出品価格は1,000円、入札ライバルなし。送料などを含めても、5,000円札でたっぷりお釣りが来ます。
買いましょう。買いました。
購入時は、最低限次を確認すると安心です。
- LANインターフェース搭載モデルである
- ACアダプターが付属する
- 80mm用紙モデルである
- カッター不良や印字不良の記載がない
- できればESC/POS対応モデルだと情報が多い
同じTM-T88Vでも、USB、シリアル、LANなどインターフェース違いがあります。
家庭内サーバーから使うなら、LANモデルが圧倒的に楽です。
クリームクレンザーで磨く
届いたプリンタは、いかにも「長年レジ横で働いてきました」という外観でした。業務用中古機なので当然です。
ぼろ布を固く水絞りし、少量のクリームクレンザーを付けて外装を磨きます。しばらく磨くと、かなりきれいになりました。この時点ですでに楽しく、1,000円分のもとを取った気分です。中古の業務機がきれいになると、急に「自宅設備の一員」という愛着もわきます。
初期化してLANへ接続する
本体を初期化し、DHCPでIPアドレスを取得させます。
プリンタの電源を切り、小さなボタンをクリップなどで押しながら電源を入れると、設定情報を印刷できる機種が多いです。詳しくは、AIに聞きましょう。すぐ教えてくれます。
印刷された紙から、次の情報を確認します。
- MACアドレス
- 現在のIPアドレス
- DHCPの有効・無効
- インターフェース情報
今回はDHCPでアドレスを取得させたあと、ルーター側でDHCP予約を設定しました。
例として、プリンタのアドレスを次のように固定します。
192.168.0.55
IPアドレスは、プリンタ本体へ固定値を書き込むより、DHCPサーバー側で予約するほうが管理しやすいと思います。
テスト印刷してみる
多くのLAN対応レシートプリンタは、TCPの9100番ポートへ印刷データを送ると動作します。
まずポートが開いているか確認します。
nc -vz 192.168.0.55 9100
接続できたら、ASCII文字で簡単な印刷テストをします。
printf '\x1b@HELLO WORLD!\n\n\n\x1dV\x00' \
| nc -N 192.168.0.55 9100
printf:後ろに書いた文字や制御コードを出力するコマンド
|:その出力を、右側のコマンドへ渡す
nc:受け取ったデータを、LAN経由でプリンタへ送る
つまり全体では、
printfで印刷データを作り、ncでレシートプリンタへ送る
というコマンドです。このコマンドは、次の内容をプリンタへ送っています。
\x1b@:プリンタを初期化する命令
HELLO WORLD!:実際に印刷する文字
\n\n\n:3行分、紙を送る
\x1dV\x00:印刷した紙をカットする命令
nc -N 192.168.0.55 9100:これらをプリンタへネットワーク経由で送る
コマンドを実行すると、プリンタが動きました。
HELLO WORLD!
業務用なので、印刷は一瞬です。そして最後に「シャキン」と紙が切れました。
自分が送った数バイトのデータによって、業務用プリンタが音を立てて紙を吐き出す。
この時点で楽しさ倍増、1,000円の倍は元を取った気分です。
日本語とQRコードは画像として印刷する
単純な文字送信だけでも印刷できますが、日本語には少し問題があります。
レシートプリンタ本体が持っている文字コードや内蔵フォントへ合わせる必要があり、機種依存が大きいからです。
そこで今回は、次の方法にしました。
- サーバー側で文字を画像へ描画する
- QRコードも同じ画像へ配置する
- 完成した画像を白黒へ変換する
- ESC/POSのラスターデータとしてプリンタへ送る
この方式なら、日本語フォントの種類や文字サイズ、改行、中央揃えなどをサーバー側で制御できます。
TM-T88Vの80mmモデルは横方向576ドットですが、端まで使うと環境によって見切れることがありました。
最終的には左右に少し余白を取り、有効幅を536ドットとして使っています。
この「仕様上は入るはずなのに、実機では少し切れる」という調整も、中古業務機遊びの味わいです。
Proxmoxに印刷サーバーを作る
今回はProxmox上に、印刷専用の小さなDebian LXCコンテナを作りました。
大げさな性能は必要ありません。
- 1 vCPU
- メモリ512MB~1GB
- ディスク数GB
- Debian
- Python
- 日本語フォント
- Pillow
- QRコード生成ライブラリ
これで十分です。
プリンタへ直接届く家庭内LANに接続し、Web APIを80番ポートで公開します。
生成AIには、次のように依頼しました。
Debian上で動く、家庭内LAN専用のレシート印刷Web APIを作ってください。
プリンタはEPSON TM-T88VのLANモデルです。
IPアドレスは192.168.0.55、TCP 9100番ポートへ送信します。
POSTされたJSONから以下を受け取ってください。
- header: 見出し
- body: 本文
- url: QRコードにするURL
要件:
- 日本語はNoto Sans CJK JPで画像化する
- 用紙幅は80mm、画像幅は536ドット
- 見出しは太字で大きくする
- 本文は自動改行する
- URLがあれば縦横比を変えずにQRコードを付ける
- 最後に紙送りしてカットする
- /healthで死活確認できる
- systemdで自動起動する
- ログをjournalctlで確認できる
- インターネットには公開しない
- 必要なファイルと、貼り付けるだけの構築コマンドを順番に提示する
ポイントは、単に「印刷サーバーを作って」と頼むのではなく、入出力と完成条件を具体的に書くことです。
特に次の条件を先に決めておくと、AIとの往復が少なくなります。
- プリンタの機種
- 接続方法
- 印刷幅
- 受け取るデータ形式
- 日本語の扱い
- QRコードの有無
- 自動起動
- エラー確認方法
完成したAPIへ、まず手動でテスト送信します。
curl -X POST http://receipt-server/print \
-H 'Content-Type: application/json' \
-d '{
"header": "家庭内レシートプリンタ",
"body": "印刷テストに成功しました。",
"url": "https://example.com/"
}'
日本語の見出し、本文、QRコードが印刷されれば、サーバー側は完成です。
Chrome拡張を作る
次は、ブラウザの右クリックメニューから印刷できるようにします。
今回の動作は単純です。
- Webページ上で文章を選択する
- 右クリックする
- 「レシートに印刷」を選ぶ
- Chrome拡張が印刷サーバーへJSONを送る
送信内容は次のようにしました。
| 印刷項目 | ブラウザから取得する内容 |
|---|---|
| ヘッダー | ページタイトル |
| 本文 | 選択した文章 |
| QRコード | 現在のページURL |
生成AIへの依頼は、次のようにしました。
Chrome Manifest V3対応の拡張機能を作ってください。
Webページで文章を選択して右クリックすると、
「レシートに印刷」というメニューを表示します。
選択されたら、家庭内の印刷サーバーへPOSTしてください。
送信先:
http://receipt-server/print
JSON:
{
"header": ページタイトル,
"body": 選択中の文章,
"url": 現在のページURL
}
要件:
- Manifest V3を使う
- contextMenus APIを使う
- service workerからfetchする
- 家庭内HTTPサーバーへのhost_permissionsを設定する
- 印刷成功と失敗を通知する
- 拡張機能の全ファイルを提示する
- Chromeへの読み込み方も説明する
生成された拡張機能をフォルダーへ保存し、Chromeで次の画面を開きます。
chrome://extensions/
「デベロッパーモード」を有効にして、「パッケージ化されていない拡張機能を読み込む」を選びます。
作成したフォルダーを指定すると、右クリックメニューに「レシートに印刷」が追加されました。
最初の実用印刷
ブラウザでレシピを開き、材料欄を選択します。
右クリックして「レシートに印刷」。
プリンタが動き出します。
鶏もも肉のソテー
鶏もも肉 2枚
長ねぎ 1/2本
しょうゆ 大さじ2
酢 大さじ1
[元ページのQRコード]
台所へ持っていけば買い物メモになります。
QRコードをスマートフォンで読めば、元のレシピもすぐ開けます。
単なるWebページだった情報が、手のひらサイズの物体になりました。
これは、かなり楽しいです。
使い道を考える
一度、家庭内のどこからでも印刷できるようになると、用途はどんどん増えます。
- 買い物リスト
- レシピの材料
- 今日の献立
- 家族への伝言
- 宅配便の発送メモ
- Wi-Fi接続用QRコード
- あとで読むWebページ
- 家事のお願いカード
- 服薬メモ
- 「冷蔵庫にプリンがあります。1人1個」という家庭内速報
何を印刷しても、レシートの形になるだけで妙に業務感が出ます。
家族への伝言も、普通の付箋ではなく「正式に発券された案件」に見えてきます。
AIを使って便利だったこと
今回、AIにコードを書かせたこと自体よりも、実機で起きた問題を一つずつ相談できたことが役立ちました。
たとえば、次のような調整です。
- 日本語が文字化けする
- QRコードが小さすぎる
- 右端が少し切れる
- 本文が長いと用紙幅を超える
- Chrome拡張からHTTPへ接続できない
- OS再起動後にサーバーが起動しない
- 印刷に失敗しても理由が分からない
エラーメッセージ、設定ファイル、印刷結果の写真をAIへ渡し、次の一手だけを出してもらいました。
特に実機を扱う場合は、最初から巨大な完成コードを作らせるより、
- プリンタとの疎通確認
- 英数字の印刷
- 日本語の画像印刷
- QRコード
- Web API
- Chrome拡張
- 自動起動
という順番で、動作確認を積み上げるほうがうまくいきます。
セキュリティ上の注意
今回の印刷サーバーは家庭内LAN専用です。
インターネットへ公開してはいけません。
公開すると、知らない誰かから延々とレシートを印刷される可能性があります。技術的には少し面白いですが、感熱紙代と家族の信頼を失います。
最低限、次の対策を行います。
- ルーターで外部からの接続を許可しない
- 印刷サーバーを家庭内LANだけで待ち受ける
- 利用元IPをファイアウォールで制限する
- Chrome拡張の接続先を固定する
- APIへ送れる本文の長さを制限する
- 印刷回数の上限を設ける
- ログを残す
また、感熱紙は熱や日光で変色します。長期保存したい記録には向きません。
この「重要そうな紙なのに、やがて消える」という性質も、家庭内指令書にはちょうどよい気がします。
おしまい
某オークションでの仕入れ時間を除けば、所要時間はおよそ2時間でした。
手に入ったものは、家庭内LAN対応のレシートプリンタと、Chromeから右クリックで情報を物理化できる仕組みです。
実用性だけを考えれば、スマートフォンでメモを見れば済みます。
A4プリンタもあります。
それでも、ボタンを押すと「ジジジッ」と音を立て、細長い紙が出てきて、最後に「シャキン」と切れる。
その体験には、効率とは別の楽しさがあります。
業務用として生まれ、どこかの店舗で働き、1,000円で引き取られてきたレシートプリンタは、いまでは我が家で、
- 買い物メモを出し
- レシピを出し
- 家族への伝言を出し
- QRコードを出しています
中古の業務機と、小さなLinuxサーバーと、少しのAI。
それだけで、ブラウザの中にあった情報が、生活の中へ飛び出してきました。
家にレシートプリンタがある。
もう、その時点で楽しいのです。

