340 lines
9.4 KiB
JavaScript
Raw Normal View History

2018-06-09 02:25:45 -06:00
let fs = require('fs');
let PNG = require('pngjs').PNG;
let config = require('../configs/epsonConfig');
let buffer = null;
function append(buff) {
if (buffer) buffer = Buffer.concat([buffer, buff]);
else buffer = buff;
}
module.exports = {
// ------------------------------ Epson QR ------------------------------
printQR: function (str, settings) {
settings = settings || {};
// [Name] Select the QR code model
// [Code] 1D 28 6B 04 00 31 41 n1 n2
// n1
// [49 x31, model 1]
// [50 x32, model 2]
// [51 x33, micro qr code]
// n2 = 0
// https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=140
if(settings.model) {
if(settings.model === 1) append(config.QRCODE_MODEL1);
else if(settings.model === 3) append(config.QRCODE_MODEL3);
else append(config.QRCODE_MODEL2);
} else {
append(config.QRCODE_MODEL2);
}
// [Name]: Set the size of module
// 1D 28 6B 03 00 31 43 n
// n depends on the printer
// https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=141
if(settings.cellSize) {
var i = "QRCODE_CELLSIZE_".concat(settings.cellSize.toString());
append(config[i]);
} else {
append(config.QRCODE_CELLSIZE_3)
}
// [Name] Select the error correction level
// 1D 28 6B 03 00 31 45 n
// n
// [48 x30 -> 7%]
// [49 x31-> 15%]
// [50 x32 -> 25%]
// [51 x33 -> 30%]
// https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=142
if(settings.correction) {
var i = "QRCODE_CORRECTION_".concat(settings.correction.toUpperCase());
append(config[i]);
} else {
append(config.QRCODE_CORRECTION_M)
}
// [Name] Store the data in the symbol storage area
// 1D 28 6B pL pH 31 50 30 d1...dk
// https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=143
var s = str.length + 3;
var lsb = parseInt(s % 256);
var msb = parseInt(s / 256);
append(new Buffer([0x1d, 0x28, 0x6b, lsb, msb, 0x31, 0x50, 0x30]));
append(new Buffer(str));
// [Name] Print the symbol data in the symbol storage area
// 1D 28 6B 03 00 31 51 m
// https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=144
append(config.QRCODE_PRINT);
// Dont forget to clean the buffer
let buff = buffer;
buffer = null;
return buff;
},
// ------------------------------ Epson PDF417 ------------------------------
pdf417: function(data, settings) {
settings = settings || {};
// Set error correction ratio 1 - 40
if(settings.correction){
append(config.PDF417_CORRECTION);
append(new Buffer([settings.correction]))
} else {
append(config.PDF417_CORRECTION);
append(new Buffer([0x01]))
}
// Set row height 2 - 8
if(settings.rowHeight){
append(config.PDF417_ROW_HEIGHT);
append(new Buffer([settings.rowHeight]))
} else {
append(config.PDF417_ROW_HEIGHT);
append(new Buffer([0x03]))
}
// Set width of module 2 - 8
if(settings.width){
append(config.PDF417_WIDTH);
append(new Buffer([settings.width]))
} else {
append(config.PDF417_WIDTH);
append(new Buffer([0x03]))
}
// Manually set columns 1 - 30
if(settings.columns){
append(config.PDF417_COLUMNS);
append(new Buffer([settings.columns]))
} else {
// Default to auto
append(config.PDF417_COLUMNS);
append(new Buffer([0x00]))
}
// Standard or truncated option
if(settings.truncated) append(config.PDF417_OPTION_TRUNCATED);
else append(config.PDF417_OPTION_STANDARD);
// Set PDF417 bar code data
var s = data.length + 3;
var lsb = parseInt(s % 256);
var msb = parseInt(s / 256);
append(new Buffer([0x1d, 0x28, 0x6b, lsb, msb, 0x30, 0x50, 0x30]));
append(new Buffer(data.toString()));
//Print barcode
append(new Buffer(config.PDF417_PRINT));
// Dont forget to clean the buffer
let buff = buffer;
buffer = null;
return buff;
},
// ------------------------------ Epson CODE128 ------------------------------
maxiCode: function(data, settings){
settings = settings || {};
// Maxi Mode
// 2 - Formatted data/structured Carrier Message with a numeric postal code. (US)
// 3 - Formatted data/structured Carrier Message with a numeric postal code. (International)
// 4 - Unformatted data/Standard Error Correction.
// 5 - Unformatted data/Enhanced Error Correction.
// 6 - Used for programming hardware devices.
if(settings.mode) {
if(settings.mode == 2) append(config.MAXI_MODE2);
else if(settings.mode == 3) append(config.MAXI_MODE3);
else if(settings.mode == 5) append(config.MAXI_MODE5);
else if(settings.mode == 6) append(config.MAXI_MODE6);
else append(config.MAXI_MODE4)
} else {
append(config.MAXI_MODE4)
}
// Setup size of MaxiCode data
var s = data.length + 3;
var lsb = parseInt(s % 256);
var msb = parseInt(s / 256);
// Send Data
append(new Buffer([0x1d, 0x28, 0x6b, lsb, msb, 0x32, 0x50, 0x30]));
append(new Buffer(data.toString()));
// Print barcode
append(config.MAXI_PRINT);
// Don't forget to clean the buffer
let buff = buffer;
buffer = null;
return buff;
},
// ------------------------------ Epson BARCODE ------------------------------
printBarcode: function(data, type, settings){
settings = settings || {};
//Set HRI characters Position, 0-3 (none, top, bottom, top/bottom)
if(settings.hriPos){
append(new Buffer([0x1d, 0x48])); // GS H
append(new Buffer([settings.hriPos]))
} else {
append(new Buffer([0x1d, 0x48, 0x00]))
}
// Set HRI character font. 0-4, 48-52, 97, 98 (depending on printer, 0 and 1 available on all), default 0
if(settings.hriFont){
append(new Buffer([0x1d, 0x66])); // GS f
append(new Buffer([settings.hriFont]))
} else {
append(new Buffer([0x1d, 0x66, 0x00]))
}
// Set width 2-6, default 3
if(settings.width){
append(new Buffer([0x1d, 0x77])); // GS W
append(new Buffer([settings.width]))
} else {
append(new Buffer([0x1d, 0x77, 0x03]))
}
// Set height 1 - 255 default 162
if(settings.height){
append(new Buffer([0x1d, 0x68])); // GS h
append(new Buffer([settings.height]))
} else {
append(new Buffer([0x1d, 0x68, 0xA2]))
}
// Print Barcode
append(new Buffer([0x1d, 0x6b])); // GS k
// Select type and bit length of data
append(new Buffer([type, data.length]));
// Data
append(new Buffer(data));
// Don't forget to clean the buffer
let buff = buffer;
buffer = null;
return buff;
},
// ----------------------------------------------------- PRINT IMAGE EPSON -----------------------------------------------------
// https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=88
printImageEpson: function(image, callback){
let png = new PNG({
filterType: 4
});
fs.createReadStream(image)
.pipe(png)
.on('parsed', function() {
module.exports._printImageBufferEpson(this.width, this.height, this.data, function(buff){
callback(buff);
});
})
.on('error', function(err) {
console.error(err);
});
},
_printImageBufferEpson: function(width, height, data, callback){
// Get pixel rgba in 2D array
var pixels = [];
for (var i = 0; i < height; i++) {
var line = [];
for (var j = 0; j < width; j++) {
var idx = (width * i + j) << 2;
line.push({
r: data[idx],
g: data[idx + 1],
b: data[idx + 2],
a: data[idx + 3]
});
}
pixels.push(line);
}
var imageBuffer_array=[];
for (var i = 0; i < height; i++) {
for (var j = 0; j < Math.ceil(width/8); j++) {
var byte = 0x0;
for (var k = 0; k < 8; k++) {
var pixel = pixels[i][j*8 + k];
// Image overflow
if(pixel === undefined){
pixel = {
a: 0,
r: 0,
g: 0,
b: 0
};
}
if(pixel.a > 126){ // checking transparency
var grayscale = parseInt(0.2126 * pixel.r + 0.7152 * pixel.g + 0.0722 * pixel.b);
if(grayscale < 128){ // checking color
var mask = 1 << 7-k; // setting bitwise mask
byte |= mask; // setting the correct bit to 1
}
}
}
imageBuffer_array.push(byte);
// imageBuffer = Buffer.concat([imageBuffer, new Buffer([byte])]);
}
}
let imageBuffer = Buffer.from(imageBuffer_array);
// Print raster bit image
// GS v 0
// 1D 76 30 m xL xH yL yH d1...dk
// xL = (this.width >> 3) & 0xff;
// xH = 0x00;
// yL = this.height & 0xff;
// yH = (this.height >> 8) & 0xff;
// https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=94
// Check if width/8 is decimal
if(width%8 != 0) {
width += 8;
}
append(new Buffer ([0x1d, 0x76, 0x30, 48]));
append(new Buffer ([(width >> 3) & 0xff]));
append(new Buffer ([0x00]));
append(new Buffer ([height & 0xff]));
append(new Buffer ([(height >> 8) & 0xff]));
// append data
append(imageBuffer);
// Don't forget to clean the buffer
let buff = buffer;
buffer = null;
callback(buff);
return buff;
},
};