receiptline でレシートプリンター型日めくりカレンダーを作ってみた

さあみなさん、買わなくていいのでちょっと見ていってください。

本日ご紹介する商品は、こちらの日めくりカレンダーです。
どうですこのボディー。レシートプリンターそっくりでしょう？
![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/76bce108-3ed2-99f0-62ec-fc51b4582880.jpeg)

実はカレンダーを毎朝6時30分に印刷する優れものなんです！
もちろん印刷時刻はお好みに合わせて変更することができます。
![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/b0e0eb83-9dbd-b31e-f13f-b74f5b30dbea.jpeg)

カレンダーをめくるのに失敗してがっかりしたことありますよね？
この商品があれば再印刷できるので何度でもやり直しができます！
![03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/d5765871-c818-4111-3de1-4ed2c61c9728.jpeg)

しかも印刷時にピヨピヨと鳴るメーカーオプションの大音量ブザー付き！
音量は調節できるので、目覚まし時計としてもお使いいただけます！
![04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/ff68f5b1-a42f-e386-f850-2e2b4e9f11bf.jpeg)

これだけではありません！今回は特別に Node.js のソースコードもお付けします！
LAN 対応のローカル版、さらに CloudPRNT 対応のクラウド版をご用意いたしました。

**ローカル版**  

```js:local.js
const net = require('net');
const cron = require('node-cron');
const receiptline = require('receiptline');
const { convert } = require('convert-svg-to-png');

cron.schedule('0 30 6 * * *', () => {
    // ReceiptLine
    const text = `\n\n\n\n\n\n\n\n
    \`"^^^~~~~~~~２０２１年~~~~~~~

    ^令和３年

    April|^^^^"４月|卯月

    "^^^^^^^１

    ^^^木曜日
    Thursday

    -

    ＼エイプリルフール／

    {b:line}
    |"2021年 3月|"2021年 4月|
    -
    |_日 月 火 水 木 金 土|_日 月 火 水 木 金 土|
    |~~ １ ２ ３ ４ ５ ６|~~ ~~ ~~ ~~ １ ２ ３|
    |\`７\` ８ ９ 10 11 12 13|\`４\` ５ ６ ７ ８ ９ 10|
    |\`14\` 15 16 17 18 19 \`20\`|\`11\` 12 13 14 15 16 17|
    |\`21\` 22 23 24 25 26 27|\`18\` 19 20 21 22 23 24|
    |\`28\` 29 30 31 ~~ ~~ ~~|\`25\` 26 27 28 \`29\` 30 ~~|
    {b:space}`;
    // SVG
    const svg = receiptline.transform(text, { encoding: 'cp932' });
    // PNG
    convert(svg).then(png => {
        // Printer
        const printer = {
            host: '192.168.1.253',
            port: 9100,
            gamma: 1.0,
            upsideDown: true,
            cutting: false,
            command: 'starmbcs'
        };
        const socket = net.connect(printer.port, printer.host, () => {
            socket.end(receiptline.transform(`{x:\x07}\n|{i:${png.toString('base64')}}`, printer), 'binary');
        });
        socket.on('error', err => {
            console.log(err.message);
        });
    });
});
```

**クラウド版**  

```js:cloud.js
const express = require('express');
const app = express();
const cron = require('node-cron');
const receiptline = require('receiptline');
const { convert } = require('convert-svg-to-png');

// ReceiptLine
let text = '';
cron.schedule('0 30 6 * * *', () => {
    // ReceiptLine
    text = `\n\n\n\n\n\n\n\n
    \`"^^^~~~~~~~２０２１年~~~~~~~

    ^令和３年

    April|^^^^"４月|卯月

    "^^^^^^^１

    ^^^木曜日
    Thursday

    -

    ＼エイプリルフール／

    {b:line}
    |"2021年 3月|"2021年 4月|
    -
    |_日 月 火 水 木 金 土|_日 月 火 水 木 金 土|
    |~~ １ ２ ３ ４ ５ ６|~~ ~~ ~~ ~~ １ ２ ３|
    |\`７\` ８ ９ 10 11 12 13|\`４\` ５ ６ ７ ８ ９ 10|
    |\`14\` 15 16 17 18 19 \`20\`|\`11\` 12 13 14 15 16 17|
    |\`21\` 22 23 24 25 26 27|\`18\` 19 20 21 22 23 24|
    |\`28\` 29 30 31 ~~ ~~ ~~|\`25\` 26 27 28 \`29\` 30 ~~|
    {b:space}`;
});

// Server
app.post('/calendar', (req, res) => {
    // Print Job
    if (text.length > 0) {
        res.json({ jobReady: true, mediaTypes: [ 'application/vnd.star.starprnt' ] });
    } else {
        res.json({ jobReady: false });
    }
})
app.get('/calendar', (req, res) => {
    // SVG
    const svg = receiptline.transform(text, { encoding: 'cp932' });
    // PNG
    convert(svg).then(png => {
        // Printer
        const printer = { gamma: 1.0, upsideDown: true, cutting: false, command: 'starmbcs' };
        // Command
        const command = Buffer.from(receiptline.transform(`{x:\x07}\n|{i:${png.toString('base64')}}`, printer), 'binary');
        res.status(200).type('application/vnd.star.starprnt').send(command);
        text = '';
    });
});
app.listen(8080, () => {
    console.log('Server running at http://localhost:8080/');
});
```

さらにさらに！日めくりカレンダーのデザインをカスタマイズできるツールも無料でご提供！
https://receiptline.github.io/designer/

```text:ReceiptLine
`"^^^~~~~~~~２０２１年~~~~~~~

^令和３年

April|^^^^"４月|卯月

"^^^^^^^１

^^^木曜日
Thursday

-

＼エイプリルフール／

{b:line}
|"2021年 3月|"2021年 4月|
-
|_日 月 火 水 木 金 土|_日 月 火 水 木 金 土|
|~~ １ ２ ３ ４ ５ ６|~~ ~~ ~~ ~~ １ ２ ３|
|`７` ８ ９ 10 11 12 13|`４` ５ ６ ７ ８ ９ 10|
|`14` 15 16 17 18 19 `20`|`11` 12 13 14 15 16 17|
|`21` 22 23 24 25 26 27|`18` 19 20 21 22 23 24|
|`28` 29 30 31 ~~ ~~ ~~|`25` 26 27 28 `29` 30 ~~|
{b:space}
```

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/6552071a-e207-7441-faea-588b1fa53079.png)
どうですみなさん、すごいでしょう？
・・・エイプリルフールネタにしてみました。

マークダウン言語で紙のレシートや電子レシートを簡単に作れる receiptline。
パッケージに添付されているプログラム例を参考に作りました。
https://github.com/receiptline/receiptline

receiptline で SVG に変換後、さらにプリンターコマンドに変換しています。
4月1日固定なので、当日の日付を印刷するように修正してくださいね！

また何か作ったら投稿します。ではまた！