2025-04-29 13:26:19 +08:00

486 lines
11 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

var encode = require("./encoding.js")
// var app = getApp();
var jpPrinter = {
createNew: function() {
var jpPrinter = {};
var data = [];
//var bar = ["UPC-A", "UPC-E", "EAN13", "EAN8", "CODE39", "ITF", "CODABAR", "CODE93", "CODE128"];
jpPrinter.name = "账单模式";
jpPrinter.init = function() { //初始化打印机
data.push(27)
data.push(64)
};
/**
* @description 打印文本内容
* @param {int} align (对齐): 0: 左对齐, 1: 居中, 2: 右对齐
* @param {int} bold加粗: 0: 不加粗, 1: 加粗
* @param {int} wsize字体宽度: 倍数计算, 范围[0, 7]
* @param {int} hsize字体高度: 倍数计算, 范围[0, 7]
* @param {int} reverse反显: 0: 不反显(黑字白底), 1: 反显(黑底白字)
* @param {int} underline下划线: 0: 没下划线, 1: 有下划线
* @param {String} content文本内容
*/
jpPrinter.setText = function(align, bold, wsize, hsize, reverse, underline, content) {
this.init()
this.setSelectJustification(align)
this.setSelectBold(bold)
this.setSelectTextSize(wsize, hsize)
this.setSelectReverse(reverse)
this.setSelectUnderline(underline)
this.setTextContent(content)
this.setPrint()
this.init()
}
//设置文本内容
jpPrinter.setTextContent = function(content) {
var code = new encode.TextEncoder(
'gb18030', {
NONSTANDARD_allowLegacyEncoding: true
}).encode(content)
for (var i = 0; i < code.length; ++i) {
data.push(code[i])
}
}
//设置条码宽度
jpPrinter.setBarcodeWidth = function(width) {
data.push(29)
data.push(119)
if (width > 6) {
width = 6;
}
if (width < 2) {
width = 1;
}
data.push(width)
}
/**
* @description 打印条码
* @param {int} align align (对齐): 0: 左对齐, 1: 居中, 2: 右对齐
* @param {int} type类型: 1: UPC-A, 2: JAN13EAN13, 3: JAN8EAN8, 4: CODE39, 5: ITF, 6: CODABAR, 7:CODE128
* @param {int} width宽度: 点位计算,范围[2, 6]
* @param {int} height高度: 点位计算,范围[1, 255]
* @param {int} positionHRI字符位置: 0: 不打印, 1: 条码上方, 2: 条码下方, 3: 条码上、下方都打印
* @param {String} content条码内容: 注意不同的类型有不同的内容限制具体看佳博ESC编程手册
*/
jpPrinter.setBar = function(align, type, width, height, position, content) {
this.init()
this.setSelectJustification(align)
this.setBarcodeWidth(width)
this.setBarcodeHeight(height)
this.setBarcodePosition(position)
this.setBarcodeContent(type, content)
this.setPrint()
this.init()
}
//设置条码高度
jpPrinter.setBarcodeHeight = function(height) {
data.push(29)
data.push(104)
data.push(height)
}
//HRI 字符的打印位置
jpPrinter.setBarcodePosition = function(n) {
/*
0, 48 不打印
1, 49 条码上方
2, 50 条码下方
3, 51 条码上、下方都打印
*/
data.push(29)
data.push(72)
data.push(n)
}
//设置条码内容
jpPrinter.setBarcodeContent = function(t, content) {
// 1: UPC-A, 2: JAN13EAN13, 3: JAN8EAN8, 4: CODE39, 5: ITF, 6: CODABAR, 7:CODE128
var code = new encode.TextEncoder(
'gb18030', {
NONSTANDARD_allowLegacyEncoding: true
}).encode(content)
var ty = 73;
data.push(29)
data.push(107)
switch (t) {
case 1:
ty = 65;
break;
case 2:
ty = 67;
break;
case 3:
ty = 68;
break;
case 4:
ty = 69;
break;
case 5:
ty = 70;
break;
case 6:
ty = 71;
break;
case 7:
ty = 73;
break;
}
data.push(ty)
data.push(parseInt(code.length))
for (var i = 0; i < code.length; ++i) {
data.push(code[i])
}
}
//设置二维码大小
jpPrinter.setSelectSizeOfModuleForQRCode = function(n) {
data.push(29)
data.push(40)
data.push(107)
data.push(3)
data.push(0)
data.push(49)
data.push(67)
if (n > 15) {
n = 15
}
if (n < 1) {
n = 1
}
data.push(n)
}
//设置纠错等级
jpPrinter.setSelectErrorCorrectionLevelForQRCode = function(t) {
/*
n 功能 纠错能力
48 选择纠错等级 L 7
49 选择纠错等级 M 15
50 选择纠错等级 Q 25
51 选择纠错等级 H 30
*/
data.push(29)
data.push(40)
data.push(107)
data.push(3)
data.push(0)
data.push(49)
data.push(69)
var ty = 49
switch (t) {
case "L":
ty = 48
break
case "M":
ty = 49
break
case "Q":
ty = 50
break
case "H":
ty = 51
break
}
data.push(ty)
}
//设置二维码内容
jpPrinter.setStoreQRCodeData = function(content) {
var code = new encode.TextEncoder(
'gb18030', {
NONSTANDARD_allowLegacyEncoding: true
}).encode(content)
data.push(29)
data.push(40)
data.push(107)
data.push(parseInt((code.length + 3) % 256))
data.push(parseInt((code.length + 3) / 256))
data.push(49)
data.push(80)
data.push(48)
for (var i = 0; i < code.length; ++i) {
data.push(code[i])
}
}
/**
* @description 打印二维码
* @param {int} align对齐: 0: 左对齐, 1: 居中, 2: 右对齐
* @param {int} size尺寸: 点位计算,范围[1, 16]
* @param {String} error纠错等级: L: 纠错等级L, M: 纠错等级M, Q: 纠错等级Q, H: 纠错等级H
* @param {String} content二维码内容: 注意不要超过最大字符数,超过无法打印出
*/
jpPrinter.setQR = function(align, size, error, content) {
this.init()
this.setSelectJustification(align)
this.setSelectSizeOfModuleForQRCode(size)
this.setSelectErrorCorrectionLevelForQRCode(error)
this.setStoreQRCodeData(content)
this.setPrintQRCode()
this.init()
}
//打印二维码
jpPrinter.setPrintQRCode = function() {
data.push(29)
data.push(40)
data.push(107)
data.push(3)
data.push(0)
data.push(49)
data.push(81)
data.push(48)
}
//移动打印位置到下一个水平定位点的位置
jpPrinter.setHorTab = function() {
data.push(9)
}
//设置绝对打印位置
jpPrinter.setAbsolutePrintPosition = function(where) {
data.push(27)
data.push(36)
data.push(parseInt(where % 256))
data.push(parseInt(where / 256))
}
//设置相对横向打印位置
jpPrinter.setRelativePrintPositon = function(where) {
data.push(27)
data.push(92)
data.push(parseInt(where % 256))
data.push(parseInt(where / 256))
}
//对齐方式
jpPrinter.setSelectJustification = function(which) {
/*
0, 48 左对齐
1, 49 中间对齐
2, 50 右对齐
*/
data.push(27)
data.push(97)
data.push(which)
}
//是否加粗
jpPrinter.setSelectBold = function(which) {
/*
0 不加粗
1 加粗
*/
data.push(27)
data.push(69)
data.push(which)
}
//字符大小
jpPrinter.setSelectTextSize = function(wsize, hsize) {
data.push(29)
data.push(33)
data.push(wsize*16+hsize)
}
//选择/取消黑白反显打印模式
jpPrinter.setSelectReverse = function(which) {
/*
0: 不反显(黑字白底), 1: 反显(黑底白字)
*/
data.push(29)
data.push(66)
data.push(which)
}
//选择/取消下划线模式
jpPrinter.setSelectUnderline = function(which) {
/*
0: 没下划线, 1: 有下划线
*/
data.push(27)
data.push(45)
data.push(which)
}
//设置左边距
jpPrinter.setLeftMargin = function(n) {
data.push(29)
data.push(76)
data.push(parseInt(n % 256))
data.push(parseInt(n / 256))
}
//设置打印区域宽度
jpPrinter.setPrintingAreaWidth = function(width) {
data.push(29)
data.push(87)
data.push(parseInt(width % 256))
data.push(parseInt(width / 256))
}
//设置蜂鸣器
jpPrinter.setSound = function(n, t) {
data.push(27)
data.push(66)
if (n < 0) {
n = 1;
} else if (n > 9) {
n = 9;
}
if (t < 0) {
t = 1;
} else if (t > 9) {
t = 9;
}
data.push(n)
data.push(t)
}
//参数,画布的参数
jpPrinter.setBitmap = function(res) {
var height = res.height;
var imgWidth = res.width
var pointList = []
var resultData = []
data.push(29)
data.push(118)
data.push(48)
data.push(0)
data.push((parseInt((res.width + 7) / 8) * 8) / 8)
data.push(0)
data.push(parseInt(res.height % 256))
data.push(parseInt(res.height / 256))
//console.log(data)
//console.log("temp=" + temp)
for (var y = 0; y < height; y++) {
for (var x = 0; x < imgWidth; x++) {
let r = res.data[(y * imgWidth + x) * 4];
let g = res.data[(y * imgWidth + x) * 4 + 1];
let b = res.data[(y * imgWidth + x) * 4 + 2];
let a = res.data[(y * imgWidth + x) * 4 + 3]
//console.log(`当前${y}行${x}列像素,rgba值:(${r},${g},${b},${a})`)
// 像素灰度值
let grayColor = r * 0.299 + g * 0.587 + b * 0.114
//灰度值大于128位
if (grayColor > 128) {
pointList.push(0)
} else {
pointList.push(1)
}
}
}
for (var i = 0; i < pointList.length; i += 8) {
var p = pointList[i] * 128 + pointList[i + 1] * 64 + pointList[i + 2] * 32 + pointList[i +
3] * 16 + pointList[i + 4] * 8 + pointList[i + 5] * 4 + pointList[i + 6] * 2 +
pointList[i + 7]
resultData.push(p)
}
for (var i = 0; i < resultData.length; ++i) {
//data.push(intToByte(resultData[i]))
data.push(resultData[i])
}
}
//打印并换行
jpPrinter.setPrint = function() {
data.push(10)
}
//打印并走纸feed个单位
jpPrinter.setPrintAndFeed = function(feed) {
data.push(27)
data.push(74)
data.push(feed)
}
//打印并走纸row行
jpPrinter.setPrintAndFeedRow = function(row) {
data.push(27)
data.push(100)
data.push(row)
}
//获取打印数据
jpPrinter.getData = function() {
return data;
};
function intToByte(i) {
// 此处关键 -- android是java平台 byte数值范围是 [-128, 127]
// 因为java平台的byte类型是有符号的 最高位表示符号,所以数值范围固定
// 而图片计算出来的是数值是 0 -255 属于int类型
// 所以把int 转换成byte类型
//#ifdef APP-PLUS
var b = i & 0xFF;
var c = 0;
if (b >= 128) {
c = b % 128;
c = -1 * (128 - c);
} else {
c = b;
}
return c
//#endif
// 而微信小程序不需要因为小程序api接收的是 无符号8位
//#ifdef MP-WEIXIN
return i
//#endif
}
return jpPrinter;
},
Query: function() {
var queryStatus = {};
var buf;
var dateView;
//查询打印机实时状态
queryStatus.getRealtimeStatusTransmission = function(n) {
/*
n = 1传送打印机状态
n = 2传送脱机状态
n = 3传送错误状态
n = 4传送纸传感器状态
*/
buf = new ArrayBuffer(3)
dateView = new DataView(buf)
dateView.setUint8(0, 16)
dateView.setUint8(1, 4)
dateView.setUint8(2, n)
queryStatus.query(buf)
}
queryStatus.query = function(buf) {
wx.writeBLECharacteristicValue({
deviceId: app.BLEInformation.deviceId,
serviceId: app.BLEInformation.writeServiceId,
characteristicId: app.BLEInformation.writeCharaterId,
value: buf,
success: function(res) {
},
complete: function(res) {
//console.log(res)
buf = null
dateView = null;
}
})
}
return queryStatus;
}
};
export default jpPrinter;