From e82e92c6d9ab8fb55b20950df6ca0882c7bf3cf9 Mon Sep 17 00:00:00 2001 From: aihe <961836564@qq.com> Date: Sun, 12 May 2024 00:46:09 +0800 Subject: [PATCH] uu --- .../tpx-bluetooth-print/print/commands.js | 193 ------------ components/tpx-bluetooth-print/print/gbk.js | 191 ----------- .../tpx-bluetooth-print/print/printJob.js | 298 ++++++++++++++++++ .../tpx-bluetooth-print/print/printerjobs.js | 220 ------------- .../tpx-bluetooth-print/print/printerutil.js | 107 ------- components/tpx-bluetooth-print/print/util.js | 68 ---- .../print/weapp.qrcode.esm.js | 5 - .../tpx-bluetooth-print.vue | 169 +++++----- 8 files changed, 376 insertions(+), 875 deletions(-) delete mode 100644 components/tpx-bluetooth-print/print/commands.js delete mode 100644 components/tpx-bluetooth-print/print/gbk.js create mode 100644 components/tpx-bluetooth-print/print/printJob.js delete mode 100644 components/tpx-bluetooth-print/print/printerjobs.js delete mode 100644 components/tpx-bluetooth-print/print/printerutil.js delete mode 100644 components/tpx-bluetooth-print/print/util.js delete mode 100644 components/tpx-bluetooth-print/print/weapp.qrcode.esm.js diff --git a/components/tpx-bluetooth-print/print/commands.js b/components/tpx-bluetooth-print/print/commands.js deleted file mode 100644 index 1bea463..0000000 --- a/components/tpx-bluetooth-print/print/commands.js +++ /dev/null @@ -1,193 +0,0 @@ -/** - * 修改自https://github.com/song940/node-escpos/blob/master/commands.js - * ESC/POS _ (Constants) - */ -var _ = { - LF: [0x0a], - FS: [0x1c], - FF: [0x0c], - GS: [0x1d], - DLE: [0x10], - EOT: [0x04], - NUL: [0x00], - ESC: [0x1b], - EOL: '\n', -}; - -/** - * [FEED_CONTROL_SEQUENCES Feed control sequences] - * @type {Object} - */ -_.FEED_CONTROL_SEQUENCES = { - CTL_LF: [0x0a], // Print and line feed - CTL_GLF: [0x4a, 0x00], // Print and feed paper (without spaces between lines) - CTL_FF: [0x0c], // Form feed - CTL_CR: [0x0d], // Carriage return - CTL_HT: [0x09], // Horizontal tab - CTL_VT: [0x0b], // Vertical tab -}; - -_.CHARACTER_SPACING = { - CS_DEFAULT: [0x1b, 0x20, 0x00], - CS_SET: [0x1b, 0x20] -}; - -_.LINE_SPACING = { - LS_DEFAULT: [0x1b, 0x32], - LS_SET: [0x1b, 0x33] -}; - -/** - * [HARDWARE Printer hardware] - * @type {Object} - */ -_.HARDWARE = { - HW_INIT: [0x1b, 0x40], // Clear data in buffer and reset modes - HW_SELECT: [0x1b, 0x3d, 0x01], // Printer select - HW_RESET: [0x1b, 0x3f, 0x0a, 0x00], // Reset printer hardware -}; - -/** - * [CASH_DRAWER Cash Drawer] - * @type {Object} - */ -_.CASH_DRAWER = { - CD_KICK_2: [0x1b, 0x70, 0x00], // Sends a pulse to pin 2 [] - CD_KICK_5: [0x1b, 0x70, 0x01], // Sends a pulse to pin 5 [] -}; - -/** - * [MARGINS Margins sizes] - * @type {Object} - */ -_.MARGINS = { - BOTTOM: [0x1b, 0x4f], // Fix bottom size - LEFT: [0x1b, 0x6c], // Fix left size - RIGHT: [0x1b, 0x51], // Fix right size -}; - -/** - * [PAPER Paper] - * @type {Object} - */ -_.PAPER = { - PAPER_FULL_CUT: [0x1d, 0x56, 0x00], // Full cut paper - PAPER_PART_CUT: [0x1d, 0x56, 0x01], // Partial cut paper - PAPER_CUT_A: [0x1d, 0x56, 0x41], // Partial cut paper - PAPER_CUT_B: [0x1d, 0x56, 0x42], // Partial cut paper -}; - -/** - * [TEXT_FORMAT Text format] - * @type {Object} - */ -_.TEXT_FORMAT = { - TXT_NORMAL: [0x1b, 0x21, 0x00], // Normal text - TXT_2HEIGHT: [0x1b, 0x21, 0x10], // Double height text - TXT_2WIDTH: [0x1b, 0x21, 0x20], // Double width text - TXT_4SQUARE: [0x1b, 0x21, 0x30], // Double width & height text - - TXT_UNDERL_OFF: [0x1b, 0x2d, 0x00], // Underline font OFF - TXT_UNDERL_ON: [0x1b, 0x2d, 0x01], // Underline font 1-dot ON - TXT_UNDERL2_ON: [0x1b, 0x2d, 0x02], // Underline font 2-dot ON - TXT_BOLD_OFF: [0x1b, 0x45, 0x00], // Bold font OFF - TXT_BOLD_ON: [0x1b, 0x45, 0x01], // Bold font ON - TXT_ITALIC_OFF: [0x1b, 0x35], // Italic font ON - TXT_ITALIC_ON: [0x1b, 0x34], // Italic font ON - - TXT_FONT_A: [0x1b, 0x4d, 0x00], // Font type A - TXT_FONT_B: [0x1b, 0x4d, 0x01], // Font type B - TXT_FONT_C: [0x1b, 0x4d, 0x02], // Font type C - - TXT_ALIGN_LT: [0x1b, 0x61, 0x00], // Left justification - TXT_ALIGN_CT: [0x1b, 0x61, 0x01], // Centering - TXT_ALIGN_RT: [0x1b, 0x61, 0x02], // Right justification -}; - -/** - * [BARCODE_FORMAT Barcode format] - * @type {Object} - */ -_.BARCODE_FORMAT = { - BARCODE_TXT_OFF: [0x1d, 0x48, 0x00], // HRI barcode chars OFF - BARCODE_TXT_ABV: [0x1d, 0x48, 0x01], // HRI barcode chars above - BARCODE_TXT_BLW: [0x1d, 0x48, 0x02], // HRI barcode chars below - BARCODE_TXT_BTH: [0x1d, 0x48, 0x03], // HRI barcode chars both above and below - - BARCODE_FONT_A: [0x1d, 0x66, 0x00], // Font type A for HRI barcode chars - BARCODE_FONT_B: [0x1d, 0x66, 0x01], // Font type B for HRI barcode chars - - BARCODE_HEIGHT: function (height) { // Barcode Height [1-255] - return [0x1d, 0x68, height]; - }, - BARCODE_WIDTH: function (width) { // Barcode Width [2-6] - return [0x1d, 0x77, width]; - }, - BARCODE_HEIGHT_DEFAULT: [0x1d, 0x68, 0x64], // Barcode height default:100 - BARCODE_WIDTH_DEFAULT: [0x1d, 0x77, 0x01], // Barcode width default:1 - - BARCODE_UPC_A: [0x1d, 0x6b, 0x00], // Barcode type UPC-A - BARCODE_UPC_E: [0x1d, 0x6b, 0x01], // Barcode type UPC-E - BARCODE_EAN13: [0x1d, 0x6b, 0x02], // Barcode type EAN13 - BARCODE_EAN8: [0x1d, 0x6b, 0x03], // Barcode type EAN8 - BARCODE_CODE39: [0x1d, 0x6b, 0x04], // Barcode type CODE39 - BARCODE_ITF: [0x1d, 0x6b, 0x05], // Barcode type ITF - BARCODE_NW7: [0x1d, 0x6b, 0x06], // Barcode type NW7 - BARCODE_CODE93: [0x1d, 0x6b, 0x48], // Barcode type CODE93 - BARCODE_CODE128: [0x1d, 0x6b, 0x49], // Barcode type CODE128 -}; - -/** - * [IMAGE_FORMAT Image format] - * @type {Object} - */ -_.IMAGE_FORMAT = { - S_RASTER_N: [0x1d, 0x76, 0x30, 0x00], // Set raster image normal size - S_RASTER_2W: [0x1d, 0x76, 0x30, 0x01], // Set raster image double width - S_RASTER_2H: [0x1d, 0x76, 0x30, 0x02], // Set raster image double height - S_RASTER_Q: [0x1d, 0x76, 0x30, 0x03], // Set raster image quadruple -}; - -/** - * [BITMAP_FORMAT description] - * @type {Object} - */ -_.BITMAP_FORMAT = { - BITMAP_S8: [0x1b, 0x2a, 0x00], - BITMAP_D8: [0x1b, 0x2a, 0x01], - BITMAP_S24: [0x1b, 0x2a, 0x20], - BITMAP_D24: [0x1b, 0x2a, 0x21] -}; - -/** - * [GSV0_FORMAT description] - * @type {Object} - */ -_.GSV0_FORMAT = { - GSV0_NORMAL: [0x1d, 0x76, 0x30, 0x00], - GSV0_DW: [0x1d, 0x76, 0x30, 0x01], - GSV0_DH: [0x1d, 0x76, 0x30, 0x02], - GSV0_DWDH: [0x1d, 0x76, 0x30, 0x03] -}; - -/** - * [BEEP description] - * @type {string} - */ -_.BEEP = [0x1b, 0x42]; // Printer Buzzer pre hex - -/** - * [COLOR description] - * @type {Object} - */ - -_.COLOR = { - 0: [0x1b, 0x72, 0x00], // black - 1: [0x1b, 0x72, 0x01] // red -}; - -/** - * [exports description] - * @type {[type]} - */ -export default _ diff --git a/components/tpx-bluetooth-print/print/gbk.js b/components/tpx-bluetooth-print/print/gbk.js deleted file mode 100644 index b88ce4f..0000000 --- a/components/tpx-bluetooth-print/print/gbk.js +++ /dev/null @@ -1,191 +0,0 @@ -var GBK = function(gbk_us) { - var arr_index = 0x8140; //33088; - var gbk = { - decode: function(arr) { - var str = ""; - for (var n = 0, max = arr.length; n < max; n++) { - var code = arr[n] & 0xff; - if (code > 0x80 && n + 1 < max) { - var code1 = arr[n + 1] & 0xff; - if (code1 >= 0x40) { - code = gbk_us[(code << 8 | code1) - arr_index]; - n++; - } - } - str += String.fromCharCode(code); - } - return str; - }, - encode: function(str) { - str += ''; - var gbk = []; - var wh = '?'.charCodeAt(0); //gbk中没有的字符的替换符 - for (var i = 0; i < str.length; i++) { - var charcode = str.charCodeAt(i); - if (charcode < 0x80) gbk.push(charcode); - else { - var gcode = gbk_us.indexOf(charcode); - if (~gcode) { - gcode += arr_index; - gbk.push(0xFF & (gcode >> 8), 0xFF & gcode); - } else { - gbk.push(wh); - } - } - } - return gbk; - } - }; - return gbk; -}; -var gbk = GBK; - -var URI = function(GBK) { - var passChars = '!\'()*-._~'; - var otherPassChars = '#$&+,/:;=?@'; - - function getModue(passChars) { - var passBits = passChars.split('').sort(); - var isPass = function(s) { - return ~passChars.indexOf(s) || /[0-9a-zA-Z]/.test(s) - }; - return { - encode: function(str) { - return (str + '').replace(/./g, function(v) { - if (isPass(v)) return v; - var bitArr = GBK.encode(v); - for (var i = 0; i < bitArr.length; i++) { - bitArr[i] = '%' + ('0' + bitArr[i].toString(16)).substr(-2).toUpperCase(); - } - return bitArr.join(''); - }) - }, - decode: function(enstr) { - enstr = String(enstr); - var outStr = ''; - for (var i = 0; i < enstr.length; i++) { - var char = enstr.charAt(i); - if (char === '%' && i + 2 < enstr.length) { - var code1 = parseInt(enstr.substr(i + 1, 2), 16); - if (!isNaN(code1)) { - var _i = i + 2; - if (code1 > 0x80) { - var code2; - if (enstr.charAt(_i + 1) === '%') { - code2 = parseInt(enstr.substr(_i + 2, 2), 16); - _i += 3; - } else { - code2 = enstr.charCodeAt(_i + 1); - _i += 1; - } - if (code2 >= 0x40) { - i = _i; - outStr += GBK.decode([code1, code2]); - continue; - } - } else { - i += 2; - outStr += String.fromCharCode(code1); - continue; - } - } - } - outStr += char; - } - return outStr; - - } - } - } - - var URIComponent = getModue(passChars); - var URI = getModue(passChars + otherPassChars); - - return { - encodeURI: URI.encode, - decodeURI: URI.decode, - encodeURIComponent: URIComponent.encode, - decodeURIComponent: URIComponent.decode - } -}; - -var src = function(gbk_us) { - var gbk$$1 = gbk(gbk_us); - gbk$$1.URI = URI(gbk$$1); - return gbk$$1; -}; - -// 多进制转换后的数字还原函数 构建时会替换占位符 -var Fn_Hex_decode = function decode() { - var n = 0, - str = arguments[0]; - for (var i = 0, w = str.length; i < w; i++) { - var code = str.charCodeAt(i); - if (code < 38 || code > 126) return NaN; - n += (code - 38) * Math.pow(89, w - i - 1); - } - return n; -}; - -// 解压Unicode编码字符串函数 构建时会替换占位符 -var Fn_unzip = function unZip() { - return arguments[0].replace(/\x23(\d+)\x24/g, function(a, b) { - return Array(+b + 4).join("#"); - }) - .replace(/[\x26-\x7e]\x25[\x26-\x7e]/g, function(a) { - var b = a.substr(0, 1).charCodeAt(0), - e = a.substr(2).charCodeAt(0), - str = String.fromCharCode(b); - while (b++ < e) { - str += String.fromCharCode(b); - } - return str; - }) - .replace(/\x23/g, "###") - .replace(/([\x26-\x7e]{2})\x21([\x26-\x7e\x23]+)(?:\x20|$)/g, function(all, hd, dt) { - return dt.replace(/./g, function(a) { - if (a != "#") { - return hd + a; - } else { - return a; - } - }); - }) - .match(/.../g); -}; - -function gbkArray(gbkArr) { - var data = []; - for (var i = 0x81, k = 0; i <= 0xfe; i++) { - if (data.length > 0) { - data.length += 0x40 + 1; - } - for (var j = 0x40; j <= 0xfe; j++) { - if ( - (j == 0x7f) || - ((0xa1 <= i && i <= 0xa7) && j <= 0xa0) || - ((0xaa <= i && i <= 0xaf) && j >= 0xa1) || - (0xf8 <= i && j >= 0xa1) - ) { - data.push(undefined); - continue; - } - var hex = gbkArr[k++]; - var key = Fn_Hex_decode(hex); - data.push(key ? key : undefined); - } - } - return data; -} -var GBK$1 = function() { - // 生成按GBk编码顺数排列的编码映射数组 构建时会替换 zipData 的占位符 - var gbk_us = gbkArray(Fn_unzip( - "(T!HJ%LUX]e%gilotuwy{} (U!)-%/137>BDGHO%RTUW%\\_a%jl%rtw} (V!*+-0%27>C%EHJ%MP%R\\`cdfn%ptvz{} (W!()*,/3%579;=%CFGM%QWX\\^cdg%ilnprtvy%} (X!&')%.468CDHJLMOPSTWY%\\_b%dg%ilnprtuwxz%|~ (Y!'(*+-469%=?%GI%KO%RT%V[%_bdikmnptuy{}~ (Z!&')+%-/%;>@ACE%GKMNPR%TW[_%ikmo%rt%vy%{} ([!'(%+-%024%;=%BD%LO%QSTX%[]^`%ce%y{} (\\!()+%/1%7:%LN%SU%WY%cf%im%prt%xz%~ (]!&'%*-%/1%68%EG%cgloqs%uwx|%~ (^!')%-/02356;>FJKOPRSVWZ%]_`dfi%kmor%vyz (_!'+%-124%68;=@ACE%MOQRUVX%]_adegjqwx|~ (`!&)*-%/689;%=?%ADFIKLNOVX^%cehilmoq%uwyz|%~ (a!'),%/124%=?AD%HJ%PRSU%[]e%ho%qu%~ (b!()*,%.024%79;%=?A%FH%KM%WY%`c%ei%loq%tvy%| (c!'*+-.1346%8:%<>%GKLOQSUZ%\\_cghjltwy{| (d!(,/1%4679=>@D%JLMOQRTVWZ]`%ce%km%pr%tvy%} (e!+,-/0279%;>?DQW[%]_bdhqu%wy (f!&().47:;>ACEFHIKMP%SU^a%egikm%tx}~ (g!)*,.02%58<>BCGI%MPY[]`%bdeginpuv (h!(*-2%6=>A%CF%KMPRT%WZ\\%`deg%ln%qswxz{} (i!&+-%/1%469;>@AD%HJ%MP%TV%Y[\\abdh%mrsvx~ (j!&,%.0235%7:;>@%FH%PRTVXZ\\_%cf%hjkn%puw%{~ (k!').04578;=?%CFI%NQRTW%^`acdg%ilmo%ru%wz|~ (l!&(*%,.%9=%ACDHIK%OQS%U[%^`%ce%hk%ru%{~ (m!&')%79%CE%KM%PR%^`%hjkmnqxz%~ (n!&(*+./2%478<%>ACG%WYZ\\%^`%cgmnp%txy{} (o!&'%)+,.5%9;%BE%UWZ\\^%`b%il%ps%ux%~ (s!&)%:<%?A%CE%OQ%SU%bd%ilnpqstvwy%~ (t!&')+,.%246%9=>ACDF%ILNRVXY[\\ac%fiklprsvxy (u!&(%,.013%?BDG%IK%MRVXY[%^abeg%jl%ostyz}~ (v!'(%,.013%9;%=@%CIJMOR%VXZ[]%_a%lnp%rtv~ (w!&(%+-/%24%689<=?A%CE%KNPR%VX%Z\\%`bcf%oq%tv%|~ (x!&'(*+-%5:;=%@B%SU%[^%km%svxy{%~ (y!&(),%1346%:<>@B%DF%HKMNPQSU%Y[%qs%~ (z!()%ACEFH%OQ%_bfnpqwx{}~ ({!&)+-%023569=ADEG%IKMV^%`c%fhinq%swxz (|!&'%)+%-/2%:>@ADEG%KMO%U[\\^`acefi%lnpquwy|%~ (}!&(+-%02%578:%?AI%MP%TVZ%\\^`be%hjlnoq%vx%} )&!&'%+-%356:<>?ABD%MO%TWX[%`b%fhj%mopr%vx{}~ )'!&)%-/%69%@BCG%QSTVX%bdghj%mo%{}~ )(!&'%9;%=?%WY%eg%mo%{} ))!'(+,2458=>@%DGHLOQ%SUVZ[_f%mp%twxz%~ )*!()-%025%:<%BE%IKLNOR%`dfhmp%rtwx{%} )+!(.137%:>%BD%HJP%SU%^a%fjkm%pr%} ),!&(%02568%:B%DFI%KMOQSVWY%[^%aehikmo%uxz%|~ )-!&'%358=%@B%DGIKLORSVX%Z\\^a%cgjq%suwxz~ ).!&(%+-%2467:%?AC%FI%MRSUVY^%`e%gijmnpqstwz{}~ )/!&()+,.9%;=>BCEIJLPQT%V^%`b%fh%loprv%|~ )0!'(*,-/%1457%:>?GJKMNPWY%[^%acdg%jlnp%ruwz{}~ )1!')*.035%79:=%DG%IL%PR%TVWY[^a%ejqruwx{%~ )2!&)%,.1%37%;=%@B%EHILO%QS%eg%nprtvwy%{}~ )3!&'%*,%/1%47%=?%BDF%XZ[]%ac%jl%txy{%~ )4!&'%+-%24%68%<>A%EHJ%Z\\%ik%su%z|~ )5!/058%:@D%FH%KN%SW\\_%afijlmp%su%wy%{} )7!(*+-59;?GHJKNTUZ\\_b%ejm%pt%wyz|%~ )8!&(%*-78:=%?ABD%ILMO%RUXY[b%eg%nqu%wy{%} )9!'(*%-014%79;%>CEIK%MOQ%WY\\^cgijmnqsuw%{} ):!&')%+02%46%<>AC%GJKM%PRTVX%[]bce%ilmpqt%y|~ );!()%+-%/14%9;%?ABDFHIOQ%WY[%]_%ce%lnp%rt%} )!'(+%.2578;%?ABEFHIKM%ORSUWZ%\\_`b%eh%jlnpqs%~ )?!&'(*%,/%146%8:ABD%HJMNP%RTVY%[_%ac%egj%mor%uwy{| )A!'(%+-/024%:=>@AHIK%NPRSUWY%]a%cehik%mo%qsuvx%{}~ )B!&')%,/%35%=@%DF%JL%OQ%TV%oqu%|~ )C!&(%-/34689;?%EJLMO%QTV%XZ\\^%ceglnpqt%wyz|} )D!&)*,/0279:<%@BG%IKLPQSVY[]%`beghjkmoq%tv%y{~ )E!'+%-0258:=>@E%LNQ%Za%cgkmopr%tvwyz~ )F!()%/14%79@CEGHK%OQ%SU%[^%dg%imnrz~ )G!'),0%9DF%MOR%Z\\^a%hj%ln%pr%{}~ )H!&*%-/2357%@BD%IKMO%RTUWXZ\\%`bce%nps%uw%y|~ )I!&'(*%,.%2479;%FI%KM%TVWY%[]%`b%dfhik%{}~ )J!'(*+.01346%9;<>?A%EIJL%NPRTY%[]%befhil%uxy{}~ )K!&()+,.%02%68%?ACEG%IK%PR%TW%bd%gi%rtv%~ )L!&(%36%;=?%DFH%KMO%QS%Y\\%`bce%ln%twy%} )M!&'(*%46%<>?A%CE%GI%QSV%Z\\%ce%lnq%~ )N!&'%~ )O!&'%178:%CE%HJM%OQ%TVWZ\\]_%jl%sz{}~ )P!&'%136%9>AEG%JMNP%RU%Y[%bd%koq%wy|} )Q!&'%*,.018:<%@B%IL%NP%RTV%XZ%\\^%dh%lnrw|%~ )R!'*,2%48:=>@%CEFJ%LOR%VX%Z]_%aijl%nr%vxz|~ )S!&(%*-.2589;ABGINTUWXZ[]%_bd%fh%kmqrt%y{}~ )U!()+,02%46;<>@EHLQ%TWY[]^`acdg%il%oqru%wy%} )V!&')*-.02359%=?EHOPSTVWYZ\\%ad%fk%mp%su%xz}~ )W!&),-/1%479:<>%@BDG%NP%SUY\\]_bcefhilp%rtvxz{} )X!&'(*,%36%=@%CFHJKM%OQ%[]^`%nq%suxy{%~ )Y!&)%/1%35689;<>@AC%FHKMPQTV%X[%^`%bd%fhjnpqs%u{ )Z!&)%24%79%@B%DFGI%MO%QU%^`%bd%gkmoqstv%|~ )[!&'%+.%024%=?%ACE%GI%KM%RU%WY[%]_ac%ik%mpqu%~ )\\!&'(*%-/%35%?ABDEG%LNP%UW%]`%jlo%z}~ )]!&'%DF%MP%VX%hj%ln%~ )^!&()+%8:%EIL%ORT%VX\\%_a%cf%hj%lnrsuvy%~ )_!&'%,246%8<@AF%IKM%Y\\^%`b%eglpr%xz|%~ )`!'(%14%8:;=@D%NP%W[%^`%mo%rtvx%~ )a!&'%+-/%359%=?%AD%GIKLN%SU%Y[%^`%ce%gj%nq%wy%{}~ )b!&'%)+-%/1%9;%DF%JM%VX%[]_%df%oq%|~ )c!&'%:<%EGIK%MP%RXZ\\^%dg%il%oq%suvxz|~ )d!()*-/%25689;%=@%BGHJ%NQSUVX%ce%psv%xz )e!&'%,1%35%8;=?%BDFG 'W!,-. &(+&.'&-~&'u'W!/1 ')>.= '.u'/!K. '0`'/!94 '1t'0T'/!?Bu`\\Q1t '0!)* '/!xy2IH ';!*( &'}')!\\] '+{.;U&'q.>!&' ')Z&'t',5':!GF '9!eiha`;:ML ')e'-!XVWY 'W?'-!67%?#3$ '6!-.%@ '5!rs%~ '6!&'%, '5!^_%g## ']!67%?## '-!&'%1## .;!RST .>+.;!VW%~ .)'W!mn%~ 'X!&'%f#8$t%~ 'Y!&'%p#5$ &0!=>%MO%U#5$]%mo%u#4$ .9!89<=BC@AD%G##>?:;4#67#6$ &1!cd%hTi%~ &2!&'%)#12$*%/K0%I#10$ &.!()7 ')!=?O_ '+}',('-!\\]%_ '/!)37fz{ '0z'8!CD%ft%~ '9!&'%)-%/VW|%~ ':!&J '0P'W!>IJ#8$ &(!uU &+7&(T&).&(]&)6&(\\&)F&(a&+9&(`&)h&(g&+;&(f&*-&(n&+=&(m&+!?ACE &(!p^ &,a-Qc&)!_c -Qd&,q#1$'Z!&'%J#18$ 'W!MN%U '^`'a!@AN%PSv 'b!'*+. .93.>!(*# ',@']G#'):#0$'Yv'X!no 'Y!wx 'W2'X!pq .9!LM%UW%Z\\%ik%n -R!*+%6 'W3#10$'7!LM%~ '8!&'%>#12$ )e!HIKN%SVWabei%lnp%uw%y{%~ )f!'+%-23679%;@BCEFHIM%PS%_abdf%ik%rt%~ )g!(*%79%=?@BDFGIJL%OQ%TV%XZ[]%bdfgkn%prsv%y{}~ )h!&'(,-/3%9;%>@B%EGIK%MO%RT%cehil%or%z}~ )i!&'%)+,/13579:?%CE%HJ%\\^`eh%tvwy%} )j!'(%,.13%57%9;<>@%JLN%UY%hj%~ )k!&')%1357;=%CF%IKN%TV%Y[%bdfhj%mqstv%z|} )l!'+1369:<>%ACDFGJM%PR%UZ%ad%fh%npr%tw%{}~ )m!&()+%.0%2479@%CEFHIMOQ%TVX%Z\\%_aeg%ilnrswyz|} )o!()+%-/346%=@%EGI%MOQ%TV%\\^%`b%iklnq%suw{|~ )p!&()+-.013%<>%FHILN%WYZ\\ (iC*r5(pM)89(gy(h[(gk)p*)o>*A;)s|*9E)ui)cO*s5*ux)R/({@(Z*)7s)B.(~d*4~)F{*42)@K)pg(_l)>Q)a|*2'*Jb(\\0(u2)4?)\\@*9t)8])5n(eJ(f+)|s(^7)mH))<)7>*Yr*ua)6M*2O(o@*t|*0J)cV)oo)E[)op);L(XR*W~)7F)z6)?3)hN);2)66*8L*xa)Dd)cf)61)76(Wo)k9(cY(a_*.d*b,))v)G`)Jk*6R*.k)HS)vH*E'*oR([d*U/*:L*4b(bm*L>(a&)p!]`bdelnrsu%wy%} )q!&'%-035%7:;=?@BCEFJLN%X[%^ac%egj%lnp%ty{}~ )r!&)+%-/%69%@C *B**t=(Yf(qR*{F({T)6!th )BK*V+++A)b})DT)um)12(c!`& *^r*4P*Wv*mT(Z=)e4(t-)1k)`B*K0(tz*:])Cj)}<)&|*/8)l*)TJ*[[*`!0t +3')Q4*cF)}()-`)v**@.*A<)Q!596 ))I)*v)nD*q<)>X),G).P*_0(s@*7;*a^*rQ*v?*_J*/W*X,)5](YH(e5(cm*_!9:< *a,)F:)-N*6j*JF+,1)3Y(`E)nu)-P)?.)\\_)Z'({u);N(^!A| )EP(T_)yA*{Q)_5)r!DE%GKNPQT%_a%ch%jm%rvwz%~ )s!&'%,/12469;%=?@BD%HJLN%Z\\%df%hk%or )mi)*e)gu*=C)(dx*E0)PD)1!mh )^Z*:;*8Q(Vg)SU*Bu)Y)lB(i*(ZQ*Y,)6G*mQ)C[(ky)[T))*(f9)^m*^P)62)*Y(*JJ)<>)yh(pX)Lv)5,(fL(UE)z*)1i)[j*T>)6B*`V*~U)y\\(e`)n?)7k(c()Rg*_p),X*~:*2q+3k(Xj(}?*Xd*1T)?G)_?(]j(^~*D_)&Z({W)7'*d@)lq*ZZ)z?)2()~4(V[*/9)rl(TW*7f(`7(_m)M5(d^*[|*n^*sl)YY*rZ)J))u!`abdfgklnp%ruyz|~ )v!')+%28%;=%@BCE%GI%KO%RT%VY%[]%jl%np%tvxy{|~ )w!&'%*,%.0%6 )tu(\\&)se):o*N`(t*):B)(~){E)Ie(W[*8Y(j8(Tx)mR){])*!Qy *q>(`5(f=)^e)9.*n~(oe)@n)Ig*d[(hY)W=*.I*IY)5O*/1)mY*;=)vD*si*_/)2o)kM*T1)Ov(`T*XP)O3*3G*>{(n-(bn(Vb(Ta(_D*(G*d_*&i(YL*[t*&C){b);m)&g(\\**51)nL*(i)W6*1o)D6(zh(|V)vN)<[):r)9b)8<*ns);3*_O)}h)nt)5o(tM(fJ)P2([z)5P))n)P?(Vw*X7*Ji)-i*`f)w!78%<>%GI%MO%]_%cgil%oqt%|~ )x!&)*2457:%=?A%GJL%PSTW%Z\\%_a%c )/R*2s)7/(U&(cd*b~)9p*4J)@/)R5(X()1n)W+*TB),v*Ef)-7)82(^&*;v)G=(_s)8t*[=(ZB(~G)xH(|Z(`J)zZ)1<*a2)pp).B)-{)ov*[a)^J)om)}])s8(_f*ar(qU(X0)Z3*_{)>G)}/)e0)VG*1n(yJ)6x)++(nl*?3)}@))e),\\*`J*/U*y')9:)Y_)ut)_;(^D*uF(p5)l2(W~)l5)+-)1f(u-)Vc)Px)ue(eY*sr(_!>t )9A(eg*mF*Tg*Ys)cW)u{*G_*_~*Tq(e=)x!de%jl%wy%~ )y!&'%*,%047:<=?@BDF%HKLNOQ%VX%Z]`bdfi%oqrtvwy|} )z!&'%)+.%24578:; (TG)q/(eK*m<*xV+2S*o.({Q*S_(T!hb (^x*>m)47(ai)F>(Xy)0D(_.)Ts(^()6Y)?9*rW*UQ*`O)m|*c*)rJ)Q2)dO)eX*T_(qf)r`*XL)DA*oA*3w)+<)Wk(u_)|\\)s{*o<)Pn)?O*/O(q7(]v*qn(|W(s((f,*[g)>a*x_(my*mP)q>*`y)9?(gq(t!@` (o~*\\N)Cs*ZH*8U(`[)1p(qF*F@)&;+0<(YM*x}*Sv(w@)0O(d:)6?*a.*c/*{T)0B*2B(]d*2i(|r*{J)U-(Uy)z!<>@AC%QS%UWY]_%df%oq%uw%~ ){!&'%57%9;A%DHKMO%RT%VYZ_%adgh *X0(e.*0B)}c(WK(U<*qO)T*)h1*C6))N)lg*21)L')t3*mE*-4(_T)_h(e**_e*:q*X))dt*{B)T0(o-*9z)?[*4.)5[*r((uu(W:*S|*.T)>9*=U*uI(iZ*ye*4)(c9*Ta(e}*4>)+5)Sf*X9*9s*d.(f-)Q{(_y*.Q(oB)`C)S,*(9(tq(W8)/1)2K*(Z(Tv(|_)E7*FD)&C*ne*yU)mS)`&*`Z(^{*/^*Sz(to(_W(X=(f*(tQ)>r*4(({,)69)7,*^z)*4)R&)}:(WJ(Ya)CK){!ijmo%qt%xz%~ )|!&'%+-%79%BDEG%JNOQT%Y[]%ehikm%ortvy%{} )}!&'*%,.0135%7;=A )Uj)VM)x`*K6),T)l()6]*^o(Yx*eW)?I*5!Z| )+2*5{*Xt(a0*MY*XK(t3([\\(Vl*qk)cT*6K*Wx(|**S`*r:(uT*/[(g;(ld(kU*TI)>4)JQ*mL)po)Xz)*a)kn)D+)E])|l*3z*Xv)2F)y>)>]*Xc(^T(`4*mU*/y*3x*.L(~C)Wy)DE*&;)o}+&I*6a*0|*),):}*oQ)z^(fN(h7)O^):`)4}+04*4w)m=(a3*uT*>e)Fo*F&*qP*s1*nF(Tp(ea*.s)Fl*Z-*2K)C2)+0*1H)}!CDFH%KMOQS%XZ\\^abgikmprsuw%~ )~!&'(*+./13578:<%?A%GIJL%NQS%VY%[^%`i%kmnp%rt%{}~ *&&(pL*2u)Gq))-)>6(a`)0F+4-(X}*\\H(^8({b),P))1)Re)7[*Wz(^=*m\\(bf)SM*:M)eC(p,)Di*X-(tE*_-*=*(g@)~H(Wk)Sk(zt(vE+2X(eA*Ee*~r*UB*3~)>@*x^(n6*sd(`H)k2(`j(|?)7l*L.(UC)7:)/\\)H{(^?({O(^l*N<)~\\*{[*08)1o)^'*X/(]n)*n*`S)ix*N>(ni)tz)-6+42*qI*^R+'T*TE)oj)Fu)Eh*Z8*X5(`W*^t)Yr)HN*n_*bs(n9)E(*K~*_X(gs*&!'*%-/%246%:=>@%BD%FI%KM%OQRT%XZ%]_a%hj%lopr%wy%~ *'!&')%.124%@B%GK +&)(zy)Us)R-(V9({j*~Q*d7)3v*b5*v{(f/)VX(|0(_p(j**0=*2&)u*4e*G])e<*(z)XG*'!LM%UW%{~ *(!&'%*.%8:%@CDFI%KPQSV%Y[%]_`d%hjk ),d*DB(h~)6g(V&)SX)5S*9x(h)(c])fQ)Yi)l8(`,(b~*TA)KF)-n)/2)W8(o2)O4)gi)G-*_i*/T)8s)0|(hv)n5*Um)`>)VF({])*j*;g)2s+1b)v}*G@*'0)oy(_c)1v)`u)A3)*;)0&*Tr)^K)86*^s).H)0;*Eo(ms)Pz)0m)35(cX)1`)AV*X?)yu(WU)_k)RN*Sp*TV*.r*;y)@X(wu+'Z)UM)WA*UL)U7(WT)^F*@%EG%NPQS%`b%vxz%} **!&'(*%,.%4 *3i*{:*`1)\\M*Sb+/q(v`*/!*J (ef)Df)HY*^{*'V*sc(e')/W)mb)Ry(d)(y2*.A)85(_S*55))9*@7)6C(^L(zs(WI)x>(`\\)18)UJ({!{y *S!^m )@+).W*r;(u`*/(*.D(kP)EC(t_(XU({m(aa*;o*xj*X>)l/*mq(Zw)z[(W2)EB*~H(y*)P5)pj(o=(|t)}N*qC)`w(^H*4-*97(uE*/E*;<)HA)Ex)v4)uS)7M)8r)~;(Yv(a+(_B*;e)KQ*g=*ZC*X1*N;*o/)~h(W1**!56%km%tv%~ *+!&'%= ([<*8P(`k*{D)WZ)Xv)VJ),7(\\s(vP(|d)UB)Rf)m**?<)GB(t|*So(c/*dE*rC*AH)I:)w+)`O*4z(V8*bP)UC*~N(v{(mQ):d*nJ)sy(Y.*5E)eM*NL*{O*/u*.x(a@)>T*dI*^!im (eH){\\):L)9])ox)yp*J5*r,)5F(al*9I)G.)DU)9/)rR)|Z)TV*.m*N](vD)5.*Bo*9l)lI(ZO(V_)mI*TO(}O))F)}_)?F*eL(V^)Tz*M2*)~*o'(VY*U3*_l*u^)A;)xR*_b)_n)Ut*+!>?%JL%RT%~ *,!&'%F (}B(as*;[(^.*:|)rB)Af++l(V@)1J*(!nc *.i(V)*R|)A_*xh*uD(r[)>g*o])-h)mm*uA)|!LK (_3)_1){^):I){<*.:)gP*w&(U2)^S(UJ*d&(d_)>L)@0*7!u~ (g9(}6)m>*v2)7B)eE)ma(}J*~C*=-(}E(g+)sw(U+)S\\*37)7<)9&))0(^C*Z!+l *o0(Yz(eB)1g)_.(a()8a+0:(w:(ZV)qw(d-*.|)<2)>&)6L)9P(ZD)cS*NC(_&*S}*.w(o**=/*mZ(^g(ex)&N*,!GH%~ *-!&'%-/%35%9;%P (YS)|P)UV*bg*~Y(iy(gA(cp(gZ),=):H)JF(_b)36(_}(q[(b@(o1)tB)qK)+M)3E*)7)5w)6Z(V6)^p*29)7a)_f*uK(oZ*:I)E{)Hv)vX*xw)yI(sr(g^(eL)W~(]p(`U({Y*Tb*43(i<(p0)0L(o4(f1){@)0)(zd)9_)6c(e@)6&({~)E;(h?){e*:T*dK)+)*Ki(t^(p8)7x*Z6*4s(o:)~2(Y2).v({t)OP(c0)}d)e.)Fy)t4)qv)@@(_((U|)pm(~k){k*?&(tt+'Y([W*-!QR%tv%~ *.!&'%46%8HNUVp~ */!-:KQ_xz|%~ *0!&'%)+.%7:; *{])2N)Xt(oG)@O)8W(n,)7V)6,)+i*qc(of)73(j'*Fc*5u*_4(i_*)_[)V@(b:(U=*t;*on*A})vM**-(]F(ou)AC%FHK%OS%UWX[]%`b%eghj%qsuw%{}~ *1!&'(*+/12457%=@B%FIJMOQ%SU%XZ\\^%befh%mqr )n-)|8*(B)SS*sS(a\\)j2(h;(Yr*31*V*5c*nX)/})_>*.]*(^(_<)G[*(a*96(Tj*^p*eJ)An(VB*Ti)(er*n7(Y,)?g(}!jf */V*DE)R6)-o)gA)Y|*/@)&9)8,(zz)Y~(d+(U^)9X)lb)6d*^X(Wa(Ve)ST*.P*Sw*>'*HJ*0?*`s*n})~d*~k*K}*>G)Tp*~P*.v(uU+1Y)gU)t6*Dv*~!6L (kb(et(pU(U]+1D(ce*_Y*54)ry*{g*F0)Yy*@k)C:)30)Zj*3![^_begj%oqrtv{ *4!'*%,0479:<=?IK%OS%Y\\cdfgjry{} *5!&)%,.%02367@BDF%HJ%VXY[^%`bd%hj *U4*9Y*;@)q2)Qs).d**:s*nt)Q;)si*my(c~*:p(^^)*,*V>*X8(U5)ge)E&)G_*dJ*tM)a4)SO)qI(xT*oB)Q/*0v)@p(|.(v-(x\\*q!7F (W'*=o*?J)Mp)px*o1)f.)H'(zo)qo*dn*uL*)3*`/*U'),b*'|)yP*N?)Sz*F^({})*1)HJ)q`*/6(^a(]r(b1(wD*/F*uM*:E):.)rk*Bv)yJ)X+)+/(uf*@i)^H)Qq)7))pX)>J)1/*qL)@W*H/+/s*nG(ej(g(*U7);~*5!kl%prtx%z} *6!()*-%13%68:<%>ADEG%JSU%Y[]%`bd%iklp%tvwy{}~ *7!&'%+-%25%8=>@%BDF%L )<&*C^)L>*6n)vk);o+'l)6|)Ci*)YR*A*)72)*c)vA))UO(^h),A(uA(ak)/D(u@)B-*DD)mC)8;)4[*)F*T^(h8)O9+/u)Pm*B{(fY([M)SR(ic*Y[)cJ))])/G)i>)77)9J)cj)-|)X4)U:)=T)[>)pq)vS)q<)lQ(`>(e8(U@)+4)?c*2`*4Z)6^(g1(`B)_0*Jk*Yx)T6(f|*4^(q**Ky*XT*r`*cz(XK)SI(jW)p_)te)6k)_{)[t)-Q*@D)H[)uX*&Y*6z)CI+0F)8x)v3(oR)tG*t})6!DGHKPU%XZ%\\^`acdfhj%nxy{~ *;!'(+-.2%;>?CEGLPR (i]*5i)mV)pG(cH)n)(\\y(}F*S)*&)([&)ce*~a*y_)ZA)k8)x9)<4)s3)7f*xq*X+(gl*35(U?(oM*:g*=p)*b(_`)kL*T((}T(oD)TQ*xg(wa)ti+'\\*_|*(E(`p)5m*nT(VZ*k*=L*?c(p^)Cr(n?)A^)Ub*U<)Bt)]E)C])OL)FI)56(v/(TI(_7)ZE)E^)S=(^B)HL(tm)Oy)lc)&a*5;+3<)?y)w!rk *~[*Xw(~.(UK(W<(f3(tw)tA(lV)Qt*_U),@)S+)T8*Sh)9H*;!STVWYZ]_%chj%nrw *AE%GI%KN%P )0I)U9)d:)6)*m!Ax (cR*_R)~9(Vs*U1(Uk+1r*m!df (`g)[B*aB)UA*U?(qB)'F)O!2[ )E6(f_*6&*0t(rq*A6),w)6e)Ld*o:)>m)0])G?)s5(UA(Y1))/*v*)(VF)y^)i<(bL*:')=&)y5(|;)S/*u=*^e)R)(Zn(d5)WO)<{)Ad)R7)1E*xW*T[)*u)iD){=)yC(T^*b7)hd)RI(mo*cx)Ss*Y2(cI*Ea)C0*\\K(}M*~;)Wj*=!QRV%Z]%_a%cehj%msu%z|%~ *>!()%-3%:<%AC%EH%OQ%Z\\%`bg%jln%rtx%z|~ *?!(*,- (e3(wQ+3w*YJ(dq(nD*y.)D(*do)Sw(^4)mn)7])dq(`R(a^*/{)^o)o*(d*+0A)K-)uJ*s]*K^*13)`_)b:(^U)E_)k:(sc)=l(mL*Sf*{K)63*.o)1y)_o(sk(V!UN ).X*vy(W6*Sa(_v(uW*.E)5p(Va)@.)5**;M*?z*;x*Gv)ad)YN({p*.l(^c):()E`*3f*;N*IL(]7({1(uO*_B(U`)Rd(^1*LQ*^Y*q}*AI)if*nj*q?)VI*:S),n)2*6@++w(r6*X[(TO(dw*?!./%24%7;>@%GIKLN%QS%_abdf%hlmoqstv%y|} *@!&'*,-/%469:^)G+(js(Tm):s*~d)6.(y+)ig*99)VL)Ho(\\e*1)5g*{k({?(|])9@(i'(e4)nq(^I*A+)E.)H4)PC)6U*^}(e1*82)Vt)m3(US*XN({')ao*BU)B!(p *0Z*FB+1k+2e(}c)Cm*`()FD)DD)5))|C(r])+L)>k)Zp*B!(),.%46%@C%IK%MOQ%SW%\\^`%fh%np%twxz|%~ *C!&'(*%02%57%E )0.(`Q*2C);Z*JN)l&))M)FF)7^*t`(e))c[*Te)R;)rH)z-(f2)s:*xZ*8<*TX)u1)CR)_C)?Q))MD)n;)[S*U8*Tl(oI)QO*Jp)v6)9Z(eV)_/)Rk(r0);0(q3)Ha*6m(hb*)-(ZH*\\V)Vo*YF)_m)9G)V>)Yl*/'*=g)Fv*`;)V{*rl*Se(t})d>*C1*6P)m`*PR)H0(`n*Zp*nk):/*xx*[9(iu(X5)C=(l})1U)V8(`](}N(tO)WE(rC)l-)kr)0E*84*5q)7{)DF*_s)qz*ZA*X4*mt))^(d;(f0)_E*D!acdf%lw%} *E!)*%-/1%69%=@AFHIMNR%TV%Z\\%^`cghmnp%ruwx{%~ *F!'(%*,%.17%9<%?ACF%HMNP%SVX )RG),4([3(VA)+C)8K*8g*`R)G**dB)sA(ei*n6)-H)|R)GP)8V)}f*.y)n&([N)6X(tZ*`G(_k)y;){G(n:)-v*`L)U~(}e(n[(em(]y)X>(mw)9`*xs*6Q*FW*LV*`8(e{(}t*79)7@)5t*5\\+0,*r6*~!8F )IU(ur)7=(i7)8'(gr*Et)U8(vw)k<*Jz)O|(t<*UW),l)Xo)gc*x](T~)_y({C)us)8N)AJ)p/)1K({R(wd(TM*6')Rq)gE(V5)Dn*09)-d)@C)CY).c(uQ(vu*F![]_abfh%jl%oqrtuwxz%|~ *G!&)%/3468%;=%?AC%HJKO%VXZ%\\^`%ch%jmoprsuw%{}~ *H!&(%.0%4 )(n).9(d'*vx*_n)Fx(n0(i()1_(U')[3*/5*:5*=q(vH(W!Ze (}C*.F)Ch*@r(fw)lL*4G(i{+'g(X/)Ww*Tw(|g)3>(cz)nj)Ws*D~)?)*qJ*.S(f?)zR*)a*q=(k(*1P)kD)8.*FY)VD){c)5-)?C(cv):@)S1))3(f`*m[(U9)Rh*TP(}P)@)*9c)H((f!B8 )Q+)Ox(V()8S(cW*8>(WH(Y7(oA)5&*tB)AT)d.(bg(ab)0x*TS)@])ai)Du*MR)u.)t2)A`(l)(f<*n{)d?*H!5679:>@%BDF%IKLNOQ%UW%Y\\%`d%jl%oq%tv%y{%} *I!&'%/1%46%9;%@B%IKN%QS%WZ )yx)0H))T)0b*6o(t;)1\\)aT)_q)YB)RW)dE)MH*K2))u(UM(xu(j<*n=)Tl*)R*s6)5+*.`)ru*Dr(c2*tb*_')Aw)&4(Y))eY(TQ(d\\(t5(ep)98*o)(]m(Vm++P*.>(gc*W}*J2*8W*qA)V1),c(y5)A.*r_)gj)fA(du*6L*{Z*10({a*r!mF *.Y)q8(dX*ow*{n)~l*Lp)XI(UN*1c)x6*TJ)1s(gx(V?*xY))?)L~(\\M(en*Ul*>1)u9*tH(`d(h@(m8*nZ)V+({l)Vi)AC*I![\\%hj%oqrt%vx%z}~ *J!&'%),%13468%>DEHKMOQ%TV%Z^adeghjl%oq%su%y{%~ *K!&(*%/ (|m(zm)FT*3s(iq)|~)>C)I|(V/)OY*G7*uv(c^)80);@*b0)?>*4E*Tt(^e)H1(d.*I0)4=)Sr)TP*U-(}V*BP*9v*nf)O5*_,)?R)/-).N(Yj*I|)@h*67)f<)1z(^@(`+(on)-F*b(*J**df)*g)D4)/Y(vG(]i(_i*4|(bp)S'*sa)aZ(WL(Yw*1-)C{(je*nb)y8*Jt*.}(rw)5(*tD*DN(k_*x[)-t*Su*?u*d+(e6)@6)*~)lY)0=**l(xA*/!+. *^S(jG({Z)1,)?m)g>*K!13%57%;=%@B%EHILMO%RT%VX[\\_%cefkln%twz%| *L!&')+%-/%57%;=@%DH%LN%PR%UX%[]%_ac *`A)oU)qi*.t*u_*BA(zv){:*t.*Iw(b3)a_).5)@5*TF(|Y*~9))))PB)Rb*S!jl *`B*_V(dA)7&+/!v} (fD(Tq*:+)cw*E7)&i*J7)VR*sb(g|(V.*Ss)`2(gh*qX)_a)WC)pi(Tk)tI*FT(~U),3*Nz*x|*q])^i)Sm(tj)9a)q|*J+)ZS*9:(qa)bL(dB)tO*s^(hS)-J)`Y({k*T~*~V)P<(tT+0&)y_)DM)6/(XQ)mE*0r)T`*r))R.(W+)mv(^G)Fj)Z}*a_*6B(uc)i~*L!de%lnoq%~ *M!&'%03%8:%MO%QSUWXZ%t );M(},*aD){W*U.(vN(gW*7y*<+*MT*26)IX(l<*2l)cU*eI(_)(UL*xU)9N(T`(eS)C1*5v(tB)VU(TF(sx(cJ):5*nK(Y&(WE*JA*xp(t]*a6)ys(V~*4t)m5)S0({S(v\\)-A)I-*Du(ZJ)):(UF)sq(Vy*9A)6T)@\\*ap(}~(VS)-]*7?*`p*3a)mO(V:*KY)26)P~).Q(U6)pc)Y:*TG*Sk*T!n5 ),?*22*1[*.h*;J*<'(mu)Pp*w,*r*(vo(e|*nP)W5({|*{C(}>),R*s-*M!uv%~ *N!&'%:=GM%OQ%SUWY%\\^a%df%hj%ln%y{%~ *O!&')%> (d&*:_)LN(x6+0g)+**/i*!./ *;|*G0*__*Xb)pa)-U*xv)uH)@i(h1)7O(XE*7<)ml)+N*sj*ZX*F;(g:)TH)V/)R?)0X(b/)k~)*l(WS)0y).r(}))l.*b4*ms)d~)Sg)X)*cv)CG(e!(P (X3*eD*TU(d~)*k*_S)W.(U{)p[)JU*DR)2A*8&(X;(Yg*`v++0)20)W!g^ *r{(Uu(wL*t,(TT(~+)y1({>*TQ*1L)gC(pi*9R*bG(e^*a&(j[)&=).,)2/)OD)e]*46*PQ*O!?@%^`%hj%~ *P!&'%@B%H )Up(|1*KZ*xd*Uv*~7+0*)WT(^p(]h(p-*J_(dU):S*_&(n)(f\\(nB)fR)Y(*/Y*_m*:?)2f)/Z*rX)C.*.@*Y!1j *mX(~_*(T)CF)1&*qT*2N(U~*bm(bh*r^(]f*_a*As*d1)AE*w.(ze(c,)tm)D')Fp(gt)^Y({g*^g(^Y(nd(g\\)=f)Ar*X!^C *5:*>v*aL*)6(_r*CH)E/)@2)\\.*E?*[v(lX*`X)ot)^Q)b\\*W|)7S(`3)TR*X<)/@(rv)3\\)C<*X`)5j(jS)Wm)Ck*^Q*P!IJ%PS%Z\\%~ *Q!&'%R *n;*qG)qh)F8)Jw(g6(U:)_:*T,);^)?-({<){J(Zj(|F)sI)QA*PA*(H)Sl)ph)?K*_()''(}Z*D,)F;(co)54)|F)XL*/>)L<)|M)-T)Zr),])9D)VK)D;(TN))X*X&(Vk*4D)o&*s9)7E)@v)6A)Sj*Xu)a7*0Q(]k*3d(eI*aM)6[(hD*F2*_**2;*nq*@o*_j)UU)h.)?A)q_)kZ)t\\*7t*Ww*m;(Y/)Dz)m]*T.*tK)8@*oH*r+*?i)84)r()-e)e\\(Uv)/F)>o)7Y)Ou)>:*Q!ST%uw%~ *R!&'%;=%[ ))o)mk*bW*S~*9d)E))>*(f5*FZ)ss*4&*5-)RH(U8*.a*3))q4)I5)PO)6*(Zl(Xf(n|)7q)Ot*Ye(eG)@1*.R).b)8+)9o*7!lm *0V))d)&,(`P)Aj)ya)z9*X()^t)mx)Yv)Si){X(Ts)p^).k*mR*JU*.b)yE*4C*eH(W!-R *8?(fl))&)U.*T0*(U*^^*3u))b(g=)pJ({P)A,*~n)hA)F]*Ev)Co)f=*T!\\? *`H)|f)_])a>)7.)s7(kx(U(*>a)E}(aj*E[*X.*nR)}e*R!\\]%{}~ *S!&'(*%\\inx *T!+4Nm *U)(X1)T=)x.*~E)6V)cH)7g(TY)tK*^V)<]*XZ*&()GC)*s*KJ(uS)*0R(|h*aT)@q)).(X2)Ej([1(X>(o3)+=#2$*U!CD%KM%PSUVX%_a%df%kn%tw%} *V!&'%)-%3568%:=?%EG%IK%_ (Uz(TR(]e(TV),<(cT(T[(V,(Td+'J(z|(lW(Tn)y2(U,(b}(U4(tS)cY(c})Qp(mt*4h*{l)Q3)re+2\\(T|(V3+2U(U!IV (V'*9O(zk(ie(kV(VX(d!CSY[d *uP*X](c)(eR(c!5=M *X\\(c!ur (_!u{ (`!(GMYZfx{v *?`(a!>CBQT (^N*0<(V!OW]V|u (W&(Vr(W!V.] (XF(W!0`bDf (X!@I )>3(X!@A (cx(d0*q!lqp *r'*qy*r!328?JU]bhj~ *s!*4M *a!vz|x *b!2':9<@ *Y|*Z!&'*.%03%57;<>%@BDJL%RT%VY[\\^%ac%jnor%vy{~ *[!'()+%-01348:;A%EH%MO%Z\\]_`cf *b!>6UKDVJMYlhb]aqu *c!+1OKP^\\fps (`'(th(a!cmn (b&(hQ(b!8>X (e<)be)s[),1(_!ho +'G(dl),>)lW))7(o/(p!3+ (rV(s!;DP (n!ehfoujk (o?(n!w~ (o!LhNi_^KPYV (p!7. (oo(p! (ov(p!*_bdc\\B~y (q)(p!ng *[!hjl%prsuw%y{}~ *\\!&'%*-%/1%79;%FIJLMO%UW%ik%~ *]!&' (q!<>. (pw(q!1OJuQ (r!=DYarX *{}+2^)4t*9!@DFVQoKUX^`r *:!&, *9w*:!68Q *9!_~u *:!9:/ *9!p{hqf *:!2< *9k*:!OweR}uJb@FziA *;!&/ *:t*;!)* *:!NC *;!1fpq *:v*!&B *=!ti7Brf[\\M( *<|*>0*=!SD *>!f[dc} *?!89+:) *>!FPs *?!'=? *>!;w *?!r~ *@!(> *?n*@+*?!{pk *@8*?!RjeH *@!=;d )kc*A7*@H*A8*@w*A9*^!/0%OTjv| *_!.1%35%8;=%@C%FHIK%MPQTWZ%^`cghkqrtx} *`!')*,%.2%467?@DFKMP *A!U: *@!WT *A!XGgc]y )s0*A!Bqz *B!JN-5 *Ax*B!TB+_]Vyg *C!)LtRvc *D0),!;E (t!bg *2m(t{(u'(t~(bw(}!'*19 )5h)6!-b~ )7!4DAX )83)7`)8!J\\T )9e):U)9!)2Fl )8~)9!dB )8z)9!ft ):!QW?^ )9|):!=- );X)9!~v );!KG ):!jz );&):k);!,'d )<1);s))),H).])ko),N(cn(e!NZFEXosc (f!OV%XZG (e~(f![]'6 (g!-? (f!{uh (g!EF/ (f!zj (g!H{Xm_}RQ~ (h&(fv(gN(h'(g!fjw (h!+,. (g!TUO (h/(gz(h!0m9rOfEtuacy| (i`(j!/U (i!Bf:N8I5 *b!HILNOQ%SXZ%\\^%`d%fi%koprtv%y{%} *c!&'%),%.02%EG%JL%NQ%[]_%eg%oq (i!0On%p,)U (j!+r (i|(j!QY( (iz(j?(iw(j!v1 (it(k&(j!]^49 (k!1> (ji(kf(jq(k!23 (jt(k-(j!}d (k!6,9: (j!lm (k!/<+ *^~(k!eOSHkjEGnt (l!F'E (ks(l!;PGJ:BtR_Yijs (m!(Dilrv (n!1'5;@FEX ))!Wa\\Yy )*!*+ *c!rtu~ *d!'(%*,-/034:% *U~)(!Xf )-!W[fkmpy} ).!'38@G *J@)-E)d!ruy|} )e!/-:9>T[U^`cm_of *e!ab%~ *f!&'%g )eg)f!*&4 )ev)f!10(5L8?KDc`js )g!&)8 *8;(tK*yn(t!J( *{!8<%AILRUY\\_befh%j )*o)+')*z)+!,;6OKTI *XS)+!hgq~ ),'*73).!OTaZ )/5).y)/6).!lo )/!078 ).!ux )/!*KgXMA?[]%VX%p )0!CVos )1-)0!v\\ket )1!l;1]XFZ4 )2!GMB: )R!op{} )S!4W~ )T))S[)T!LMF, )S`)T!5+O@C )S_)T!(DS *g!qr%vx%~ *h!&'%79%y )U5)T!|a )U!?D )T!\\Ync )U!'I*1 )To)U!KNP/ )V4)Uk)V!AC )UZ)V!67 )U!X\\x_ )Wd)V!jh )W!(X )Vb)W!*[0' )V|)W`)VN)WV)VQ)Wu)X!_?\\ )YJ)X!PwDE )W!|o )X5)Y!wI0x )Zl)Y!z=?USOoLg'Z7 )[!H,- )Z!cT8nu )[!1Z )Z!iHh )[!osr^Xb` )\\^*h!z{%~ *i!&'%TV%~ *j!&') )\\!V4FCOn{km| )]!NWOmi )^!*9 ({!7;LJ\\o )l,*~h);:(|!BL *L\\(|N*[<*Qv*_!Gdfv *`&*_!uzw *`+*_y*`!=(u!xkq (v!F& (u|(v!K2yzQ|WLm (w'(v}(w!MO,>.[ (x)(w!epW} (x7*4p(x!l]9< (y!'T (xt(y!;= (xz(y!ILZ?OAEr (z!'&BGP (|!sz (z!ju ({*(z!acr *~!?ABDIGJKORTZ\\]`be%gijlmoq *.!9;=?BC *k!34%:<%~ *l!&'%: *.!GJXZ%\\cefjnquz{ */!),/023N7;] )FP)G!/@ )Ft)GA)F!sq}|\\ )H6)G!iNQmE )HC)J=)H})I!GH )Hz*o!(4>DILV[aouvx%~ *p!&(%s )IL)Hq)I!3) )J&)Hd)I8)J@)Ia)J/)Ij)J!,S:OgG )I\\)KB)J!VW )KD)J!X52Hjv )K1)J!z| )K!J'7@U )Jd)KV)J\\)Ku)LL)Kc)L!45 )M))Kh)L!a[ )Md)L!mxR )M!R= )L!ZEu )M!@UTm[o )f!Je )P!:;@=KLFSTZc *^!UW[%]_`bacdfhklnqu *p!tu%~ *q!&'%6;NVbgjmor%xz%|~ *r!&-%0479@DEG%IL%PR%TVY[\\ac%gin%z} *s!&' *^!wxy *_!)+ *\\j)5!'37;>=A@H *7`)k!EJUegi )>/)@!789Sb )DW)@!L^I )^`)C5)@!f}z )A&)@~*2<)A!OD1?FQGgt| )B!>4Urs} )C'*X!236;=@EFHIGMUY *N!AD%FH%K )d!3d )c{)d!+4CDIPRTW )7r)8C)9h*s!)+.%02378:%CE%LNOQRTUWX\\_`eghmnpqs%|~ *t!&'%+/%24%689<>%ACFGIN%PT%VXY[%_acd );E)=,*2:)Q!JS]UYegfmux%z )R!(0+19 )>!0Pf )c!kptN *DV(`0*3!|yp *4@)CH*4!A5/18;k%n_FH]Q[ )CN*4!aouxq *5!89 *4v*5')CS*5=*Ue*5!aIWC]sw~ *6!F+,C2;NO?9 (q~(xw*6!ZTc )Ym*6!u| *7E)Cd*7!C4 *t!ef%moprsuw%{~ *u!&'(*%@BCEG%wz *w!'(%+-0%G )/n)0!63@ )/s)0!2< )1+)2!-4 )3!+wk )4!@F{ *3!]\\ )SA)TK)WF)t!+-5>LMF )?M)t!bQRn%pTqZaX^ )u!*I23 )t[)u,)t|)u!(Fwovcx} )v!&5<(W\\Lou )w/)vw)w!=NH^ +4.+2!>@A )q!1DM9GHZbYmfux )r!78.*AO *w!HI%~ *x!&'%N )r!ILftdgsx )s!-.>CK )l!7=KHEXov )m'*0!@IG *Oi*0!P\\Yaif )p!f~ *Ii*m!89:>=?@BCGJHM%OVW^]`_bcegi%moprw{%~ *n!&'(*%,/%13258%:<>?ABD *x!OP%Tknruy *y!*/%TVW[]^b%dg%mp%~ *z!&'%5 *n!CEHIM%OQSVWY]\\`acdg%il%pruw%y| *o!+,*-2357%9=?@C6E%GJMOPS%UW%Z\\_`^bce%mpr%t; )s!uz *sf)y!Me[c~ )'A)y!{z )z!=3 *z!67%:<=?%[]%~ *{!&'(+%79;HMNPSWX^ )z!XVp +1m*{z){6)oz)p!',2= )k!46 )l)+/!prx%| +0!)(-/.01589;=%@BCEHLNQ%SUZ]%chdj )m!68:DAPGWX\\hUTgfzq )n!.31/62N?FLN[lfrnsy *J!BGP[]` *K!'KE.DQ_PiKULJdjO *F!+34/5 *Ek*FU*Ey*F6*E!zsl *F!EI:JLOKe}`gp\\ *G!'1 *F!vsky *G!(k *Fd*G!fgdIY5Wt%ACE%HJ%OQS%VX%[]_a%ikm%su%w *HV*G!qn *H!=' *Gl*H!;u-BE498GR2lnY )~0)}!`qt )~!)6 )}v)~!-,KabsgXc@eW]fo *&3)~|*&!.??A *(,)>D*(!AMLNRblmqw|}xu *)!.? *95)B?*1!N]dtpux} *2)*)O**u*+!KS *-:*.5+1!VR *Xs*Y!+;8X *X!gm *U!RT *c!w}{| *d8+(!;<%~ +)!&'%A *d!65D=CQRFHM`Ydaevw~ *e!()*0/5 *U`+0u*Y_*Z!9S *[!N^ *Y!\\fcak}~ *Z!(, *Y!uv *Z)*Ym*Z!:EF1GI2WKbkmz|q} *[!/5.*2&>67FG?ekqdiz *\\!+0,8: *V!*4<7JF )?=*N!PXTV +)!BC%~ +*!&'%H *N!_ei *O_*R<*u>*t!-73JELSRnqt *u)+3!loq%vx +2!CPR *s!VYZko )sM*s}*g!Ww *h8*iU*j(*k/*jM*l!Jw ++!369%< )zB++!?BD%FHINOR%WY%]_abd%kn%qx%{~ +,&+*!IJ%~ ++!&'%/12478=>@CGJ%MQ^`cmr%v|} +,!,-56;<'%+.%02%478:= *u!gp|} *v!&A=5DF *~!{z +&(+0O+&!'+-2163<=B +'!][_a`ei *yo*z!;\\ *{!*) +&!PRW`\\l^jy +'!'+7; +1![\\ *-.+0!y~ +1!&)0 *k;+1!;=y%{~} +2!'.,*/4gqt~| +3!)*0 +,!>?%~ +-!&'%~ +.!&'%~ +/!&'%ntw~ +0!'+237DGI%KMPTV%Y\\efik%twxz%} +1!'(*%/2%:<>%CE%QS%UWXZ]%ac%fh%jnpqs%uwx| +2!&()+-0%35%=?BD%OQTVWY%[]_%dfh%prsu%{} +3!&(+%/1%;>%jmny%~ +4!&'%+/%14%8 .*f.+!Zv .,!oy .-!;<%>@BCGN%PRSV%X -R!XY%~ -S!&'%N" - )); - var gbk = src(gbk_us); - return gbk; -}(); - -var gbk_build = GBK$1; - -export default gbk_build; \ No newline at end of file diff --git a/components/tpx-bluetooth-print/print/printJob.js b/components/tpx-bluetooth-print/print/printJob.js new file mode 100644 index 0000000..dcce486 --- /dev/null +++ b/components/tpx-bluetooth-print/print/printJob.js @@ -0,0 +1,298 @@ + + +//微信小程序向蓝牙打印机发送数据进行打印的坑: +//小程序api向蓝牙打印机发送数据打印,发送的任何内容都应该要转成二进制数据,而且蓝牙打印的文本编码是GBK的,发送中文需转成GBK编码再转成二进制数据发送 +//发送打印机指令也要转成二进制数据发送 +//蓝牙打印机一次接收的二级制数据有限制,不同的系统不同的蓝牙设备限制可能不同,微信建议一次20个字节,需做递归分包发送 +//发送完要打印的内容后,一定要发送一个打印的指令才能顺利打印 (有些指令就不需要) + + +// 发送数据(递归分包发送) +/** + * + * + * @export + * @param {object} options + * { + deviceId, + serviceId, + characteristicId, + value [ArrayBuffer], + lasterSuccess, + } + */ + +export function sendDataToDevice(options) { + let byteLength = options.value.byteLength; + //这里默认一次20个字发送 + const speed = options.onceByleLength || 20; + if (byteLength > 0) { + uni.writeBLECharacteristicValue({ + ...options, + // writeType:"writeNoResponse", + value: options.value.slice(0, byteLength > speed ? speed : byteLength), + success: function (res) { + if (byteLength > speed) { + sendDataToDevice({ + ...options, + value: options.value.slice(speed, byteLength), + }); + } else { + options.lasterSuccess && options.lasterSuccess(); + } + }, + fail: function (res) { + options.onError && options.onError(res); + }, + }); + } +} +export function charToArrayBuffer(str) { + var out = new ArrayBuffer(str.length); + var uint8 = new Uint8Array(out); + var strs = str.split(''); + for (var i = 0; i < strs.length; i++) { + uint8[i] = strs[i].charCodeAt(); + } + return uint8; +} +export function charToArray(str) { + var arr = []; + var strs = str.split(''); + for (var i = 0; i < strs.length; i++) { + arr[i] = strs[i].charCodeAt(); + } + return arr; +} + +// 使用的 ESC/POS指令, 十进制方式 +// 更多指令请查看 ./PrintCommandDocs/ESC-POS指令文档(凯盛诺打印机代表).pdf + +export const printCommand = { + left: [27, 97, 0], //居左 + center: [27, 97, 1], //居中 + right: [27, 97, 2], //居右 + clear: [27, 64], //初始化 + enter: [10], +}; + +//打印二维码 +/** + * + * + * @export + * @param {object} options + * { + deviceId, + serviceId, + characteristicId, + value,//ArrayBuffer:二维码的数据 + } + */ +export function printQR(options) { + //打印二维码的十进制指令data: + let data = [...printCommand.clear, 29, 107, 97, 7, 4, options.value.byteLength, 0]; + sendDataToDevice({ + ...options, + value: new Uint8Array(data).buffer, + lasterSuccess: () => { + //指令发送成功后,发送二维码的数据 + sendDataToDevice(options); + }, + }); +} + +function grayPixle(pix) { + return pix[0] * 0.299 + pix[1] * 0.587 + pix[2] * 0.114; +} +/** + * overwriteImageData 图片数据转 位图数据 + * @param {object} data + * { + width,//图片宽度 + height,//图片高度 + imageData,//Uint8ClampedArray + threshold,//阈值, 越大,打印点数越多,图形越黑 + } + */ +export function overwriteImageData(data) { + let sendWidth = data.width, + sendHeight = data.height; + const threshold = data.threshold || 180; + let sendImageData = new ArrayBuffer((sendWidth * sendHeight) / 8); + sendImageData = new Uint8Array(sendImageData); + let pix = data.imageData; + const part = []; + let index = 0; + for (let i = 0; i < pix.length; i += 32) { + //横向每8个像素点组成一个字节(8位二进制数)。 + for (let k = 0; k < 8; k++) { + const grayPixle1 = grayPixle(pix.slice(i + k * 4, i + k * 4 + (4 - 1))); + //阈值调整 + if (grayPixle1 > threshold) { + //灰度值大于128位 白色 为第k位0不打印 + part[k] = 0; + } else { + part[k] = 1; + } + } + let temp = 0; + for (let a = 0; a < part.length; a++) { + temp += part[a] * Math.pow(2, part.length - 1 - a); + } + //开始不明白以下算法什么意思,了解了字节才知道,一个字节是8位的二进制数,part这个数组存的0和1就是二进制的0和1,传输到打印的位图数据的一个字节是0-255之间的十进制数,以下是用相权相加法转十进制数,理解了这个就用上面的for循环替代了 + // const temp = + // part[0] * 128 + + // part[1] * 64 + + // part[2] * 32 + + // part[3] * 16 + + // part[4] * 8 + + // part[5] * 4 + + // part[6] * 2 + + // part[7] * 1; + sendImageData[index++] = temp; + } + return { + array: Array.from(sendImageData), + width: sendWidth / 8, + height: sendHeight, + }; +} +/** + * 分段发送二进制数据,按allUint8Array的length产生发送的进度 + * @export + * @param {object} options + * { + deviceId, + serviceId, + characteristicId, + lasterSuccess, + onProgress, + } + * * @param {array} allUint8Array 所有的Uint8Array + */ +export function sendDataToPrint(options, allUint8Array) { + const allLenth = allUint8Array.length; + const writeArrayCopyer = allUint8Array.slice(0); + const print = (options, writeArray) => { + if (writeArray.length) { + sendDataToDevice({ + ...options, + value: writeArray.shift().buffer, + lasterSuccess: () => { + options.onProgress && + options.onProgress(Math.floor(((allLenth - writeArray.length) / allLenth) * 100)); + if (writeArray.length) { + print(options, writeArray); + } else { + options.lasterSuccess && options.lasterSuccess(); + } + }, + }); + } + }; + print(options, writeArrayCopyer); +} +/** + * 获取打印图片的指令 + * + * @export + * @param {object} options + * { + lineByLine, // 是否逐行打印,默认true + } + * @param {object} imageInfo overwriteImageData 得到的位图数据数组和宽高信息 + { + array, + width, + height + } + */ +export function getImageCommandArray(opt = {}, imageInfo = {}) { + const lineByLine = typeof opt.lineByLine !== 'boolean' ? true : opt.lineByLine; + const width = imageInfo.width; + const h = imageInfo.height; + const xl = width % 256; + const xh = (width - xl) / 256; + const yl = h % 256; + const yh = (h - yl) / 256; + //打印图片的十进制指令数组 + let command = []; + + if (lineByLine) { + // 分段逐行的指令 + command = command.concat([29, 118, 48, 0, xl, xh, 1, 0]); + } else { + // 非分段逐行的指令 + command = command.concat([29, 118, 48, 0, xl, xh, yl, yh]); + } + + return command; +} +/** + * 获取一张图片数据与指令整合的writeArray,结合 sendDataToPrint 发送二进制数据到蓝牙打印机 + * @param {object} options + * { + lineByLine, // 是否逐行打印,默认true + printAlign, // 打印的位置 + } + * @param {object} imageInfo overwriteImageData 得到的位图数据数组和宽高信息 + { + array, + width, + height + } + */ +export function getPrintImageWriteArray(opt = {}, imageInfo = {}) { + const lineByLine = typeof opt.lineByLine !== 'boolean' ? true : opt.lineByLine; + const width = imageInfo.width; + let arr = imageInfo.array; + let writeArray = []; + const iniTcommand = [].concat(printCommand.clear).concat(printCommand[opt.printAlign || 'left']); + const command = getImageCommandArray(opt, imageInfo); + writeArray.push(new Uint8Array(iniTcommand)); + // 分段逐行打印的数据 + if (lineByLine) { + for (let i = 0; i < arr.length / width; i++) { + const subArr = arr.slice(i * width, i * width + width); + const tempArr = command.concat(subArr); + writeArray.push(new Uint8Array(tempArr)); + } + } else { + // 非逐行打印 + writeArray.push(new Uint8Array(command.concat(arr))); + } + // writeArray.push(new Uint8Array([27, 74, 3])); + return writeArray; +} +/** + * 只打印一张图片数据的方法 + * @param {object} options + * { + deviceId, + serviceId, + characteristicId, + lasterSuccess, + onProgress, + printAlign, "left"|"right"|"center" + } + * @param {object} imageInfo overwriteImageData 得到的位图数据数组和宽高信息 + { + array, + width, + height + } + */ + +export function printImage(opt, imageInfo) { + sendDataToPrint( + opt, + getPrintImageWriteArray( + { + printAlign: opt.printAlign, + lineByLine: opt.lineByLine, + }, + imageInfo, + ), + ); +} diff --git a/components/tpx-bluetooth-print/print/printerjobs.js b/components/tpx-bluetooth-print/print/printerjobs.js deleted file mode 100644 index 2eebb44..0000000 --- a/components/tpx-bluetooth-print/print/printerjobs.js +++ /dev/null @@ -1,220 +0,0 @@ -import commands from'./commands' -import gbk from'./gbk' -import * as printerUtil from'./printerutil' - -const printerJobs = function() { - this._queue = Array.from(commands.HARDWARE.HW_INIT); - this._enqueue = function(cmd) { - this._queue.push.apply(this._queue, cmd); - } -}; - -/** - * 增加打印内容 - * @param {string} content 文字内容 - */ -printerJobs.prototype.text = function(content) { - if (content) { - let uint8Array = gbk.encode(content); - let encoded = Array.from(uint8Array); - this._enqueue(encoded); - } - return this; -}; - -/** - * 打印文字 - * @param {string} content 文字内容 - */ -printerJobs.prototype.print = function(content) { - this.text(content); - this._enqueue(commands.LF); - return this; -}; - -printerJobs.prototype.printArray = function(array) { - array.forEach(v => { - if (v.number) { - this.text(printerUtil.inline(v.title + '*' + v.number, `${v.price}`)) - } else { - this.text(printerUtil.inline(v.title, `${v.price}`)) - } - this._enqueue(commands.LF); - }) - return this; -}; - -printerJobs.prototype.printQrcode = function(content, width) { - - if (content) { - const cmds = [].concat(...printerUtil.makeImageCode(content, width)); - this._enqueue(cmds); - this._enqueue(commands.LF); - } - - return this; -}; - -printerJobs.prototype.printQrcodeByESC = function(content) { - let arrPrint = []; - - let uint8Array = gbk.encode(content); - let encoded = Array.from(uint8Array); - - //初始化打印机 - arrPrint= arrPrint.concat([0x1B, 0x40]); //16进制 - //居中对齐 - arrPrint=arrPrint.concat([0x1B, 0x61, 0x01]); //16进制 - //正文 - /* - * QR Code 设置单元大小 【格式】 ASCII GS ( k pL pH 1 C n 十六进制 1D 28 6B 03 - * 00 31 43 n 十进制 29 40 107 03 0 49 67 n 功能:设置QR CODE 单元大小。 - * 说明:·n 对应QR版本号, 决定QR CODE的高度与宽度。 · 1≤n ≤16。(十六进制为0x01≤n ≤0x0f) - */ - //设置设置 QR Code 的单元大小为 n 点 - arrPrint=arrPrint.concat([0x1d, 0x28, 0x6b, 0x03, 0x00, 0x31, 0x43, 0x05]); - //设置错误纠正等级 - arrPrint=arrPrint.concat([0x1d, 0x28, 0x6b, 0x03, 0x00, 0x31, 0x45, 0x05]); - //传入数据的长度+3 - arrPrint=arrPrint.concat([0x1d, 0x28, 0x6b, encoded.length+3, 0x00, 0x31, 0x50, 0x30]); - //二维码内容 - arrPrint=arrPrint.concat(encoded); - //开始打印二维码 - arrPrint=arrPrint.concat([0x1d, 0x28, 0x6b, 0x03, 0x00, 0x31, 0x51, 0x30]); - //恢复居左对齐 - arrPrint=arrPrint.concat([0x1B, 0x61, 0x00]); //16进制 - this._enqueue(arrPrint); - this._enqueue(commands.LF); - return this; -}; - - - -/** - * 打印文字并换行 - * @param {string} content 文字内容 - */ -printerJobs.prototype.println = function(content = '') { - return this.print(content + commands.EOL); -}; - -/** - * 设置对齐方式 - * @param {string} align 对齐方式 LT/CT/RT - */ -printerJobs.prototype.setAlign = function(align) { - this._enqueue(commands.TEXT_FORMAT['TXT_ALIGN_' + align.toUpperCase()]); - return this; -}; - -/** - * 设置字体 - * @param {string} family A/B/C - */ -printerJobs.prototype.setFont = function(family) { - this._enqueue(commands.TEXT_FORMAT['TXT_FONT_' + family.toUpperCase()]); - return this; -}; - -/** - * 设定字体尺寸 - * @param {number} width 字体宽度 1~2 - * @param {number} height 字体高度 1~2 - */ -printerJobs.prototype.setSize = function(width, height) { - if (2 >= width && 2 >= height) { - this._enqueue(commands.TEXT_FORMAT.TXT_NORMAL); - if (2 === width && 2 === height) { - this._enqueue(commands.TEXT_FORMAT.TXT_4SQUARE); - } else if (1 === width && 2 === height) { - this._enqueue(commands.TEXT_FORMAT.TXT_2HEIGHT); - } else if (2 === width && 1 === height) { - this._enqueue(commands.TEXT_FORMAT.TXT_2WIDTH); - } - } - return this; -}; - -/** - * 设定字体是否加粗 - * @param {boolean} bold - */ -printerJobs.prototype.setBold = function(bold) { - if (typeof bold !== 'boolean') { - bold = true; - } - this._enqueue(bold ? commands.TEXT_FORMAT.TXT_BOLD_ON : commands.TEXT_FORMAT.TXT_BOLD_OFF); - return this; -}; - -/** - * 设定是否开启下划线 - * @param {boolean} underline - */ -printerJobs.prototype.setUnderline = function(underline) { - if (typeof underline !== 'boolean') { - underline = true; - } - this._enqueue(underline ? commands.TEXT_FORMAT.TXT_UNDERL_ON : commands.TEXT_FORMAT.TXT_UNDERL_OFF); - return this; -}; - -/** - * 设置行间距为 n 点行,默认值行间距是 30 点 - * @param {number} n 0≤n≤255 - */ -printerJobs.prototype.setLineSpacing = function(n) { - if (n === undefined || n === null) { - this._enqueue(commands.LINE_SPACING.LS_DEFAULT); - } else { - this._enqueue(commands.LINE_SPACING.LS_SET); - this._enqueue([n]); - } - return this; -}; - -/** - * 打印空行 - * @param {number} n - */ -printerJobs.prototype.lineFeed = function(n = 1) { - return this.print(new Array(n).fill(commands.EOL).join('')); -}; - -/** - * 设置字体颜色,需要打印机支持 - * @param {number} color - 0 默认颜色黑色 1 红色 - */ -printerJobs.prototype.setColor = function(color) { - this._enqueue(commands.COLOR[color === 1 ? 1 : 0]); - return this; -}; - -/** - * https://support.loyverse.com/hardware/printers/use-the-beeper-in-a-escpos-printers - * 蜂鸣警报,需要打印机支持 - * @param {number} n 蜂鸣次数,1-9 - * @param {number} t 蜂鸣长短,1-9 - */ -printerJobs.prototype.beep = function(n, t) { - this._enqueue(commands.BEEP); - this._enqueue([n, t]); - return this; -}; - -/** - * 清空任务 - */ -printerJobs.prototype.clear = function() { - this._queue = Array.from(commands.HARDWARE.HW_INIT); - return this; -}; - -/** - * 返回ArrayBuffer - */ -printerJobs.prototype.buffer = function() { - return new Uint8Array(this._queue).buffer; -}; - -export default printerJobs diff --git a/components/tpx-bluetooth-print/print/printerutil.js b/components/tpx-bluetooth-print/print/printerutil.js deleted file mode 100644 index afa6dc3..0000000 --- a/components/tpx-bluetooth-print/print/printerutil.js +++ /dev/null @@ -1,107 +0,0 @@ -// 打印机纸宽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(',') -} - -// 打印图片,需要根据图片宽度算出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] - ] -} - -export { - inline, - fillLine, - fillAround, - ab2hex, - imgRateSize, - makeImageCode, -}; \ No newline at end of file diff --git a/components/tpx-bluetooth-print/print/util.js b/components/tpx-bluetooth-print/print/util.js deleted file mode 100644 index 3aa8118..0000000 --- a/components/tpx-bluetooth-print/print/util.js +++ /dev/null @@ -1,68 +0,0 @@ -import { makeImageCode } from "./printerutil.js" - -const formatTime = date => { - const year = date.getFullYear() - const month = date.getMonth() + 1 - const day = date.getDate() - const hour = date.getHours() - const minute = date.getMinutes() - const second = date.getSeconds() - - return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':') -} - -const formatNumber = n => { - n = n.toString() - return n[1] ? n : '0' + n -} - - -//4合1 -function convert4to1(res) { - let arr = []; - for (let i = 0; i < res.length; i++) { - if (i % 4 == 0) { - let rule = 0.29900 * res[i] + 0.58700 * res[i + 1] + 0.11400 * res[i + 2]; - if (rule > 200) { - res[i] = 0; - } else { - res[i] = 1; - } - arr.push(res[i]); - } - } - return arr; -} - -//8合1 -function convert8to1(arr) { - let data = []; - for (let k = 0; k < arr.length; k += 8) { - let temp = arr[k] * 128 + arr[k + 1] * 64 + arr[k + 2] * 32 + arr[k + 3] * 16 + arr[k + 4] * 8 + arr[k + 5] * 4 + - arr[k + 6] * 2 + arr[k + 7] * 1 - data.push(temp); - } - return data; -} - -//我的图片宽度是240,那么拼接的指令就是[29, 118, 48, 0, 30, 0, 240, 0] -//我的图片宽度是160,那么拼接的指令就是[29, 118, 48, 0, 20, 0, 160, 0] -//补充一点,打印非二维码的图片,宽度一定要是24的倍数,不然打印也会出现乱码 -function toArrayBuffer(res, width) { - let arr = convert4to1(res.data); - let data = convert8to1(arr); - let cmds = [].concat(...makeImageCode(data, width)); - return new Uint8Array(cmds).buffer; -} - -function zip_image(res) { - let arr = convert4to1(res.data); - let data = convert8to1(arr); - return data; -} - -export { - formatTime, - toArrayBuffer, - zip_image, -} diff --git a/components/tpx-bluetooth-print/print/weapp.qrcode.esm.js b/components/tpx-bluetooth-print/print/weapp.qrcode.esm.js deleted file mode 100644 index 7231270..0000000 --- a/components/tpx-bluetooth-print/print/weapp.qrcode.esm.js +++ /dev/null @@ -1,5 +0,0 @@ -/** - * weapp.qrcode.js v1.0.0 (https://github.com/yingye/weapp-qrcode#readme) - */ - -var hasOwn=Object.prototype.hasOwnProperty,toStr=Object.prototype.toString,defineProperty=Object.defineProperty,gOPD=Object.getOwnPropertyDescriptor,isArray=function(t){return"function"==typeof Array.isArray?Array.isArray(t):"[object Array]"===toStr.call(t)},isPlainObject=function(t){if(!t||"[object Object]"!==toStr.call(t))return!1;var e,r=hasOwn.call(t,"constructor"),o=t.constructor&&t.constructor.prototype&&hasOwn.call(t.constructor.prototype,"isPrototypeOf");if(t.constructor&&!r&&!o)return!1;for(e in t);return void 0===e||hasOwn.call(t,e)},setProperty=function(t,e){defineProperty&&"__proto__"===e.name?defineProperty(t,e.name,{enumerable:!0,configurable:!0,value:e.newValue,writable:!0}):t[e.name]=e.newValue},getProperty=function(t,e){if("__proto__"===e){if(!hasOwn.call(t,e))return;if(gOPD)return gOPD(t,e).value}return t[e]},extend=function t(){var e,r,o,n,i,a,s=arguments[0],u=1,l=arguments.length,h=!1;for("boolean"==typeof s&&(h=s,s=arguments[1]||{},u=2),(null==s||"object"!=typeof s&&"function"!=typeof s)&&(s={});u=7&&this.setupTypeNumber(t),null==this.dataCache&&(this.dataCache=QRCode.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,e)},setupPositionProbePattern:function(t,e){for(var r=-1;r<=7;r++)if(!(t+r<=-1||this.moduleCount<=t+r))for(var o=-1;o<=7;o++)e+o<=-1||this.moduleCount<=e+o||(this.modules[t+r][e+o]=0<=r&&r<=6&&(0==o||6==o)||0<=o&&o<=6&&(0==r||6==r)||2<=r&&r<=4&&2<=o&&o<=4)},getBestMaskPattern:function(){for(var t=0,e=0,r=0;r<8;r++){this.makeImpl(!0,r);var o=QRUtil.getLostPoint(this);(0==r||t>o)&&(t=o,e=r)}return e},createMovieClip:function(t,e,r){var o=t.createEmptyMovieClip(e,r);this.make();for(var n=0;n>r&1);this.modules[Math.floor(r/3)][r%3+this.moduleCount-8-3]=o}for(r=0;r<18;r++){o=!t&&1==(e>>r&1);this.modules[r%3+this.moduleCount-8-3][Math.floor(r/3)]=o}},setupTypeInfo:function(t,e){for(var r=this.errorCorrectLevel<<3|e,o=QRUtil.getBCHTypeInfo(r),n=0;n<15;n++){var i=!t&&1==(o>>n&1);n<6?this.modules[n][8]=i:n<8?this.modules[n+1][8]=i:this.modules[this.moduleCount-15+n][8]=i}for(n=0;n<15;n++){i=!t&&1==(o>>n&1);n<8?this.modules[8][this.moduleCount-n-1]=i:n<9?this.modules[8][15-n-1+1]=i:this.modules[8][15-n-1]=i}this.modules[this.moduleCount-8][8]=!t},mapData:function(t,e){for(var r=-1,o=this.moduleCount-1,n=7,i=0,a=this.moduleCount-1;a>0;a-=2)for(6==a&&a--;;){for(var s=0;s<2;s++)if(null==this.modules[o][a-s]){var u=!1;i>>n&1)),QRUtil.getMask(e,o,a-s)&&(u=!u),this.modules[o][a-s]=u,-1==--n&&(i++,n=7)}if((o+=r)<0||this.moduleCount<=o){o-=r,r=-r;break}}}},QRCode.PAD0=236,QRCode.PAD1=17,QRCode.createData=function(t,e,r){for(var o=QRRSBlock.getRSBlocks(t,e),n=new QRBitBuffer,i=0;i8*s)throw new Error("code length overflow. ("+n.getLengthInBits()+">"+8*s+")");for(n.getLengthInBits()+4<=8*s&&n.put(0,4);n.getLengthInBits()%8!=0;)n.putBit(!1);for(;!(n.getLengthInBits()>=8*s||(n.put(QRCode.PAD0,8),n.getLengthInBits()>=8*s));)n.put(QRCode.PAD1,8);return QRCode.createBytes(n,o)},QRCode.createBytes=function(t,e){for(var r=0,o=0,n=0,i=new Array(e.length),a=new Array(e.length),s=0;s=0?g.get(c):0}}var d=0;for(h=0;h=0;)e^=QRUtil.G15<=0;)e^=QRUtil.G18<>>=1;return e},getPatternPosition:function(t){return QRUtil.PATTERN_POSITION_TABLE[t-1]},getMask:function(t,e,r){switch(t){case QRMaskPattern.PATTERN000:return(e+r)%2==0;case QRMaskPattern.PATTERN001:return e%2==0;case QRMaskPattern.PATTERN010:return r%3==0;case QRMaskPattern.PATTERN011:return(e+r)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(e/2)+Math.floor(r/3))%2==0;case QRMaskPattern.PATTERN101:return e*r%2+e*r%3==0;case QRMaskPattern.PATTERN110:return(e*r%2+e*r%3)%2==0;case QRMaskPattern.PATTERN111:return(e*r%3+(e+r)%2)%2==0;default:throw new Error("bad maskPattern:"+t)}},getErrorCorrectPolynomial:function(t){for(var e=new QRPolynomial([1],0),r=0;r5&&(r+=3+i-5)}for(o=0;o=256;)t-=255;return QRMath.EXP_TABLE[t]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},i=0;i<8;i++)QRMath.EXP_TABLE[i]=1<=1&&n<=127?e+=t.charAt(r):n>2047?(e+=String.fromCharCode(224|n>>12&15),e+=String.fromCharCode(128|n>>6&63),e+=String.fromCharCode(128|n>>0&63)):(e+=String.fromCharCode(192|n>>6&31),e+=String.fromCharCode(128|n>>0&63));return e}function drawQrcode(t){t=t||{},(t=extend(!0,{width:256,height:256,x:0,y:0,typeNumber:-1,correctLevel:QRErrorCorrectLevel.H,background:"#ffffff",foreground:"#000000",image:{imageResource:"",dx:0,dy:0,dWidth:100,dHeight:100}},t)).canvasId||t.ctx?function(){var e,r=new QRCode(t.typeNumber,t.correctLevel);r.addData(utf16to8(t.text)),r.make(),e=t.ctx?t.ctx:t._this?wx.createCanvasContext&&wx.createCanvasContext(t.canvasId,t._this):wx.createCanvasContext&&wx.createCanvasContext(t.canvasId);for(var o=t.width/r.getModuleCount(),n=t.height/r.getModuleCount(),i=0;i>>7-t%8&1)},put:function(t,e){for(var r=0;r>>e-r-1&1))},getLengthInBits:function(){return this.length},putBit:function(t){var e=Math.floor(this.length/8);this.buffer.length<=e&&this.buffer.push(0),t&&(this.buffer[e]|=128>>>this.length%8),this.length++}};export default drawQrcode; \ No newline at end of file diff --git a/components/tpx-bluetooth-print/tpx-bluetooth-print.vue b/components/tpx-bluetooth-print/tpx-bluetooth-print.vue index 41cf074..81d3280 100644 --- a/components/tpx-bluetooth-print/tpx-bluetooth-print.vue +++ b/components/tpx-bluetooth-print/tpx-bluetooth-print.vue @@ -1,7 +1,7 @@