import gbk from '@/components/kk-printer/utils/printUtil-GBK.js'; // 获取文本字节总数 export const getBytesCount = function(str){ var bytesCount = 0; if (str != null) { for (var i = 0; i < str.length; i++) { var c = str.charAt(i); if (c.match(/[^\x00-\xff]/ig) != null) //全角 { bytesCount += 2; } else { bytesCount += 1; } } } return bytesCount; } // JS 包含中文的字符串按固定长度拆分换行算法 export const getTextRows = function(str,iPageSize){ var strArray = []; var tempStr = ""; var iTotalLength = getBytesCount(str); for (var i = 0; i < str.length; i++) { var iCount = getBytesCount(str[i]); var iCountTemp = getBytesCount(tempStr); //iCountTemp + iCount >= iPageSize 这里可能出现两种情况: //长度等于 iPageSize 或 等于 iPageSize + 1(最后一个为中文字符就等于 9 + 2 情况) if (iCountTemp + iCount >= iPageSize) { tempStr += str[i]; strArray.push(tempStr); tempStr = ""; } else { tempStr += str[i]; } } // //最后一次尾巴 if (tempStr.length > 0){ strArray.push(tempStr) } return strArray } // 格式化打印文本 export const textFormat = function(command,text,maxFontNums,left,top,lightHeight,align,fontSize){ let rowTop = top const maxNums = maxFontNums const rowHeight = lightHeight const textArr = getTextRows(text.replace(/\s+/g, ' '),maxNums*2) const rows = textArr.length for(let i=0;i<rows;i++){ if(align=="center"){ const ltxt = textArr[i] const ltlen = getBytesCount(ltxt)/2*fontSize command.setText(left+((maxNums-ltlen)/2)*rowHeight-2, rowTop, "TSS24.BF2", fontSize, fontSize, ltxt) } else{ command.setText(left, rowTop, "TSS24.BF2", fontSize, fontSize, textArr[i]) } rowTop = rowTop+rowHeight*fontSize+5 } return rowTop } export const printText = function(tsc,text){ const command = tsc.jpPrinter.createNew() command.init() command.setSize(40, 30) // 标签纸张宽高,单位mm command.setGap(3) // 标签上下间距,单位mm command.setCls() // 清除缓冲区数据 command.setText(100, 48, "5", 4, 3, text) command.setPagePrint(1,1) // 打印分数1,每个标签重发打印2次 return command } // 60 * 40 尺寸模板 export const printTempl = function(tsc,data){ let top = 32 // 距离顶部 const left = 8 // 距离左边 const lightHeight = 24 // 行高3mm,1mm = 8点 const pageW = 60 // 页签宽度mm const pageH = 40 // 页签高度mm const maxFontNums = Math.floor((pageW*8-left*4)/lightHeight) // 每行最多字体数 const leftMaxFnums = Math.floor(maxFontNums*0.4) const rightMaxFnums = leftMaxFnums + 1 let rightLeft = (leftMaxFnums+2.5)*lightHeight // 初始化打印机 const command = tsc.jpPrinter.createNew() command.init() command.setSize(pageW, pageH) // 标签纸张宽高,单位mm command.setGap(3) // 标签上下间距,单位mm command.setCls() // 清除缓冲区数据 // 经销商文字高度,是否换行 top = textFormat(command,data.dealerName,maxFontNums,left,top,lightHeight,"center",1) // 数字货架名称文字 top = top+10 top = textFormat(command,data.shelfName,maxFontNums,left,top,lightHeight,"center",1) // 二维码 top = top+15 command.setQR(left*6, top, "M", 5, "A", data.barCode) // 货位号 const rightTop = textFormat(command,data.shelfPlaceCode,rightMaxFnums,rightLeft,top,lightHeight,"left",4) // 产品编码 top = rightTop + 1 top = textFormat(command,data.productCode,rightMaxFnums,rightLeft,top,lightHeight,"left",1) // 打印人打印时间 top = top+3 top = textFormat(command,data.printDate,rightMaxFnums,rightLeft,top,lightHeight,"left",1) // 打印分数1,每个标签重发打印2次 command.setPagePrint(1,data.currentInven) return command } // 格式化cpcl打印文本 export const textCpclFormat = function(cpcl,text,maxFontNums,left,top,lightHeight,align,fontName,fontSize){ let rowTop = top const maxNums = maxFontNums const rowHeight = lightHeight const textArr = getTextRows(text.replace(/\s+/g, ' '),maxNums*2) const rows = textArr.length let result = '' for(let i=0;i<rows;i++){ if(align=="center"){ result += cpcl.addCPCLLocation(2) } else{ result += cpcl.addCPCLLocation(0) } result += cpcl.addCPCLText(left,rowTop,fontName,fontSize,0,textArr[i]); rowTop = rowTop+rowHeight+5 } return {result:result,top:rowTop} } // 60 * 40 尺寸模板 cpcl 指令 export const printCpclTempl = function(cpcl,data){ console.log(cpcl) let top = 0 // 距离顶部 const left = 8 // 距离左边 const lightHeight = 24 // 行高3mm,1mm = 8点 const pageW = 60 // 页签宽度mm const pageH = 40 // 页签高度mm const maxFontNums = Math.floor((pageW*8-left*4)/lightHeight) // 每行最多字体数 const leftMaxFnums = Math.floor(maxFontNums*0.4) const rightMaxFnums = leftMaxFnums + 2 let rightLeft = (leftMaxFnums+2)*lightHeight // 初始化打印机 let strCmd =cpcl.CreatCPCLPage(pageW*8,pageH*8,data.currentInven,0); // 经销商文字高度,是否换行 const a = textCpclFormat(cpcl,data.dealerName,maxFontNums,0,top,lightHeight,"center",'24',0); top = a.top; strCmd += a.result; // 数字货架名称文字 top = top+10; const b = textCpclFormat(cpcl,data.shelfName,maxFontNums,0,top,lightHeight,"center",'24',0); top = b.top; strCmd += b.result; // 二维码 top = top+15; strCmd += cpcl.addCPCLLocation(0); strCmd += cpcl.addCPCLQRCode(left*5,top,'M', 3, 5, data.barCode); // 货位号 strCmd += cpcl.addCPCLSETMAG(4,4); const c = textCpclFormat(cpcl,data.shelfPlaceCode,rightMaxFnums,rightLeft,top,lightHeight,"left",'7',0); const rightTop = c.top; strCmd += c.result; // 产品编码 top = rightTop + 65; strCmd += cpcl.addCPCLSETMAG(1,1); const d = textCpclFormat(cpcl,data.productCode,rightMaxFnums,rightLeft,top,lightHeight,"left",'7',0); top = d.top; strCmd += d.result; // 打印人打印时间 top = top+4; strCmd += cpcl.addCPCLSETMAG(1,1); const e = textCpclFormat(cpcl,data.printDate,rightMaxFnums,rightLeft,top,lightHeight,"left",'7',0); top = e.top; strCmd += e.result; strCmd += 'FORM \n' strCmd += cpcl.addCPCLPrint(); console.log(strCmd) return gbk.strToGBKByte(strCmd); } // 40 * 30 尺寸模板 export const printMiniTempl = function(tsc,data){ let top = 24 // 距离顶部 const left = 4 // 距离左边 const lightHeight = 24 // 行高3mm,1mm = 8点 const pageW = 40 // 页签宽度mm const pageH = 30 // 页签高度mm const maxFontNums = Math.floor((pageW*8-left*2)/lightHeight) // 每行最多字体数 const leftMaxFnums = Math.floor(maxFontNums*0.5) const rightMaxFnums = Math.floor(maxFontNums*0.4) let rightLeft = (leftMaxFnums+1)*lightHeight // 初始化打印机 const command = tsc.jpPrinter.createNew() command.init() command.setSize(pageW, pageH) // 标签纸张宽高,单位mm command.setGap(3) // 标签上下间距,单位mm command.setCls() // 清除缓冲区数据 // 经销商文字高度,是否换行 top = textFormat(command,data.dealerName,maxFontNums,left,top,lightHeight,"center",1) // 数字货架名称文字 top = top+10 top = textFormat(command,data.shelfName,maxFontNums,left,top,lightHeight,"center",1) // 二维码 top = top+10 command.setQR(left, top, "M", 5, "A", data.barCode) // 货位号 const rightTop = textFormat(command,data.shelfPlaceCode,rightMaxFnums,rightLeft,top,lightHeight,"left",3) // 产品编码 top = rightTop top = textFormat(command,data.productCode,rightMaxFnums,rightLeft,top,lightHeight,"left",1) // 打印分数1,每个标签重发打印2次 command.setPagePrint(1,data.currentInven) return command }