2024-05-09 15:08:34 +00:00
|
|
|
|
// 打印机纸宽58mm,页的宽度384,字符宽度为1,每行最多盛放32个字符
|
|
|
|
|
|
const PAGE_WIDTH = 384;
|
|
|
|
|
|
const MAX_CHAR_COUNT_EACH_LINE = 32;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @param str
|
|
|
|
|
|
* @returns {boolean} str是否全是中文
|
|
|
|
|
|
*/
|
|
|
|
|
|
function isChinese(str) {
|
|
|
|
|
|
return /^[\u4e00-\u9fa5]$/.test(str);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 返回字符串宽度(1个中文=2个英文字符)
|
|
|
|
|
|
* @param str
|
|
|
|
|
|
* @returns {number}
|
|
|
|
|
|
*/
|
|
|
|
|
|
function getStringWidth(str) {
|
|
|
|
|
|
let width = 0;
|
|
|
|
|
|
for (let i = 0, len = str.length; i < len; i++) {
|
|
|
|
|
|
width += isChinese(str.charAt(i)) ? 2 : 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
return width;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 同一行输出str1, str2,str1居左, str2居右
|
|
|
|
|
|
* @param {string} str1 内容1
|
|
|
|
|
|
* @param {string} str2 内容2
|
|
|
|
|
|
* @param {number} fontWidth 字符宽度 1/2
|
|
|
|
|
|
* @param {string} fillWith str1 str2之间的填充字符
|
|
|
|
|
|
*
|
|
|
|
|
|
*/
|
|
|
|
|
|
function inline(str1, str2, fillWith = ' ', fontWidth = 1) {
|
|
|
|
|
|
const lineWidth = MAX_CHAR_COUNT_EACH_LINE / fontWidth;
|
|
|
|
|
|
// 需要填充的字符数量
|
|
|
|
|
|
let fillCount = lineWidth - (getStringWidth(str1) + getStringWidth(str2) + 2) % lineWidth;
|
|
|
|
|
|
let fillStr = new Array(fillCount).fill(fillWith.charAt(0)).join('');
|
|
|
|
|
|
return str1 + fillStr + str2;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 用字符填充一整行
|
|
|
|
|
|
* @param {string} fillWith 填充字符
|
|
|
|
|
|
* @param {number} fontWidth 字符宽度 1/2
|
|
|
|
|
|
*/
|
|
|
|
|
|
function fillLine(fillWith = '-', fontWidth = 1) {
|
|
|
|
|
|
const lineWidth = MAX_CHAR_COUNT_EACH_LINE / fontWidth;
|
|
|
|
|
|
return new Array(lineWidth).fill(fillWith.charAt(0)).join('');
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 文字内容居中,左右用字符填充
|
|
|
|
|
|
* @param {string} str 文字内容
|
|
|
|
|
|
* @param {number} fontWidth 字符宽度 1/2
|
|
|
|
|
|
* @param {string} fillWith str1 str2之间的填充字符
|
|
|
|
|
|
*/
|
|
|
|
|
|
function fillAround(str, fillWith = '-', fontWidth = 1) {
|
|
|
|
|
|
const lineWidth = MAX_CHAR_COUNT_EACH_LINE / fontWidth;
|
|
|
|
|
|
let strWidth = getStringWidth(str);
|
|
|
|
|
|
// 内容已经超过一行了,没必要填充
|
|
|
|
|
|
if (strWidth >= lineWidth) {
|
|
|
|
|
|
return str;
|
|
|
|
|
|
}
|
|
|
|
|
|
// 需要填充的字符数量
|
|
|
|
|
|
let fillCount = lineWidth - strWidth;
|
|
|
|
|
|
// 左侧填充的字符数量
|
|
|
|
|
|
let leftCount = Math.round(fillCount / 2);
|
|
|
|
|
|
// 两侧的填充字符,需要考虑左边需要填充,右边不需要填充的情况
|
|
|
|
|
|
let fillStr = new Array(leftCount).fill(fillWith.charAt(0)).join('');
|
|
|
|
|
|
return fillStr + str + fillStr.substr(0, fillCount - leftCount);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ArrayBuffer转16进度字符串示例
|
|
|
|
|
|
function ab2hex(buffer) {
|
|
|
|
|
|
const hexArr = Array.prototype.map.call(
|
|
|
|
|
|
new Uint8Array(buffer),
|
|
|
|
|
|
function(bit) {
|
|
|
|
|
|
return ('00' + bit.toString(16)).slice(-2)
|
|
|
|
|
|
}
|
|
|
|
|
|
)
|
|
|
|
|
|
return hexArr.join(',')
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-05-10 17:42:41 +00:00
|
|
|
|
// 打印图片,需要根据图片宽度算出rate, rate = 图片宽度/imgRateSize
|
|
|
|
|
|
const imgRateSize = 8
|
|
|
|
|
|
|
|
|
|
|
|
// 默认240宽度 注意!! 图片宽度必须是8的倍数
|
|
|
|
|
|
const makeImageCode = (data, width = 240)=> {
|
|
|
|
|
|
//我的图片宽度是240,那么拼接的指令就是[29, 118, 48, 0, 30, 0, 240, 0]
|
|
|
|
|
|
//我的图片宽度是160,那么拼接的指令就是[29, 118, 48, 0, 20, 0, 160, 0]
|
|
|
|
|
|
//补充一点,打印非二维码的图片,宽度一定要是24的倍数,不然打印也会出现乱码
|
|
|
|
|
|
let rate = width / imgRateSize
|
|
|
|
|
|
|
|
|
|
|
|
return [
|
|
|
|
|
|
[27, 97, 1], [29, 118, 48, 0, 1*rate, 0, 8*rate, 0], data, [27, 74, 3], [27, 64]
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
2024-05-09 15:08:34 +00:00
|
|
|
|
|
|
|
|
|
|
export {
|
|
|
|
|
|
inline,
|
|
|
|
|
|
fillLine,
|
|
|
|
|
|
fillAround,
|
|
|
|
|
|
ab2hex,
|
2024-05-10 17:42:41 +00:00
|
|
|
|
imgRateSize,
|
|
|
|
|
|
makeImageCode,
|
2024-05-09 15:08:34 +00:00
|
|
|
|
};
|