Amazonの領収書をレシートプリンターで印刷する

タグ:

Amazon.co.jpやYodobashi.comなどのECサイトで発行される領収書をレシートプリンターで印刷しました。これをやる方法の記録としてプリンターの設定と、A4で発行される領収書を58mm幅のレシート用に並び替える変換ツールのお話。

やったこと

Amazon.co.jpとYodobashi.comの領収書を58ミリ幅のレシートプリンターで印刷するようにしました。印刷するのは抜粋と整形をしたものなのでこの書類は写しという扱いになりますね。

印刷されたサンプル 5点の注文が3つの発送に別れた長めの領収書

レシートの全体はこんな感じ。Amazonの購入履歴から発行できる「領収書/購入明細書」と見比べてもらうと、ほぼ同じ内容を58mmに収めているのがお分かりいただけます。できるだけ小売店のレシートに寄せるべくところどころ切り落として整形していますけどね。Amazonの領収書は毎月の枚数が多いのでいちいちA4で印刷せずにレシートにしたら小売店のものと並べられて便利そう、という動機でやってみました。PDFを保存しなよと言われるところですが、領収書の管理においてはファイルシステムよりDBよりも紙が勝っているという思想のため印刷はマストなのです。

やり方

ECサイトのレシートを印刷するまでのやり方をまとめます。領収書を印刷するのはあまりいい例と言えなくても、レシートプリンター活用の基礎として参考になるとよいですね。まずレシートプリンタをPCで使えるように構成します。この次に、A4領収書を58mm幅に整形して印刷します。このために変換器を作ったのでそれを紹介をします。安価なレシートプリンターとPCがあれば同じことができるはず。というのは、安い製品ほど内側が共通だったりするので。

レシートプリンターを普通のプリンターのように使う

まずはレシートプリンターを使えるようにします。まるで普通のプリンターのように、「印刷」ボタンの印刷ウィザードから印刷できるように構成しましょう。MacやLinuxなどCUPSが動く環境での構成をメインに紹介します。Windowsではプリンターに付属していたり、「POS 58 driver」で検索すると出てくるドライバをインストールすれば動かすことができます。出処のはっきりしたドライバは無く、提供元不明で怪しいのを我慢して使うことになります。

CUPSの初期設定

まずは印刷全体を担うCUPSことCommon Unix Printing Standardを設定します。まだインストールされていなければパッケージマネージャーからインストールします。これから書くコマンドはRaspbian での例です。

sudo apt update
sudo apt install cups

CUPSをインストールしたら設定をします。まず、ユーザーをプリンター設定の権限があるグループに追加します。sudo usermod -a -G lpadmin pi、piはお使いのユーザー名に置き換えてください。あとでWebインターフェースからプリンターを追加する時にこのアカウントの資格を使います。次に、cupsctl WebInterface=yesでウェブインターフェイスを有効にします。しなくてもGUIの印刷設定が使えたりしますが、これはOSによって違いが大きいので一度忘れましょう。

そうしたらsudo systemctrl restart cupsでCUPSを再起動してからhttp://localhost:631を開いてWebインターフェイスが出るか確認します。これでいったんCUPSの設定は完了です。

zj-58のコンパイルとインストール

CUPSがレシートプリンタを扱えるように「フィルタ」であるzj-58をインストールしましょう。CUPSのフィルタとは印刷ジョブファイルを印刷可能な形式に変換するものです。zj-58は多くのESC/POSコマンドを解するサーマルプリンターを動かすとのことで、お使いのプリンターも動くはず。58mm幅だけでなく80mmにも対応しています。

リポジトリのインストール手順にならってRaspbianでは次のコマンドでインストールしました。

sudo apt install build-essential cmake libcups2-dev libcupsimage2-dev
cd ~/Downloads # (任意の場所
git clone https://github.com/klirichek/zj-58.git
mkdir build && cd build && cmake ~/Downloads/zj-58
cmake --build .
sudo make install

CUPSにレシートプリンターを追加

CUPSインターフェイスに戻ってレシートプリンターを追加します。これから認証が必要な手順を行うためhttps://localhost:631へ”https”で接続し、警告を承知して閲覧を続けるオプションを選択します。接続したプリンターの電源を入れたら上のメニューから”Administration”を開き、”Printers”の”Add Printer”に移ります。そのときにuser, passの資格を問われるので、lpadminグループに加えたユーザーアカウントを入力します。

”Add Printer”ページでは追加できるプリンターのリストが表示されるのでそれらしいのをチェックして”Continue”します。私の場合は機器名をちゃんと名乗り出てくれなかったので、プリンタの電源をONOFFしては再読込して探しました。”Unknown”として表示されていたのがそうでした。

あとはフォームに従って設定しましょう。Nameは「メーカ名 型番」にしておくのが無難です。Name以外はあとから変更できます。

NameとDescription, Locatoinを入力した次に、Makeの欄でレシートプリンタのための設定をします。Makeの選択肢から”Zijiang”を選びContinueします。そしてつぎにModelを問われるのでそこではプリンターの用紙の幅と同じ数字が入ったものを選択しAdd Printerします。このZijiangのプロファイルこそzj-58によって追加された設定で、実際のプリンタと同じ名前でなくても大丈夫です。

これでやっとプリンタを動かせるようになりました。印刷テストをするには echo Hello|lp -d プリンターにつけた名前 します。

余談として、プリンタ共有もできます。プリンタ設定でShareingを有効にして、Raspbianではsambaをインストールしておきます。そしたらCUPSでプリントする機器同士であればOSのプリンター設定から追加できます。Windows からは前述のドライバーをインストールのうえそのドライバーを指定して構成します。


レシート用に組み直す変換ツール

レシートプリンターをPCに繋いだので印刷をしましょう。でもAmazonの領収書に限らず一般的なドキュメントをそのままレシートプリンターで印刷しようとすると縮小されて潰れたり、改行だらけになったり、はみ出たりしてちゃんと収まりません。かといって、平文にしてしまうと読みづらい。そこで、レシートプリンターでうまく印刷するためにA4で発行される領収書を58mm幅のレシート用に組み替える変換ツールを用意しました。Amazon.co.jp領収書変換器の見本を貼ります。

See the Pen Untitled by kunikunimitanni (@kunikunimitanni) on CodePen.

領収書のテキストを全て選択して入力欄にコピペすると、用紙に収まる整形されたテキストが出力されます。Amazon.co.jpでは数パターンの領収書が発行できますがそのうちの「領収書/購入明細書」というのを使います。仕組みは、レシートのテキストからほしいところを正規表現ですくって組み直すというかんじ。”insert sample text”ボタンでサンプル文が入ります。

これでレシート用に整形したページができました。やっと印刷です。ここまで長かった。プレビューを見ると、縦幅に制限がないと考えていいロール紙を扱うので超縦長の仮想の用紙が用いられてます。印刷イメージがかつて無いほど長ーい。

変換器の細かいポイント

印刷のときに生成した部分以外のフォームなどが入らないように非表示にします。そのためには、印刷したくないところにそれ用のクラスを割り振って印刷時に表示しない設定にしておきます。

@media print {
  .no-print {
    display: none;
  }
}

また、印刷する部分をプレビューのように表示するところはpaper-css というのを参考にしました。いろんな用紙をハイパーテキストで書くときの用紙のスタイルが書かれた短いCSSです。

URLから二次元バーコードを付けるオプションもあり、ソースへのリンクなどをつけられます。これにはdavidshimjs/qrcodejsを使ってます。ソースへのリンクをつけといて、複製であるレシートからも原本の領収書を辿れるようにします。ところで、Amazonはログイン済みなら領収書のURLから直接閲覧できるんですね。見返すのには便利です。

などとやって、やっとECサイトのA4領収書をレシートプリンターで印刷したレシート(の複製)が完成しました。

まとめと入り切らなかった話

以上がECサイトの領収書をレシートプリンターで印刷するためにしたことでした。A4の領収書を変換して普通のプリンターのようにレシートプリンターで印刷するというのは、まあうまくいきました。

こんなことをわざわざやったのは、レシートプリンターで普通のプリンターの内容が印刷できたら気軽で良さそうと思ったのに始まります。ですが思ったよりたくさん整形の設定を書かねばならず、初期設定のコストが高めでした。Amazon .co.jpとともによく使うYodobashi.comの設定も作ったりしましたが、これらは頻度が高いので手間に見合うかな。でもそのほかの頻度が少ないとこは整形の設定をするほどでもなく、引き続きA4で印刷することになりそうです。

レシートに二次元バーコードのリンクを貼って原本を辿れるようにしましたが、これはいいですね。印刷するのは領収書そのものではなく摘要にとどめておいて、このリンクを紙管理とファイルシステム管理をつなぐ見出しとするという実用的な使い方が見えました。そのときは各サービスどんなフォーマットでも要点だけ検索すれば良いので万能版も作れます。

普通のプリンターとして使う是非

このやり方を紹介しておいてなのですが、レシートプリンターをCUPSなどを通して普通のプリンタと並べて構成するのはあまり利点がありません。普通のプリンターとして使えるようになったとしても私がやったような整形が必要で、普通のドキュメントはプリントできないのです。リッチテキストエディタで狭小の書式を用意すれば割と早くメモを書き出したりはできますが、それなら初めからESC/POSを送ったほうが手数が少なくすみます。

実はわざわざプリンタとして使うやり方をしたのは、私の購入したプリンタでESC/POSコマンドがうまく使えなかったからなんです。いくつかのESC/POSでレシートプリンターを動かすソフトを試したところ、そのどれでも同じ印刷不全が出ました。わたしのプリンターはWindow用と銘打って販売されていたもので、どうやらWindows対応のチューンのために通常のESC/POSプリンタとしては欠けていた疑いがあります。このせいで、ちゃんと動かせないESC/POSの回避策としてzj-58を採用した経緯があります。

EANコードに要らぬ番号が重なって平文だけ印字される、テーブルがズレる、二次元バーコードが半分になるなどいろいろ印字が不全だった

でもまあ、今回はWebフロントエンドで変換器を作ってCSSでゴリゴリ整形したものを作ったので、これの印刷には普通のプリンターのようにするやり方が向いています。

次回のレシートプリンター開発ではドキュメントの生成からESC/POSでの印刷まで一連のサービスをするwebインターフェイスを持ったサーバーを用意したいです。そしたらWindowsでよくわからないドライバを入れずに済みますしね。これからもレシートプリンターいじりは続けます。

ロール紙で印刷するコスト

ロール紙の領収書とA4で印刷した領収書の値段をとてもかんたんに計算します。幅58mmのロール紙は20mが5巻で1500円。一枚のレシートが30cm、1ロールで66枚印刷できるとして( 1500/5/(20000/300) )4.5円。いっぽうのコピー紙は500枚で700円、途中600円の黒インクを交換したとして( (700+600)/500 )2.6円。インクジェットじゃなくてレーザープリンターの1200円するトナーを交換しても3.8円。贔屓目に見てもレシートプリントは割高。もっと短くする工夫がいりますね。

出典と参考

作成者: KuniMita

イラスト, 3Dプリント, 写真, Web開発, バイク, 料理。文章の特訓に記事を書きます。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です