一、说明

在打印小票的时候,商品名称一行显示不下需要折行打印,但是这个折行又不是放在末尾,到头后再折回来接着打印,该怎么办呢 ?

二、思路

大体的思路就是将商品名称切割成最大不超过一定长度的若干个字符串,在第一行打印商品名的第一个字符串,然后再打印单价、数量、金额等信息,打印完第一行后再在下面打印名称没打印完成的部分。

三、问题

切割的时候又会有个问题,商品信息里面有汉字,有字母,还会有数字和特殊符号,如果切割不好,很有可能会切出乱码。
一般一个汉字占2个字节,一个英文字母是占1个字节;平常在占位上一个汉字是占2个英文字母的位置,平常开发的时候我们一般是以UTF-8格式的,如果想计算好宽度又需要将其转为gbk 或 gb2312,总体来说需要考虑的面还是比较多的。

四、解决方案

/*** 按字节截取字符串*/
public class SubByteString {public static String subStr(String str, int subSLength) throws UnsupportedEncodingException{if (str == null)return "";else{int tempSubLength = subSLength;//截取字节数String subStr = str.substring(0, str.length()<subSLength ? str.length() : subSLength);//截取的子串int subStrByetsL = subStr.getBytes("GBK").length;//截取子串的字节长度//int subStrByetsL = subStr.getBytes().length;//截取子串的字节长度// 说明截取的字符串中包含有汉字while (subStrByetsL > tempSubLength){int subSLengthTemp = --subSLength;subStr = str.substring(0, subSLengthTemp>str.length() ? str.length() : subSLengthTemp);subStrByetsL = subStr.getBytes("GBK").length;//subStrByetsL = subStr.getBytes().length;}return subStr;}}public static String[] getSubedStrings(String string, int unitLength) {if (TextUtils.isEmpty(string)) {return null;}String str = new String(string);int arraySize = 0;try {arraySize = str.getBytes("GBK").length / unitLength;} catch (UnsupportedEncodingException e) {e.printStackTrace();}if (str.getBytes().length % unitLength > 0) {arraySize++;}String[] result = new String[arraySize];for (int i = 0; i < arraySize; i++) {try {result[i] = subStr(str, unitLength);} catch (UnsupportedEncodingException e) {e.printStackTrace();}str = str.replace(result[i], "");}return result;}
}

用以上代码可以将一个字符串切割成一个字符数组,这样将第一行显示不下的再多打印几行即可完成商品名称换行问题。最后,我将格式化整个商品信息小票打印的代码贴出来,以供参考:

public class PrintSplitUtil {private static final String PRINT_LINE = "------------------------------------------------\n";public static final int PRINT_TOTAL_LENGTH = 48 * 3;public static final short PRINT_POSITION_0 = 0;public static final short PRINT_POSITION_1 = 26 * 3;public static final short PRINT_POSITION_2 = 32 * 3;public static final short PRINT_POSITION_3 = 42 * 3;public static final int MAX_GOODS_NAME_LENGTH = 22 * 3;public static final short PRINT_UNIT = 43;public static PrinterSplitInfo getPrintText(Context context, GoodsListInfo goodsInfo, String store, String userMobile, String qrCode) {PrinterSplitInfo printerSplitInfo = new PrinterSplitInfo();EscCommand esc = new EscCommand();esc.addInitializePrinter();// 顶部图片esc.addSelectJustification(JUSTIFICATION.CENTER);Bitmap b = BitmapFactory.decodeResource(context.getResources(), R.mipmap.printer_logo);esc.addRastBitImage(b, 200, 0); // 打印图片esc.addPrintAndLineFeed();esc.addText(PRINT_LINE);// 订单信息if (!TextUtils.isEmpty(store)) {esc.addSelectJustification(JUSTIFICATION.LEFT);esc.addSelectPrintModes(FONT.FONTA, ENABLE.ON, ENABLE.OFF, ENABLE.OFF, ENABLE.OFF);esc.addText(store + "\n"); // 打印文字}esc.addSelectJustification(JUSTIFICATION.LEFT);esc.addSelectPrintModes(FONT.FONTA, ENABLE.OFF, ENABLE.OFF, ENABLE.OFF, ENABLE.OFF);// 头部信息esc.addText("打印编号:" + goodsInfo.express_sn);esc.addPrintAndLineFeed();esc.addText("操作时间:" + DateTimeUtil.getCurrentDateTime());esc.addPrintAndLineFeed();esc.addText("操作员:" + userMobile);esc.addPrintAndLineFeed();esc.addText(PRINT_LINE);// 商品头信息esc.addSetHorAndVerMotionUnits((byte) PRINT_UNIT, (byte) 0);esc.addText("商品名");esc.addSetAbsolutePrintPosition(PRINT_POSITION_1);esc.addText("单价");esc.addSetAbsolutePrintPosition(PRINT_POSITION_2);esc.addText("数量");esc.addSetAbsolutePrintPosition(PRINT_POSITION_3);esc.addText("金额");esc.addPrintAndLineFeed();// 商品信息if (goodsInfo.goods_list != null && goodsInfo.goods_list.size() > 0) {esc.addSelectPrintModes(FONT.FONTA, ENABLE.OFF, ENABLE.ON, ENABLE.OFF, ENABLE.OFF);for (int i = 0; i < goodsInfo.goods_list.size(); i++) {GoodsListInfo.GoodsListBean goods = goodsInfo.goods_list.get(i);String[] goodsNames = SubByteString.getSubedStrings(goods.goods_name, 20);printerSplitInfo.dataRow += goodsNames.length;// 商品名称if (goodsNames != null && goodsNames.length > 0) {esc.addText((i + 1) + "." + goodsNames[0]);} else {esc.addText((i + 1) + "." + goods.goods_name);}esc.addSetHorAndVerMotionUnits((byte) PRINT_UNIT, (byte) 0);// 单价short priceLength = (short) goods.goods_price.length();short pricePosition = (short) (PRINT_POSITION_1 + 12 - priceLength * 3);esc.addSetAbsolutePrintPosition(pricePosition);esc.addText(goods.goods_price);      // 单价还未获取// 数量short numLength = (short) (goods.goods_num + goods.goods_unit).getBytes().length;short numPosition = (short) (PRINT_POSITION_2 + 14 - numLength * 3);esc.addSetAbsolutePrintPosition(numPosition);esc.addText(goods.goods_num + goods.goods_unit);// 金额short amountLength = (short) goods.goods_amount.replace(" ", "").getBytes().length;short amountPosition = (short) (PRINT_POSITION_3 + 11 - amountLength * 3);esc.addSetAbsolutePrintPosition(amountPosition);esc.addText(goods.goods_amount);if (goodsNames == null || goodsNames.length == 0) {esc.addPrintAndLineFeed();} else if (goodsNames != null && goodsNames.length > 1) {for (int j = 1; j < goodsNames.length; j++) {esc.addText(goodsNames[j]);esc.addPrintAndLineFeed();}}}esc.addSelectPrintModes(FONT.FONTA, ENABLE.OFF, ENABLE.OFF, ENABLE.OFF, ENABLE.OFF);esc.addText(PRINT_LINE);}// 总计信息esc.addSelectJustification(JUSTIFICATION.RIGHT);// 设置打印居右if (!TextUtils.isEmpty(goodsInfo.subsidy)) {esc.addText("优惠补贴:" + goodsInfo.subsidy + "元\n");}if (!TextUtils.isEmpty(goodsInfo.goods_amount)) {esc.addText("金额总计:" + goodsInfo.goods_amount + "元\n");}if (!TextUtils.isEmpty(goodsInfo.order_amount)) {esc.addText("还需支付:" + goodsInfo.order_amount + "元\n");}esc.addText(PRINT_LINE);//        打印二维码if (!TextUtils.isEmpty(qrCode)) {esc.addPrintAndLineFeed();esc.addSelectJustification(JUSTIFICATION.CENTER);// 设置打印居中esc.addText("请打开微信,扫码付款\n");esc.addPrintAndLineFeed();// 48  49  50  51esc.addSelectErrorCorrectionLevelForQRCode((byte) 0x31); // 设置纠错等级esc.addSelectSizeOfModuleForQRCode((byte) 7);// 设置qrcode模块大小esc.addStoreQRCodeData(qrCode);// 设置qrcode内容esc.addPrintQRCode();// 打印QRCodeesc.addPrintAndLineFeed();esc.addText("请将二维码放平整后再扫码\n");}esc.addPrintAndFeedLines((byte) 3);// 加入查询打印机状态,打印完成后,此时会接收到GpCom.ACTION_DEVICE_STATUS广播esc.addQueryPrinterStatus();// 最终数据Vector<Byte> datas = esc.getCommand();byte[] bytes = GpUtils.ByteTo_byte(datas);String result = Base64.encodeToString(bytes, Base64.DEFAULT);printerSplitInfo.data = result;return printerSplitInfo;}
}

五、小票展示

这是最后完成后打印出来的小票样式,以供参考:

Android集成佳博热敏打印机打印小票商品名称换行问题相关推荐

  1. Android集成佳博热敏打印机打印小票功能

    一.说明 最近公司项目需要做打印机打印小票功能,首先公司买了一个佳博小票打印机作为测试用机.然后在开发的过程中也遇到一些坑,在此记录一下. 二.集成过程 1. 下载开发文档 首先需要去其官网下载SDK ...

  2. Android集成佳博热敏打印机打印小票对齐问题

    一.说明 比如:商品名.单价.数量.金额,它们的排列需要像表格一样对齐. 二.实现 主要用到的API: // 设置单位距离 esc.addSetHorAndVerMotionUnits((byte) ...

  3. 【Android】Android 集成佳博80打印机打印票据

    文章目录 [Android]Android 集成佳博80打印机打印票据 1.集成佳博80打印机依赖 2.规范调用接口 3.使用到的相关对象以及工具类 4.MainActivity初始化接口 5.Uni ...

  4. JAVA 佳博热敏打印机利用TSCLIB.dll动态链接库打印物料条码

    JAVA 佳博热敏打印机利用TSCLIB.dll动态链接库打印物料条码 准备 1.TSCLIB.dll (下载版本与jdk版本一致,32位/64位) 2.佳博热敏打印机一台(或其他tsc系列打印机) ...

  5. 2021-07-22 佳博 蓝牙打印

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 佳博 蓝牙打印 前言 一.想好所需模板样式? 二.引入修改模板样式的js 1.引入库 2.根据所需样式编辑 3.根据uniAPP AP ...

  6. Android接入热敏打印机,Android 关于佳博和汉印蓝牙热敏打印机开发

    接上篇文章Android之BLE(低功耗)蓝牙开发,本篇文章针对上篇博文中提出的两款打印机的开发流程进行记录. 首先不管时佳博打印机还是汉印打印机,都是先对他们各自的lib进行导入,如图: 导入lib ...

  7. Android 关于佳博和汉印蓝牙热敏打印机开发

    接上篇文章Android之BLE(低功耗)蓝牙开发,本篇文章针对上篇博文中提出的两款打印机的开发流程进行记录. 首先不管时佳博打印机还是汉印打印机,都是先对他们各自的lib进行导入,如图: 导入lib ...

  8. Android 关于佳博和汉印蓝牙热敏打印机开发,kotlin爬虫app

    Log.e(TAG, "printCPCL: =======>443"); if (PrinterHelper.IsOpened()) { Log.e(TAG, " ...

  9. Android 关于佳博和汉印蓝牙热敏打印机开发,android面试必看书籍

    PrinterHelper.SetBold("1"); PrinterHelper.SetMag("2", "2"); PrinterHel ...

最新文章

  1. 图像热点(图像地图)
  2. spring mvc-使用Servlet原生API作为参数
  3. CodeIgniter笔记4
  4. C# Regex类详解
  5. HTML 部分常用属性、组成属性|...超链接、路径、锚点、列表、滚动、URL编码、表格、表单、GET和POST
  6. Linux下使用Speedtest测试网速
  7. spring boot 邮件端口_springboot集成qq邮件发送功能
  8. 测试是浪费时间,我的程序肯定没问题
  9. java去掉文本格式分割成字然段落_Java实现文本按照自然段落进行切分详解
  10. AD如何清理过期电脑
  11. asp 开发app_从零开始实现 ASP.NET Core MVC 的插件式开发(七) 问题汇总及部分问题解决方案...
  12. Vue实例与组件实例
  13. 易优EyouCMS全套插件使用说明
  14. laravel 房源
  15. 备份计算机软件,如何备份电脑里面的软件
  16. qml+QQuickPaintedItem数学公式编辑器的实现
  17. pythondocker——外部无法访问,报错:该网页无法正常运作
  18. 亚洲上海linux_亚洲企鹅中学Linux俱乐部启发社区
  19. scrapy中的Request的用法
  20. metrics.accuracy_score()函数 计算acc

热门文章

  1. JGG论坛:赵方庆研究员解析肠道菌群与人体健康(11月10日10:00)
  2. java 小程序 自己学习
  3. 一文读懂 HTTPS 与 TLS证书链校验
  4. sublime text3 字体样式_Sublime Text3 Github最受欢迎主题字体推荐!
  5. 03独立按键控制LED移动
  6. memcacheredis构建缓存服务器
  7. play框架使用起来(6)
  8. 兰州交通大学php,航拍兰州交通大学校园∣让我再看你一遍 从南到北
  9. React+dva多图片上传
  10. 庄帅:托管分销与物流集成战略雏形