Android打印机--小票打印格式及模板设置实例代码
小票打印就是向打印设备发送控制打印格式的指令集,而这些打印格式需要去查询对应打印机的API文档,这里我把常用的api给封装了一下
- 文字对齐方式
- 打印字体大小
- 字体是否加粗
- 打印二维码
- 打印条形码
- 切纸
- 打开钱箱
- 字符串转字节数组
- 字符拼接
PrintFormatUtils.Java
/** *打印格式 *Createdbyjohnon17-3-23. */ publicclassPrintFormatUtils{ //对齐方式 publicstaticfinalintALIGN_LEFT=0;//靠左 publicstaticfinalintALIGN_CENTER=1;//居中 publicstaticfinalintALIGN_RIGHT=2;//靠右 //字体大小 publicstaticfinalintFONT_NORMAL=0;//正常 publicstaticfinalintFONT_MIDDLE=1;//中等 publicstaticfinalintFONT_BIG=2;//大 //加粗模式 publicstaticfinalintFONT_BOLD=0;//字体加粗 publicstaticfinalintFONT_BOLD_CANCEL=1;//取消加粗 /** *打印二维码 *@paramqrCode *@return */ publicstaticStringgetQrCodeCmd(StringqrCode){ byte[]data; intstore_len=qrCode.length()+3; bytestore_pL=(byte)(store_len%256); bytestore_pH=(byte)(store_len/256); //QRCode:Selectthemodel //Hex1D286B04003141n1(x32)n2(x00)-sizeofmodel //setn1[49x31,model1][50x32,model2][51x33,microqrcode] //https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=140 byte[]modelQR={(byte)0x1d,(byte)0x28,(byte)0x6b,(byte)0x04,(byte)0x00,(byte)0x31,(byte)0x41,(byte)0x32,(byte)0x00}; //QRCode:Setthesizeofmodule //Hex1D286B03003143n //ndependsontheprinter //https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=141 byte[]sizeQR={(byte)0x1d,(byte)0x28,(byte)0x6b,(byte)0x03,(byte)0x00,(byte)0x31,(byte)0x43,(byte)0x08}; //Hex1D286B03003145n //Setnforerrorcorrection[48x30->7%][49x31->15%][50x32->25%][51x33->30%] //https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=142 byte[]errorQR={(byte)0x1d,(byte)0x28,(byte)0x6b,(byte)0x03,(byte)0x00,(byte)0x31,(byte)0x45,(byte)0x31}; //QRCode:Storethedatainthesymbolstoragearea //Hex1D286BpLpH315030d1...dk //https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=143 //1D286BpLpHcn(49->x31)fn(80->x50)m(48->x30)d1…dk byte[]storeQR={(byte)0x1d,(byte)0x28,(byte)0x6b,store_pL,store_pH,(byte)0x31,(byte)0x50,(byte)0x30}; //QRCode:Printthesymboldatainthesymbolstoragearea //Hex1D286B03003151m //https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=144 byte[]printQR={(byte)0x1d,(byte)0x28,(byte)0x6b,(byte)0x03,(byte)0x00,(byte)0x31,(byte)0x51,(byte)0x30}; data=byteMerger(modelQR,sizeQR); data=byteMerger(data,errorQR); data=byteMerger(data,storeQR); data=byteMerger(data,qrCode.getBytes()); data=byteMerger(data,printQR); returnnewString(data); } /** *打印条码 *@parambarcode *@return */ publicstaticStringgetBarcodeCmd(Stringbarcode){ //打印Code-128条码时需要使用字符集前缀 //"{A"表示大写字母 //"{B"表示所有字母,数字,符号 //"{C"表示数字,可以表示00-99的范围 byte[]data; StringbtEncode; if(barcode.length()<18){ //字符长度小于15的时候直接输出字符串 btEncode="{B"+barcode; }else{ //否则做一点优化 intstartPos=0; btEncode="{B"; for(inti=0;i57||i==(barcode.length()-1)){ //如果是非数字或者是最后一个字符 if(i-startPos>=10){ if(startPos==0){ btEncode=""; } btEncode+="{C"; booleanisFirst=true; intnumCode=0; for(intj=startPos;j 有了打印格式,还要对具体的打印小票设置打印模板,主要就是利用上面的打印格式工具类,进行字符或字符串拼接,设置文字间空格的长度,以及使用换行符换行等。
有些小票打印的内容有可能是通用的,比如底部结束语–可能是公司宣传语或广告语,这些内容是否展示需要根据具体需求加以控制,还有二维码、条形码打印,是否切纸等需要根据实际场景取舍,所以最好封装一个打印配置类,以控制打印内容显示。
/** *打印模板 */ publicclassPrintContract{ /** *打印内容 */ publicstaticStringBuildercreateXxTxt(String...){ StringBuilderbuilder=newStringBuilder(); //设置大号字体以及加粗 builder.append(PrintFormatUtils.getFontSizeCmd(PrintFormatUtils.FONT_BIG)); builder.append(PrintFormatUtils.getFontBoldCmd(PrintFormatUtils.FONT_BOLD)); //标题 builder.append("Title"); //换行,调用次数根据换行数来控制 addLineSeparator(builder); //设置普通字体大小、不加粗 builder.append(PrintFormatUtils.getFontSizeCmd(PrintFormatUtils.FONT_NORMAL)); builder.append(PrintFormatUtils.getFontBoldCmd(PrintFormatUtils.FONT_BOLD_CANCEL)); //内容 ...... //设置某两列文字间空格数,x需要计算出来 addIdenticalStrToStringBuilder(builder,x,""); //切纸 builder.append(PrintFormatUtils.getCutPaperCmd()); returnbuilder; } /** *向StringBuilder中添加指定数量的相同字符 * *@paramprintCount添加的字符数量 *@paramidenticalStr添加的字符 */ privatestaticvoidaddIdenticalStrToStringBuilder(StringBuilderbuilder,intprintCount,StringidenticalStr){ for(inti=0;i0){ result=newString(a,0,len,"GBK"); intlength=result.length(); if(str.charAt(length-1)!=result.charAt(length-1)){ if(length<2){ result=null; }else{ result=result.substring(0,length-1); } } } }catch(Exceptione){ e.printStackTrace(); } } returnresult; } /** *添加换行符 */ privatestaticvoidaddLineSeparator(StringBuilderbuilder){ builder.append("\n"); } /** *在GBK编码下,获取其字符串占据的字符个数 */ privatestaticintgetCharCountByGBKEncoding(Stringtext){ try{ returntext.getBytes("GBK").length; }catch(Exceptione){ e.printStackTrace(); return0; } } /** *打印相关配置 */ publicstaticclassPrintConfig{ publicintmaxLength=30; publicbooleanprintBarcode=false;//打印条码 publicbooleanprintQrCode=false;//打印二维码 publicbooleanprintEndText=true;//打印结束语 publicbooleanneedCutPaper=false;//是否切纸 } } 有了打印模板,接下来就是调用打印设备打印方法发送打印指令
//调用打印机打印方法,传入上面某个小票打印模板返回的字符串 Stringstr=PrintContract.createXxTxt(...); printer.print(str,null); //打开钱箱方法 printer.print(PrintFormatUtils.getOpenDrawerCmd(),null);以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。