Originally forked from here
ESC/POS XML
Cross platform JavaScript library that implements the thermal printer ESC / POS protocol and provides an XML interface for preparing templates for printing.
Features
- <input checked="" disabled="" type="checkbox"> Text
- <input checked="" disabled="" type="checkbox"> Text line
- <input checked="" disabled="" type="checkbox"> Feed line
- <input checked="" disabled="" type="checkbox"> Bold text
- <input checked="" disabled="" type="checkbox"> Underline text
- <input checked="" disabled="" type="checkbox"> Font size
- <input checked="" disabled="" type="checkbox"> Small mode
- <input checked="" disabled="" type="checkbox"> White mode
- <input checked="" disabled="" type="checkbox"> Align
- <input checked="" disabled="" type="checkbox"> Barcode
- <input checked="" disabled="" type="checkbox"> QRcode
- <input checked="" disabled="" type="checkbox"> Paper cut node
- <input checked="" disabled="" type="checkbox"> Image (base64) (png only)
- <input checked="" disabled="" type="checkbox"> XML with mustache
Tested manually on following environments or platforms
- <input checked="" disabled="" type="checkbox"> React Native (Android)
- <input checked="" disabled="" type="checkbox"> React Native (iOS)
- <input checked="" disabled="" type="checkbox"> React Native Web
- <input checked="" disabled="" type="checkbox"> Server side (NodeJs)
- <input checked="" disabled="" type="checkbox"> Desktop applications (nwjs & electron)
- <input checked="" disabled="" type="checkbox"> Other node environment (terminal)
Installation
yarn add @tillpos/xml-escpos-helper
Examples
With an XML template + plain object input (regular text).
import { EscPos } from '@tillpos/xml-escpos-helper';
// store this template somewhere `s3` or as `static asset` based on your preference
const template = `
<?xml version="1.0" encoding="UTF-8"?>
<document>
<align mode="center">
<bold>
<text-line size="1:0">{{title}}</text-line>
</bold>
</align>
{{#thankyouNote}}
<align mode="center">
<text-line size="0:0"> {{{thankyouNote}}}</text-line>
</align>
<line-feed />
<paper-cut />
</document>
`;
const input = {
title: 'Sample',
thankyouNote: 'Welcome...!'
};
const buffer = EscPos.getBufferFromTemplate(template, input);
// send this buffer to a stream (eg.: bluetooth or wifi)
With an XML template + png image (base64)
const template = `<?xml version="1.0" encoding="UTF-8"?>
<document>
<align mode="center">
<bold>
<text-line size="1:0">{{title}}</text-line>
</bold>
<image density="d24">
{{base64PngImage}}
</image>
</align>
</document>`;
const input = {
title: 'PNG - base64',
base64PngImage: `data:image/png;base64,iVBORw0KGgoAAA+P/AaNn2GPEMgEFAAAAAElFTkSuQmCC`
};
const buffer = EscPos.getBufferFromTemplate(template, input);
TODO
- <input disabled="" type="checkbox"> Font styles (font family)
- <input disabled="" type="checkbox"> Image bitmap conversion improvements
- <input disabled="" type="checkbox"> jpeg support
- <input disabled="" type="checkbox"> Add example apps to repo
- <input disabled="" type="checkbox"> Removed uglify for some reason, need to bring it back
- <input disabled="" type="checkbox"> Improve image rendering
Common issues
- If there is any delay you observe while printing with this library it is mostly due to image manipulations (try without image :mask: )
Useful links / resources
- ESC / POS Commands manual
- A blog post explaiing about printing images with ESCPOS
- Similar library for serverside - node-escpos.
Limitations on the react-native framework
- FileReader.readAsArrayBuffer was not implemented.
- Most of popular image manupulation libraries does not have support for react-native. eg : jimp, jpeg-js and sharp. We can use these libraries with some native node lib implemented in react native (some sort of polyfill).
- For png this library seems to be faster, but when tested this library with it, it is not retaining pixels at some places)
- Use this node-libs-react-native if we need to use this library in react native (adds some mock or js implementation for fs, stream etc)
Contributions of any kind welcome! :heart: