Files

284 lines
7.6 KiB
JavaScript
Raw Permalink 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 app = getApp();
// var encode = require("./encoding.js");
import encode from "./encoding.js";
var jpPrinter = {
createNew: function() {
var jpPrinter = {};
var data = "";
var command = []
jpPrinter.name = "标签模式";
jpPrinter.init = function() {};
//将指令转成数组装起
jpPrinter.addCommand = function(content) {
var code = new encode.TextEncoder(
'gb18030', {
NONSTANDARD_allowLegacyEncoding: true
}).encode(content)
//console.log('addCommand content ', content)
// console.log('addCommand code ', code)
for (var i = 0; i < code.length; ++i) {
command.push(code[i])
}
}
jpPrinter.setSize = function(pageWidght, pageHeight) {
data = "SIZE " + pageWidght.toString() + " mm" + "," + pageHeight.toString() + " mm" + "\r\n";
jpPrinter.addCommand(data)
};
jpPrinter.setSpeed = function(printSpeed) {
// data = "SPEED " + printSpeed.toString() + "\r\n";
data = `SPEED ${printSpeed}\r\n`
jpPrinter.addCommand(data)
};
jpPrinter.setDensity = function(printDensity) {
data = "DENSITY " + printDensity.toString() + "\r\n";
jpPrinter.addCommand(data)
};
jpPrinter.setGap = function(printGap) {
data = "GAP " + printGap.toString() + " mm\r\n";
jpPrinter.addCommand(data)
};
jpPrinter.setGapMM = function(m, n) {
data = `GAP ${m} mm,${n} mm\r\n`
jpPrinter.addCommand(data)
};
//选择国际字符集
jpPrinter.setCountry = function(country) {
/*
001:USA
002:French
003:Latin America
034:Spanish
039:Italian
044:United Kingdom
046:Swedish
047:Norwegian
049:German
*/
data = "COUNTRY " + country + "\r\n";
jpPrinter.addCommand(data)
};
//选择国际代码页
jpPrinter.setCodepage = function(codepage) {
/*
8-bit codepage 字符集代表
437:United States
850:Multilingual
852:Slavic
860:Portuguese
863:Canadian/French
865:Nordic
Windows code page
1250:Central Europe
1252:Latin I
1253:Greek
1254:Turkish
以下代码页仅限于 12×24 dot 英数字体
WestEurope:WestEurope
Greek:Greek
Hebrew:Hebrew
EastEurope:EastEurope
Iran:Iran
IranII:IranII
Latvian:Latvian
Arabic:Arabic
Vietnam:Vietnam
Uygur:Uygur
Thai:Thai
1252:Latin I
1257:WPC1257
1251:WPC1251
866:Cyrillic
858:PC858
747:PC747
864:PC864
1001:PC100
*/
data = "CODEPAGE " + codepage + "\r\n";
jpPrinter.addCommand(data)
}
//清除打印机缓存
jpPrinter.setCls = function() {
data = "CLS" + "\r\n";
jpPrinter.addCommand(data)
};
jpPrinter.setFeed = function(feed) {
data = "FEED " + feed + "\r\n";
jpPrinter.addCommand(data)
};
jpPrinter.setBackFeed = function(backup) {
data = "BACKFEED " + backup + "\r\n";
jpPrinter.addCommand(data)
}
jpPrinter.setDirection = function(direction) {
data = "DIRECTION " + direction + "\r\n";
jpPrinter.addCommand(data)
};
jpPrinter.setReference = function(x, y) {
data = "REFERENCE " + x + "," + y + "\r\n";
jpPrinter.addCommand(data)
};
jpPrinter.setFromfeed = function() {
data = "FORMFEED \r\n";
jpPrinter.addCommand(data)
};
jpPrinter.setHome = function() {
data = "HOME \r\n";
jpPrinter.addCommand(data)
};
jpPrinter.setSound = function(level, interval) {
data = "SOUND " + level + "," + interval + "\r\n";
jpPrinter.addCommand(data)
};
jpPrinter.setLimitfeed = function(limit) {
data = "LIMITFEED " + limit + "\r\n";
jpPrinter.addCommand(data)
};
jpPrinter.setBar = function(x, y, width, height) {
data = "BAR " + x + "," + y + "," + width + "," + height + "\r\n"
jpPrinter.addCommand(data)
};
jpPrinter.setBox = function(x_start, y_start, x_end, y_end, thickness) {
data = "BOX " + x_start + "," + y_start + "," + x_end + "," + y_end + "," + thickness + "\r\n";
jpPrinter.addCommand(data)
};
jpPrinter.setErase = function(x_start, y_start, x_width, y_height) {
data = "ERASE " + x_start + "," + y_start + "," + x_width + "," + y_height + "\r\n";
jpPrinter.addCommand(data)
};
jpPrinter.setReverse = function(x_start, y_start, x_width, y_height) {
data = "REVERSE " + x_start + "," + y_start + "," + x_width + "," + y_height + "\r\n";
jpPrinter.addCommand(data)
};
jpPrinter.setText = function(x, y, font, x_, y_, str) { //打印文字
data = "TEXT " + x + "," + y + ",\"" + font + "\"," + 0 + "," + x_ + "," + y_ + "," + "\"" +
str + "\"\r\n"
jpPrinter.addCommand(data)
};
jpPrinter.setQR = function(x, y, level, width, mode, content) { //打印二维码
data = "QRCODE " + x + "," + y + "," + level + "," + width + "," + mode + "," + 0 + ",\"" +
content + "\"\r\n"
jpPrinter.addCommand(data)
};
jpPrinter.setBar = function(x, y, codetype, height, readable, narrow, wide, content) { //打印条形码
data = "BARCODE " + x + "," + y + ",\"" + codetype + "\"," + height + "," + readable + "," + 0 +
"," + narrow + "," + wide + ",\"" + content + "\"\r\n"
jpPrinter.addCommand(data)
};
//添加图片res为画布参数
jpPrinter.setBitmap = function(x, y, width, height, mode, res) {
// var width = parseInt((res.width) / 8 * 8 / 8)
// var height = res.height
// var imgWidth = res.width
var pointList = []
var resultData = []
data = "BITMAP " + x + "," + y + "," + width / 8 + "," + height + "," + mode + ","
jpPrinter.addCommand(data)
// console.log(res.data)
// console.log('---以上是原始数据---')
// for循环顺序不要错了外层遍历高度内层遍历宽度因为横向每8个像素点组成一个字节
for (var y = 0; y < height; y++) {
for (var x = 0; x < width; x++) {
let r = res.data[(y * width + x) * 4];
let g = res.data[(y * width + x) * 4 + 1];
let b = res.data[(y * width + x) * 4 + 2];
let a = res.data[(y * width + x) * 4 + 3]
//console.log(`当前${y}行${x}列像素,rgba值:(${r},${g},${b},${a})`)
// 像素灰度值
let grayColor = r * 0.299 + g * 0.587 + b * 0.114
//灰度值大于128位浅色可以不打印。128 还是其他值0~255可以自己拿捏
//1不打印, 0打印 参考佳博标签打印机编程手册tspl
if (grayColor > 128) {
pointList.push(1)
} else {
pointList.push(0)
}
}
}
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)
}
console.log('resultData', resultData.length)
for (var i = 0; i < resultData.length; ++i) {
// 使用 intToByte 后无法打印数据
// command.push(intToByte(resultData[i]))
command.push(resultData[i])
}
// \r\n
command.push(0x0D)
command.push(0x0A)
}
//打印页面
jpPrinter.setPagePrint = function(nums) {
data = "PRINT 1," + nums +"\r\n"
jpPrinter.addCommand(data)
};
//获取打印数据
jpPrinter.getData = function() {
return command;
};
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;
}
};
export default jpPrinter;