import { hiprint, defaultElementTypeProvider } from "vue-plugin-hiprint"; // 引入后使用示例 hiprint.init(); hiprint.hiwebSocket.setHost("http://localhost:17521"); // window.open("hiprint://"); // 配置 const WIDTH = 58; //纸张宽度 mm const T_WIDTH = 150; //文本宽度 pt const T_LEFT = 4; //文本左边距 pt export const print = (data: any) => { // hiprint对象获取 const list = hiprint.hiwebSocket.getPrinterList(); console.log(list); let nowHeight = 0; let textHeight = 10; // 下列方法都是没有拖拽设计页面的, 相当于代码模式, 使用代码设计页面 // 想要实现拖拽设计页面,请往下看 '自定义设计' var hiprintTemplate = new hiprint.PrintTemplate(); // 纸张高度 固定为 130 pt + 商品数量高度 let oneHeight = 120 + Math.ceil((data.info.length * 2 * 10) / 2.84); // 模板宽度单位是mm ( 1mm ~= 2.84pt ) 其他的宽高单位是pt var panel = hiprintTemplate.addPrintPanel({ width: 58, // 58mm = 164pt height: oneHeight, paperNumberDisabled: true, }); let options = (e: any) => { nowHeight += textHeight; let opt = { width: T_WIDTH, height: textHeight, top: nowHeight, left: T_LEFT, title: "", }; if (typeof e === "string") opt.title = e; else opt = Object.assign(opt, e); return { options: opt, }; }; let lineTitle = () => { nowHeight += textHeight; let left = Math.floor(T_WIDTH / 3); panel.addPrintText({ options: { width: left, height: 10, top: nowHeight, left: 0, title: "单价", textAlign: "center", }, }); panel.addPrintText({ options: { width: left, height: textHeight, top: nowHeight, left: left, title: "数量", textAlign: "center", }, }); panel.addPrintText({ options: { width: left, height: textHeight, top: nowHeight, left: left * 2, title: "小计", textAlign: "center", }, }); }; let lineOptions = (text1: any, text2: any, text3: any) => { nowHeight += textHeight; let left = Math.floor(T_WIDTH / 3); panel.addPrintText({ options: { width: left, height: 10, top: nowHeight, left: 0, title: text1 + "", textAlign: "center", }, }); panel.addPrintText({ options: { width: left, height: textHeight, top: nowHeight, left: left, title: text2 + "", textAlign: "center", }, }); panel.addPrintText({ options: { width: left, height: textHeight, top: nowHeight, left: left * 2, title: text3 + "", textAlign: "center", }, }); }; //文本 *1 panel.addPrintText( options({ title: "泸优采-采购单", textAlign: "center", }) ); //文本 *6 panel.addPrintText(options("单号: " + data.number)); panel.addPrintText(options("配送时间: " + data.create_time)); panel.addPrintText(options("配送员: " + data.mer_nickname)); panel.addPrintText(options("配送电话: " + data.mer_phone)); panel.addPrintText(options("======================")); panel.addPrintText(options("商品信息: ")); //格式化 *1 + x * y lineTitle(); data.info.forEach((item: any) => { panel.addPrintText(options(item.goods_name)); if(item.nums==Math.floor(+item.nums)) item.nums = Number(item.nums).toFixed(0); lineOptions( `${item.price}元`, `${item.nums}${item.unit_name}`, `${item.total}元` ); }); //文本 *5 panel.addPrintText(options("======================")); panel.addPrintText(options(`合计: ${data.total}元`)); panel.addPrintText(options("提货点: " + data.mer_name)); panel.addPrintText(options("提货点电话: " + data.mer_phone)); panel.addPrintText(options("提货点负责人签字:")); // https://lihai001.oss-cn-chengdu.aliyuncs.com/def/db264202405221455038529.png //无字 // https://lihai001.oss-cn-chengdu.aliyuncs.com/def/54705202405221504133485.png //有字 // panel.addPrintRect({ options: { width: T_WIDTH, height:30,top: nowHeight + 15, left: T_LEFT,borderColor:'',borderWidth:0.75 } }); // nowHeight+=40; // 文本 *6 panel.addPrintImage({ options: { width: T_WIDTH, height: 50, top: nowHeight + 15, left: T_LEFT, title: "", src: "https://lihai001.oss-cn-chengdu.aliyuncs.com/def/db264202405221455038529.png", }, }); nowHeight += 60; // 文本 *4 panel.addPrintText(options("收货人: " + data.real_name)); panel.addPrintText(options("收货地址: " + data.user_address)); panel.addPrintText(options("联系电话: " + data.user_phone)); panel.addPrintText(options("收货人签字:")); // panel.addPrintRect({ options: { width: T_WIDTH, height:30,top: nowHeight+15, left: T_LEFT,borderColor:'',borderWidth:0.75 } }); // 文本 *6 panel.addPrintImage({ options: { width: T_WIDTH, height: 50, top: nowHeight + 15, left: T_LEFT, title: "", src: "https://lihai001.oss-cn-chengdu.aliyuncs.com/def/db264202405221455038529.png", }, }); nowHeight += 60; // 文本 *4 panel.addPrintText(options("")); panel.addPrintText(options("")); panel.addPrintText(options("")); panel.addPrintText(options("======================")); // 合计高度 23 + length * 2 //打印 hiprintTemplate.print({}); //直接打印,需要安装客户端 // hiprintTemplate.print2({}); // 直接打印回调 // 发送任务到打印机成功 hiprintTemplate.on("printSuccess", (e: any) => { console.log("printSuccess", e); }); // 发送任务到打印机失败 hiprintTemplate.on("printError", (e: any) => { console.log("printError", e); }); }; export const testPrint = () => { // hiprint对象获取 const list = hiprint.hiwebSocket.getPrinterList(); console.log(list); let nowHeight = 0; let textHeight = 10; // 下列方法都是没有拖拽设计页面的, 相当于代码模式, 使用代码设计页面 // 想要实现拖拽设计页面,请往下看 '自定义设计' var hiprintTemplate = new hiprint.PrintTemplate(); // 模板宽度单位是mm ( 1mm ~= 2.84pt ) 其他的宽高单位是pt var panel = hiprintTemplate.addPrintPanel({ width: 58, // 58mm = 164pt height: 145, paperNumberDisabled: true, }); let options = (e: any) => { nowHeight += textHeight; let opt = { width: T_WIDTH, height: textHeight, top: nowHeight, left: T_LEFT, title: "", }; if (typeof e === "string") opt.title = e; else opt = Object.assign(opt, e); return { options: opt, }; }; let lineTitle = () => { nowHeight += textHeight; let left = Math.floor(T_WIDTH / 3); panel.addPrintText({ options: { width: left, height: 10, top: nowHeight, left: 0, title: "单价", textAlign: "center", }, }); panel.addPrintText({ options: { width: left, height: textHeight, top: nowHeight, left: left, title: "数量", textAlign: "center", }, }); panel.addPrintText({ options: { width: left, height: textHeight, top: nowHeight, left: left * 2, title: "小计", textAlign: "center", }, }); }; let lineOptions = (text1: any, text2: any, text3: any) => { nowHeight += textHeight; let left = Math.floor(T_WIDTH / 3); panel.addPrintText({ options: { width: left, height: 10, top: nowHeight, left: 0, title: text1 + "", textAlign: "center", }, }); panel.addPrintText({ options: { width: left, height: textHeight, top: nowHeight, left: left, title: text2 + "", textAlign: "center", }, }); panel.addPrintText({ options: { width: left, height: textHeight, top: nowHeight, left: left * 2, title: text3 + "", textAlign: "center", }, }); }; //文本 *1 panel.addPrintText( options({ title: "泸优采-小票0", textAlign: "center", }) ); //文本 *6 panel.addPrintText(options("单号: PF171617436315965155")); panel.addPrintText(options("配送时间: 2024-05-20 11:06:03")); panel.addPrintText(options("配送员: 二狗")); panel.addPrintText(options("配送电话: 19330904744")); panel.addPrintText(options("======================")); panel.addPrintText(options("商品信息: ")); //格式化 *1 + 2*3 lineTitle(); panel.addPrintText(options("朝天椒, 辣椒")); lineOptions("0.01元", "25个", "0.25元"); panel.addPrintText(options("朝天椒, 辣椒")); lineOptions("0.01元", "25个", "0.25元"); panel.addPrintText(options("朝天椒, 辣椒")); lineOptions("0.01元", "25个", "0.25元"); //文本 *13 panel.addPrintText(options("======================")); panel.addPrintText(options("合计: 0.75元")); panel.addPrintText(options("提货点: 莲花农贸市场")); panel.addPrintText(options("提货点电话: 19330904744")); panel.addPrintText(options("提货点负责人签字:")); // https://lihai001.oss-cn-chengdu.aliyuncs.com/def/db264202405221455038529.png //无字 // https://lihai001.oss-cn-chengdu.aliyuncs.com/def/54705202405221504133485.png //有字 // panel.addPrintRect({ options: { width: T_WIDTH, height:30,top: nowHeight + 15, left: T_LEFT,borderColor:'',borderWidth:0.75 } }); // nowHeight+=40; panel.addPrintImage({ options: { width: T_WIDTH, height: 50, top: nowHeight + 15, left: T_LEFT, title: "", src: "https://lihai001.oss-cn-chengdu.aliyuncs.com/def/db264202405221455038529.png", }, }); nowHeight += 60; panel.addPrintText(options("收货人: 阿哈")); panel.addPrintText(options("收货地址: 里海科技")); panel.addPrintText(options("联系电话: 17685151643")); panel.addPrintText(options("收货人签字:")); // panel.addPrintRect({ options: { width: T_WIDTH, height:30,top: nowHeight+15, left: T_LEFT,borderColor:'',borderWidth:0.75 } }); panel.addPrintImage({ options: { width: T_WIDTH, height: 50, top: nowHeight + 15, left: T_LEFT, title: "", src: "https://lihai001.oss-cn-chengdu.aliyuncs.com/def/db264202405221455038529.png", }, }); nowHeight += 60; panel.addPrintText(options("")); panel.addPrintText(options("")); panel.addPrintText(options("")); panel.addPrintText(options("======================")); // 合计高度 23 + length * 2 //打印 // hiprintTemplate.print({}); //直接打印,需要安装客户端 hiprintTemplate.print2({}); // 直接打印回调 // 发送任务到打印机成功 hiprintTemplate.on("printSuccess", (e: any) => { console.log("printSuccess", e); ElMessage.success('订单已加入打印队列'); }); // 发送任务到打印机失败 hiprintTemplate.on("printError", (e: any) => { console.log("printError", e); ElMessage.error('打印失败,请检查是否正确连接打印机!'); }); }; export const printerList = () => { try { const list = hiprint.hiwebSocket.getPrinterList(); return list; } catch { ElMessage.error("请先安装打印机客户端"); return []; } }; // 计算字符串长度 function calculateStringLength(str: string) { let count = 0; for (let i = 0; i < str.length; i++) { const charCode = str.charCodeAt(i); // 检查字符是否在汉字的Unicode范围内(注意这也会包括日韩文字等,更精确的检查可能需要更复杂的逻辑) if ( (charCode >= 0x4e00 && charCode <= 0x9fff) || (charCode >= 0x3400 && charCode <= 0x4dff) || (charCode >= 0x20000 && charCode <= 0x2ffff) ) { count += 2; // 汉字算2个字符 } else { count += 1; // 其他字符算1个字符 } } return count; }