java 打印机类printer_GitHub - 505058216/thermal_printer: Java实现网络小票打印机自定义无驱打印...-程序员宅基地

技术标签: java 打印机类printer  

Java实现POS打印机自定义无驱打印

热敏打印机使用越来越广泛,而安装驱动相当复杂,万幸的是,几乎所有的热敏打印机都支持ESC/P指令,参考网络上一些资料后,在此整理了一份自定义打印的方案

• 打印模板

为了增强打印效果的通用性,因此需要提供多元化的模板对齐支持,而且不同大小的打印机所需的版式也不尽相同

模板采用Json格式存储,分为header、goods、bill、footer四个部分,对模板的解析采用号称史上最快的阿里出品的fastjson

模板示例

{

"header": [

{

"text": "{$shopname}",

"size": 2,

"bold": true,

"format": 1,

"line": 2,

"underline": true,

"type": 0

},

{

"text": "{$barCode}",

"format": 1,

"line": 2,

"type": 1

},

{

"path": "{$logo}",

"format": 1,

"line": 2,

"type": 3

},

{

"text": "{$qrCode}",

"format": 1,

"line": 2,

"type": 2

}

],

"goods": [

{

"name": "商品名",

"width": 24,

"format": 0,

"variable": "name"

},

{

"name": "数量",

"width": 8,

"format": 1,

"variable": "num"

},

{

"name": "单价",

"width": 8,

"format": 1,

"variable": "price"

},

{

"name": "金额",

"width": 8,

"format": 2,

"variable": "pay"

}

],

"bill": [

{

"text": "实收现金",

"size": 3,

"bold": true,

"format": 1,

"line": 2,

"underline": false,

"type": 0

},

{

"text": "{$cash}",

"size": 3,

"bold": true,

"format": 1,

"line": 2,

"underline": false,

"type": 0

}

],

"footer": [

{

"text": "详情请访问官网",

"size": 2,

"bold": true,

"format": 1,

"line": 2,

"underline": true,

"type": 0

},

{

"text": "http://www.sublulu.com",

"format": 1,

"line": 2,

"type": 2

}

]

}

模板的代码结构如上所示,可见每个部分均是Json数组

header、bill、footer三部分的结构一模一样,只是位置和内容有所差异

goods区域的数组里面每个元素都对应四个相同的属性

类似{$logo}是模板中指定的占位符,能够更好的支持个性化

模板参数规则

e2d475cdb4c676f9d8332c6e8308cf19.png

goods参数详解

/**

* 列名

*/

private String name;

/**

* 排版格式

*/

private int format;

/**

* 列宽

* 58mm 每行32个半角字符

* 80mm 每行48个半角字符

*/

private int width;

/**

* 占位符

* e.g {$time}

*/

private String variable;

• 打印参数

打印根据模板和打印参数合成按照顺序进行打印

打印参数替换模板中的占位符

打印参数解析商品信息进行输出

参数示例

{

"keys": {

"shopname": "黄太吉",

"barCode": "6921734976505",

"qrCode": "http://www.sublulu.com",

"time": "15:35",

"num": 14,

"cash": 324.5,

"logo": "/sdcard/qr.png",

"adv": "关注微信,有大大地活动哦"

},

"goods": [

{

"name": "鱼香肉丝",

"num": 1,

"price": 12.8,

"pay": 12.8

},

{

"name": "葱油粑粑",

"num": 1,

"price": 4.8,

"pay": 4.8

},

{

"name": "辣椒炒肉",

"num": 1,

"price": 14.8,

"pay": 14.8

}

]

}

打印参数的代码结构如上所示,主要分为keys和goods两个部分:

keys中的值负责替换模板中的占位符,如果模板中有,keys中没有则将占位符原样输出

goods中的参数对用模板中的goods的每个属性

打印效果

69d1a9d0479841b87b6e5357584d6f4a.png

• 使用示例

打印工具采用单例模式

考虑可能要操作多个打印机,所以以每个ip为key,单例本身为value值

获取EscPos实例

/**

* ip为打印机IP,需要配置

* 端口默认为9100,请勿随意修改

* 编码默认为“GBK”,传入打印机支持的编码

*/

EscPos.getInstance(String ip);

EscPos.getInstance(String ip, int port);

EscPos.getInstance(String ip, int port, String encoding);

EscConfig escConfig = new EscConfig(String ip);

EscConfig escConfig = new EscConfig(String ip, int ip);

EscConfig escConfig = new EscConfig(String ip, int ip, String encoding);

EscPos.getInstance(escConfig);

以上为几种获取EscPos实例的代码,EscConfig是对打印机的全局配置项,其详情如下:

// 1 58mm 2. 80mm 默认为2

private int type;

// 最后退纸几行 默认为4

private int line;

// 打印机ip

private String host;

// 打印机端口 默认为9100

private int port;

// 打印机的编码格式 默认为"GBK"

private String encoding;

打印示例

所有常用打印命令已经封装完毕,执行打印操作的代码十分简单,如下所示:

// 获取EscPos实例

EscPos.getInstance("192.168.1.110");

// 根据模板内容和打印参数执行打印命令

EscPos.print(template, param);

• 打印流程

EscPos工具类对外质保路了两种方法,且均为静态方法:

getInstance()及其重载,用于获取对象实例

print(String template, String param),用于打印小票

使用起来相当方便,但其流程略显复杂

打印主流程图

c5bbb1f553ee8e4e57b555fb74ccd58c.bmp

goods打印流程图

7fc42464f2b625f850c20e5ebbf40fbb.bmp

header、bill、footer打印主流程图

0ea854065f540c8a51fd801b0cc57292.bmp

• 网络参考资料

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_28822955/article/details/115041389

智能推荐

javascript功能插件大集合 前端常用插件 js常用插件_js中运行的插件是什么-程序员宅基地

文章浏览阅读3.1k次,点赞3次,收藏20次。包管理器管理着 JavaScript 库,并提供读取和打包它们的工具。npm:npm 是 JavaScript 的包管理器。官网Bower:一个 web 应用的包管理器。官网component:能构建更好 web 应用的客户端包管理器。官网spm:全新的静态包管理器。官网jam:一个专注于浏览器端和兼容 RequireJS 的包管理器。官网jspm:流畅的浏览器包管理器。官网E..._js中运行的插件是什么

ffmpeg日志文件中解析数值PSNR,码率的样例_h264 native -> h26 libx264-程序员宅基地

文章浏览阅读2.1k次。python解析ffmpeg执行日志,获取PSNR,平均码率的样例。[email protected] http://blog.csdn.net/zymill_h264 native -> h26 libx264

GitHub 上 6 款牛哄哄的后台模板-程序员宅基地

文章浏览阅读287次。今日推荐一个基于SpringBoot+Vue的百度网盘高仿项目一个Github项目搞定微信、QQ、支付宝等第三方登录推荐 7 个牛哄哄 Spring Cloud 实战项目一套既美观又方便的..._github 后台模板

【Linux】Rocky Linux 9.0 Podman服务无法正常启动_rocky linux x服务器未运行-程序员宅基地

文章浏览阅读3.4k次。从官方技术人员给的回复来看,是selinux导致了上面问题的出现,并且说这个问题可以通过更新container-selinux到2.179版本来解决。当/etc/selinux/config配置中,SELINUX=enforcing为默认配置的时候,启动Podman服务,会出现下面的报错。但是,时隔一个多月后,我再次测试,并将container-selinux升级到了2.189版本,此问题仍未能解决。发现此问题后,我第一时间上报问题到社区论坛。......_rocky linux x服务器未运行

15332 2008计算机标准,IEC 61000-2-2-程序员宅基地

文章浏览阅读216次。IEC 61000-3-2-2018 电磁兼容性(EMC).第3-2部分:极限值.谐波电流辐射的极限值(设备输入电流不大于16A/相)IEC/TR 61000-2-5-2017 电磁兼容性(EMC).第2-5部分:环境.电磁环境的描述和分类IEC/TR 61000-2-5-2017 电磁兼容性(EMC).第2-5部分:环境.电磁环境的描述和分类IEC 61000-1-2-2016 电磁兼容..._iec61000-2-5

太棒了!快来领养一位你的虚拟女友冰冰吧-程序员宅基地

文章浏览阅读936次,点赞8次,收藏6次。什么?都1202年了还有人没有女朋友?咳咳,各位帅气的小哥哥怎么可能没有女朋友呢,这就马上安排。呐,这就是今天我要带各位小伙伴“领养”的女友冰冰~啊,冰冰真好看。今天天气很热,但我的心还是冰冰的。想要一位这样的女朋友吗?想要和冰冰说上一些sao里sao气的悄悄话吗?想要冰冰回复你的来信并给你私发邮件附上她的美照吗?那么就和我一起来吧!目录什么?都1202年了还有人没有女朋友?一、爬取冰冰动图二、自动生成sao话三、冰冰回信ing四、冰冰向您发送..

随便推点

java某个类避免findbug检查,FindBugs —— Java 静态代码检查-程序员宅基地

文章浏览阅读447次。在使用 Jenkins 构建 Java Web 项目时候,有一项叫做静态代码检查,是用内置的 findBugs 插件,对程序源代码进行检查,以分析程序行为的技术,应用于程序的正确性检查、安全缺陷检测、程序优化等,特点就是不执行程序。它有助于在项目早期发现以下问题:变量声明了但未使用、变量类型不匹配、变量在使用前未定义、不可达代码、死循环、数组越界、内存泄漏等。分为以下几种类型:一、Bad Prac..._checkstyle 跳过对某个类检查

技术解读 | 知识图谱在智能审单场景中的实践及其构建技术-程序员宅基地

文章浏览阅读2k次,点赞2次,收藏3次。2020年7月3-4日,由CSDN主办的第三届AI开发者大会(AI ProCon 2020)以线上直播的形式与大家见面,大会历时两天,一次性设立6大主题,20场分论坛,吸引了10000+..._ai procon 2020

QSEE中如何修改tz 所占用的堆栈大小?_高通修改tz大小-程序员宅基地

文章浏览阅读1.9k次,点赞2次,收藏11次。一般来说,这修改方法由高通告知,下面以msm8953平台为例子进行说明。 一、修改tz堆栈大小的方法 需要修改的地方有三个,TA、kernel、lk.1.1 修改qsee trustzone_images TZ 的配置 oem_config.xmlvi core/securemsm/trustzone/qsee/mink/oem/config/msm8953/oem_c..._高通修改tz大小

linux上安装Openssl步骤详解-程序员宅基地

文章浏览阅读1.8w次,点赞8次,收藏54次。linux上安装Openssl步骤详解 1,查看原有系统是否已安装Opensslopenssl version -a系统已经安装了openssl,我们先安装新的版本,然后将环境配置成最新的版本。2,从openssl官网下载最新的稳定版本,https://www.openssl.org/source/ 当前的稳定版是 openssl-fips-2.0.16.t_openssl

内核启动卡在Waiting for root device /dev/mmcblk0p2...-程序员宅基地

文章浏览阅读1.8k次。Waiting for root device /dev/mmcblk0p2... _waiting for root device

Java学习笔记——内部类(成员类,局部类,匿名类)-程序员宅基地

文章浏览阅读721次,点赞26次,收藏17次。private 为了保证数据的安全性System.out.println(“芯片工作”);o.show();//内部类加入了private权限修饰符之后,就不能被访问了是错误的芯片在电脑的里面,我们不希望芯片这个内部类被外界访问,所以用private修饰这时我们只能在Computer类里面创建Chip类的对象,再由这个对象来调用成员变量或者成员方法。再像之前那样用外部类名.内部类名 对象名 = 外部类对象.内部类对象;的方法来创建内部类对象就不行了。

推荐文章

热门文章

相关标签