技术标签: 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}是模板中指定的占位符,能够更好的支持个性化
模板参数规则
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的每个属性
打印效果
• 使用示例
打印工具采用单例模式
考虑可能要操作多个打印机,所以以每个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),用于打印小票
使用起来相当方便,但其流程略显复杂
打印主流程图
goods打印流程图
header、bill、footer打印主流程图
• 网络参考资料
文章浏览阅读3.1k次,点赞3次,收藏20次。包管理器管理着 JavaScript 库,并提供读取和打包它们的工具。npm:npm 是 JavaScript 的包管理器。官网Bower:一个 web 应用的包管理器。官网component:能构建更好 web 应用的客户端包管理器。官网spm:全新的静态包管理器。官网jam:一个专注于浏览器端和兼容 RequireJS 的包管理器。官网jspm:流畅的浏览器包管理器。官网E..._js中运行的插件是什么
文章浏览阅读2.1k次。python解析ffmpeg执行日志,获取PSNR,平均码率的样例。[email protected] http://blog.csdn.net/zymill_h264 native -> h26 libx264
文章浏览阅读287次。今日推荐一个基于SpringBoot+Vue的百度网盘高仿项目一个Github项目搞定微信、QQ、支付宝等第三方登录推荐 7 个牛哄哄 Spring Cloud 实战项目一套既美观又方便的..._github 后台模板
文章浏览阅读3.4k次。从官方技术人员给的回复来看,是selinux导致了上面问题的出现,并且说这个问题可以通过更新container-selinux到2.179版本来解决。当/etc/selinux/config配置中,SELINUX=enforcing为默认配置的时候,启动Podman服务,会出现下面的报错。但是,时隔一个多月后,我再次测试,并将container-selinux升级到了2.189版本,此问题仍未能解决。发现此问题后,我第一时间上报问题到社区论坛。......_rocky linux x服务器未运行
文章浏览阅读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四、冰冰向您发送..
文章浏览阅读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
文章浏览阅读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大小
文章浏览阅读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
文章浏览阅读1.8k次。Waiting for root device /dev/mmcblk0p2... _waiting for root device
文章浏览阅读721次,点赞26次,收藏17次。private 为了保证数据的安全性System.out.println(“芯片工作”);o.show();//内部类加入了private权限修饰符之后,就不能被访问了是错误的芯片在电脑的里面,我们不希望芯片这个内部类被外界访问,所以用private修饰这时我们只能在Computer类里面创建Chip类的对象,再由这个对象来调用成员变量或者成员方法。再像之前那样用外部类名.内部类名 对象名 = 外部类对象.内部类对象;的方法来创建内部类对象就不行了。