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);
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。