Printable digital receipts 🧾
Transform markdown-like text to receipt printer commands or SVG images.
The reference implementation of the OFSC ReceiptLine Specification.
http://www.ofsc.or.jp/receiptline/en/
ReceiptLine is the receipt description language that expresses the output image of small roll paper.
It supports printing paper receipts using a receipt printer and displaying electronic receipts on a POS system or smartphone.
It can be described simply with markdown-like text data that does not depend on the paper width.
This reference implementation also provides the development tool "ReceiptLine Designer" for editing, previewing, hex dumps with a virtual printer, and test printing on receipt printers.
- Epson TM series
- SII RP series
- Star MC series
- Citizen CT series
- Fujitsu FP series
$ npm install receiptlinereceiptline.transform() method transforms ReceiptLine document to printer commands or SVG images.
const receiptline = require('receiptline');
const doc = '{code:2012345678903;option:ean,hri}';
// printer example
const printer = {
cpl: 42,
encoding: 'cp437',
upsideDown: false,
gamma: 1.8,
command: 'escpos'
};
const command = receiptline.transform(doc, printer);
// display example
const display = {
cpl: 42,
encoding: 'cp437'
};
const svg = receiptline.transform(doc, display);receiptline.transform(doc, printer)
doc- a string of ReceiptLine document
printer- an object of printer configuration
- printer commands or SVG images
cpl- characters per line (default:
48)
- characters per line (default:
encodingcp437: United States (default)cp852: Central Europeancp858: Western Europeancp860: Portuguesecp863: French Canadiancp865: Nordiccp866: Cyrilliccp932: Japanesecp1252: Western European
upsideDown(for printer)false: normal (default)true: upside down
spacingfalse: no line spacing (default)true: line spacing
cutting(for printer)false: no paper cuttingtrue: paper cutting (default)
gamma(for printer)- image gamma correction (default:
1.8)
- image gamma correction (default:
commandsvg: SVG (default)escpos: Epson, Citizensii: SIIstarmbcs: Star MBCSstarsbcs: Star SBCSfit: Fujitsu
Display digital receipts in the web browser and print paper receipts on the printer as needed.
Enter markdown-like text from the web form, transform it to printer commands on the server, and print it out.
Enter markdown-like text from the web form, transform it to SVG images on the web browser, and display it.
The documents (markdown-like text) are the same as the examples in the OFSC ReceiptLine Specification.
JavaScript ES2015(ES6) version. It works on both web browser and Node.js.
To output printer commands on a web browser, use Browserify.
$ browserify -o receiptline-full.js receiptline.jsGenerate the QR Code for display. Optional.
The ReceiptLine Designer provides more features.
- Edit and preview
- Data transmission via TCP socket
- Hex dump view by listening TCP 19100 port
-
Start the server
$ cd node_modules/receiptline $ npm start -
Use a modern browser.
-
Configure printers.json
"printer_id": { "host": "127.0.0.1", "port": 19100, "cpl": 48, "encoding": "cp437", "upsideDown": false, "spacing": false, "cutting": true, "gamma": 1.8, "command": "svg" }
printer_id- printer identifier (alphanumeric or underscore characters)
host- printer address
port- printer port (will be
9100)
- printer port (will be
cpl,encoding,upsideDown,spacing,cutting,gamma,command- see the printer configuration above
Please back up this json file as it will be initialized by updating the package.
The serial-LAN converter enables test printing to USB / Bluetooth printers that support virtual serial ports.
-
Install the virtual serial port driver for the printer and Node Serialport
$ npm install serialport $ cd node_modules/receiptline -
Configure servers.json
"serial": { "host": "127.0.0.1", "port": 9100, "device": "COM9" }
serial- to enable it, change from
_serial
- to enable it, change from
host- local address
port- local port
device- the system path of the serial port
Please back up this json file as it will be initialized by updating the package.
-
Restart the server
$ npm start
The receipt is made of a table, which separates each column with a pipe |.
| Line | Content | Description |
|---|---|---|
column| column || columncolumn | |
Text Property |
Single column |
column | column | column | column || column | columncolumn | column | |
Text | Double column |
column | ... | column| column | ... | column || column | ... | columncolumn | ... | column | |
Text | Multiple columns |
The column is attracted to the pipe | like a magnet.
␣ means one or more whitespaces.
| Column | Description |
|---|---|
column|column||␣column␣| |
Center |
|column|column␣|column ␣| |
Left |
column||␣column||␣column |
Right |
The text is valid for any column.
Asparagus | 0.99
Broccoli | 1.99
Carrot | 2.99
---
^TOTAL | ^5.97
Characters are printed in a monospace font (12 x 24 px).
Wide characters are twice as wide as Latin characters (24 x 24 px).
Control characters are ignored.
Special characters are assigned to characters that are rarely used in the receipt.
| Special character | Description |
|---|---|
\ |
Character escape |
| |
Column delimiter |
{ |
Property delimiter (Start) |
} |
Property delimiter (End) |
- (1 or more, exclusive) |
Horizontal rule |
= (1 or more, exclusive) |
Paper cut |
~ |
Space |
_ |
Underline |
" |
Emphasis |
` |
Invert |
^ |
Double width |
^^ |
Double height |
^^^ |
2x size |
^^^^ |
3x size |
^^^^^ |
4x size |
^^^^^^ |
5x size |
^^^^^^^ (7 or more) |
6x size |
Escape special characters.
| Escape sequence | Description |
|---|---|
\\ |
\ |
\| |
| |
\{ |
{ |
\} |
} |
\- |
- (Cancel horizontal rule) |
\= |
= (Cancel paper cut) |
\~ |
~ |
\_ |
_ |
\" |
_ |
\` |
` |
\^ |
^ |
\n |
Wrap text manually |
\xnn |
Hexadecimal character code |
\char (Others) |
Ignore |
The property is valid for lines with a single column.
{ width: * 10; comment: the column width is specified in characters }
| Key | Abbreviation | Value | Case-sensitive | Default | Saved | Description |
|---|---|---|---|---|---|---|
image |
i |
base64 png format | ✓ | - | - | Image (Recommended: monochrome, critical chunks only) |
code |
c |
textdata | ✓ | - | - | Barcode / 2D code |
option |
o |
see below | - | code128 2 72 nohri 3 l |
✓ | Barcode / 2D code options (Options are separated by commas or one or more whitespaces) |
align |
a |
leftcenterright |
- | center |
✓ | Line alignment (Valid when line width < CPL) |
width |
w |
auto*0 - |
- | auto( * for all columns) |
✓ | Column widths (chars) (Widths are separated by commas or one or more whitespaces) |
border |
b |
linespacenone0 - 2 |
- | space |
✓ | Column border (chars) (Border width: line=1, space=1, none=0) |
text |
t |
wrapnowrap |
- | wrap |
✓ | Text wrapping |
command |
x |
textdata | ✓ | - | - | Device-specific commands |
comment |
_ |
textdata | ✓ | - | - | Comment |
Barcode options are separated by commas or one or more whitespaces.
| Barcode option | Description |
|---|---|
upc |
UPC-A, UPC-E (Check digit can be omitted) |
eanjan |
EAN-13, EAN-8 (Check digit can be omitted) |
code39 |
CODE39 |
itf |
Interleaved 2 of 5 |
codabarnw7 |
Codabar (NW-7) |
code93 |
CODE93 |
code128 |
CODE128 |
2 - 4 |
Barcode module width (px) |
24 - 240 |
Barcode module height (px) |
hri |
With human readable interpretation |
nohri |
Without human readable interpretation |
2D code options are separated by commas or one or more whitespaces.
| 2D code option | Description |
|---|---|
qrcode |
QR Code |
3 - 8 |
Cell size (px) |
lmqh |
Error correction level |
Special characters in property values are different from special characters in text.
| Special character | Description |
|---|---|
\ |
Character escape |
| |
Column delimiter |
{ |
Property delimiter (Start) |
} |
Property delimiter (End) |
: |
Key-value separator |
; |
Key-value delimiter |
Escape special characters.
| Escape sequence | Description |
|---|---|
\\ |
\ |
\| |
| |
\{ |
{ |
\} |
} |
\; |
; |
\n |
New line |
\xnn |
Hexadecimal character code |
\char (Others) |
Ignore |
- Communication with the printer, status event processing, and error handling are out of scope.
- SVG images depend on the font family installed on the computer and may not display properly.
- The QR code for display is encoded in UTF-8, while the QR code for printing is encoded in ASCII or Shift_JIS.
Open Foodservice System Consortium
http://www.ofsc.or.jp/
- receiptline
- Apache License, Version 2.0
- QR Code Generator for JavaScript with UTF8 Support
- MIT License
















