263 lines
6.2 KiB
JavaScript
263 lines
6.2 KiB
JavaScript
// 打印机纸宽58mm,页的宽度384,字符宽度为1,每行最多盛放32个字符
|
||
// 打印机纸宽80mm,页的宽度576,字符宽度为1,每行最多盛放48个字符
|
||
const PAGE_WIDTH = 576;
|
||
const MAX_CHAR_COUNT_EACH_LINE = 48;
|
||
|
||
//字符串转字节序列
|
||
export function stringToByte(str) {
|
||
var bytes = new Array();
|
||
var len, c;
|
||
len = str.length;
|
||
for (var i = 0; i < len; i++) {
|
||
c = str.charCodeAt(i);
|
||
if (c >= 0x010000 && c <= 0x10FFFF) {
|
||
bytes.push(((c >> 18) & 0x07) | 0xF0);
|
||
bytes.push(((c >> 12) & 0x3F) | 0x80);
|
||
bytes.push(((c >> 6) & 0x3F) | 0x80);
|
||
bytes.push((c & 0x3F) | 0x80);
|
||
} else if (c >= 0x000800 && c <= 0x00FFFF) {
|
||
bytes.push(((c >> 12) & 0x0F) | 0xE0);
|
||
bytes.push(((c >> 6) & 0x3F) | 0x80);
|
||
bytes.push((c & 0x3F) | 0x80);
|
||
} else if (c >= 0x000080 && c <= 0x0007FF) {
|
||
bytes.push(((c >> 6) & 0x1F) | 0xC0);
|
||
bytes.push((c & 0x3F) | 0x80);
|
||
} else {
|
||
bytes.push(c & 0xFF);
|
||
}
|
||
}
|
||
return bytes;
|
||
}
|
||
|
||
//字节序列转ASCII码
|
||
//[0x24, 0x26, 0x28, 0x2A] ==> "$&C*"
|
||
export function byteToString(arr) {
|
||
if (typeof arr === 'string') {
|
||
return arr;
|
||
}
|
||
var str = '',
|
||
_arr = arr;
|
||
for (var i = 0; i < _arr.length; i++) {
|
||
var one = _arr[i].toString(2),
|
||
v = one.match(/^1+?(?=0)/);
|
||
if (v && one.length == 8) {
|
||
var bytesLength = v[0].length;
|
||
var store = _arr[i].toString(2).slice(7 - bytesLength);
|
||
for (var st = 1; st < bytesLength; st++) {
|
||
store += _arr[st + i].toString(2).slice(2);
|
||
}
|
||
str += String.fromCharCode(parseInt(store, 2));
|
||
i += bytesLength - 1;
|
||
} else {
|
||
str += String.fromCharCode(_arr[i]);
|
||
}
|
||
}
|
||
return str;
|
||
}
|
||
//居中
|
||
export function Center() {
|
||
var Center = [];
|
||
Center.push(27);
|
||
Center.push(97);
|
||
Center.push(1);
|
||
var strCenter = byteToString(Center);
|
||
return strCenter;
|
||
}
|
||
|
||
//居左
|
||
export function Left() {
|
||
var Left = [];
|
||
Left.push(27);
|
||
Left.push(97);
|
||
Left.push(0);
|
||
var strLeft = byteToString(Left);
|
||
return strLeft;
|
||
}
|
||
//居右
|
||
export function Right() {
|
||
var right = [];
|
||
Left.push(27);
|
||
Left.push(97);
|
||
Left.push(2);
|
||
var strRight = byteToString(right);
|
||
return strRight;
|
||
}
|
||
//标准字体
|
||
export function Size1() {
|
||
var Size1 = [];
|
||
Size1.push(29);
|
||
Size1.push(33);
|
||
Size1.push(0);
|
||
var strSize1 = byteToString(Size1);
|
||
return strSize1;
|
||
}
|
||
//大号字体
|
||
/* 放大1倍 n = 0
|
||
* 长宽各放大2倍 n = 17 */
|
||
export function Size2(n) {
|
||
var Size2 = [];
|
||
Size2.push(29);
|
||
Size2.push(33);
|
||
Size2.push(n);
|
||
var strSize2 = byteToString(Size2);
|
||
return strSize2;
|
||
}
|
||
|
||
// 字体加粗
|
||
export function boldFontOn() {
|
||
var arr = []
|
||
arr.push(27)
|
||
arr.push(69)
|
||
arr.push(1)
|
||
var cmd = byteToString(arr);
|
||
return cmd
|
||
}
|
||
// 取消字体加粗
|
||
export function boldFontOff() {
|
||
var arr = []
|
||
arr.push(27)
|
||
arr.push(69)
|
||
arr.push(0)
|
||
var cmd = byteToString(arr);
|
||
return cmd
|
||
}
|
||
// 打印并走纸n行
|
||
export function feedLines(n = 1) {
|
||
var feeds = []
|
||
feeds.push(27)
|
||
feeds.push(100)
|
||
feeds.push(n)
|
||
var printFeedsLines = byteToString(feeds);
|
||
return printFeedsLines
|
||
}
|
||
// 切纸
|
||
export function cutPaper() {
|
||
var cut = []
|
||
cut.push(29)
|
||
cut.push(86)
|
||
cut.push(49)
|
||
var cutType = byteToString(cut);
|
||
return cutType
|
||
}
|
||
|
||
// 开钱箱
|
||
export function open_money_box() {
|
||
var open = []
|
||
open.push(27)
|
||
open.push(112)
|
||
open.push(0)
|
||
open.push(60)
|
||
open.push(255)
|
||
var openType = byteToString(open)
|
||
return openType
|
||
}
|
||
|
||
// 初始化打印机
|
||
export function init() {
|
||
var arr = []
|
||
arr.push(27)
|
||
arr.push(68)
|
||
arr.push(0)
|
||
var str = byteToString(arr)
|
||
return str
|
||
}
|
||
/*
|
||
设置左边距
|
||
len:
|
||
*/
|
||
|
||
export function setLeftMargin(len = 1) {
|
||
var arr = []
|
||
arr.push(29)
|
||
arr.push(76)
|
||
arr.push(len)
|
||
var str = byteToString(arr)
|
||
return str
|
||
}
|
||
|
||
// 设置打印区域宽度
|
||
export function setPrintAreaWidth(width) {
|
||
var arr = []
|
||
arr.push(29)
|
||
arr.push(87)
|
||
arr.push(width)
|
||
var str = byteToString(arr)
|
||
return str
|
||
}
|
||
|
||
/**
|
||
* @param str
|
||
* @returns {boolean} str是否全是中文
|
||
*/
|
||
export function isChinese(str) {
|
||
return /^[\u4e00-\u9fa5]$/.test(str);
|
||
}
|
||
|
||
// str是否全含中文或者中文标点
|
||
export function isHaveChina(str) {
|
||
if (escape(str).indexOf("%u") < 0) {
|
||
return 0
|
||
} else {
|
||
return 1
|
||
}
|
||
}
|
||
/**
|
||
* 返回字符串宽度(1个中文=2个英文字符)
|
||
* @param str
|
||
* @returns {number}
|
||
*/
|
||
export function getStringWidth(str) {
|
||
let width = 0;
|
||
for (let i = 0, len = str.length; i < len; i++) {
|
||
width += isHaveChina(str.charAt(i)) ? 2 : 1;
|
||
}
|
||
return width;
|
||
}
|
||
|
||
/**
|
||
* 同一行输出str1, str2,str1居左, str2居右
|
||
* @param {string} str1 内容1
|
||
* @param {string} str2 内容2
|
||
* @param {string} fillWith str1 str2之间的填充字符
|
||
* @param {number} fontWidth 字符宽度 1/2
|
||
*
|
||
*/
|
||
export function inline(str1, str2, fillWith = ' ', fontWidth = 1) {
|
||
const lineWidth = MAX_CHAR_COUNT_EACH_LINE / fontWidth;
|
||
// 需要填充的字符数量
|
||
let fillCount = lineWidth - (getStringWidth(str1) + getStringWidth(str2)) % lineWidth;
|
||
let fillStr = new Array(fillCount).fill(fillWith.charAt(0)).join('');
|
||
return str1 + fillStr + str2;
|
||
}
|
||
/**
|
||
* 用字符填充一整行
|
||
* @param {string} fillWith 填充字符
|
||
* @param {number} fontWidth 字符宽度 1/2
|
||
*/
|
||
export 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之间的填充字符
|
||
*/
|
||
export 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);
|
||
}
|