该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

驱动打印小票--80热敏打印机

项目环境基于JFinal2.2 偷了个懒直接在JFinal_demo上做的


在大神 SubLuLu/thermal_printer 开源的项目基础上写了这个demo,SubLuLu用的是指令打印,而且环境是基于Android的,所以我用Java做的项目无法很方便的打印图片和兼容更多的热敏打印机,因此借鉴大神的构思我采用驱动方式进行打印。

打印流程


输入图片说明

如图中所示,在项目实际使用中采用异步的方式进行打印。调用者只需要创建新的PrintJob 添加到任务队列中,挂起的线程就会被自动唤起完成打印任务

打印模板


模板采用Json格式存储,分为header、goods、warn、msg四个部分,对模板的解析采用阿里出品的fastjson,模板共5中,模板名称分别对应PrintJob中missionType

####模板示例-(simple.json)

{
	"header": [{
		"text": "{$title}",
		"size": 14,
		"bold": true,
		"align": 1,
		"line": true,
		"type": 0
	},
	{
		"text": "品    牌:{$brandName}",
		"size": 9,
		"bold": false,
		"align": 0,
		"line": false,
		"type": 0
	},
	{
		"text": "({$shopName})",
		"size": 9,
		"bold": false,
		"align": 0,
		"line": true,
		"type": 0
	},
	{
		"text": "桌    号:{$tableNumb}",
		"size": 9,
		"bold": false,
		"align": 0,
		"line": false,
		"type": 0
	},
	{
		"text": "({$tableName})",
		"size": 9,
		"bold": false,
		"align": 0,
		"line": true,
		"type": 0
	},
	{
		"text": "--------------------------------",
		"size": 9,
		"bold": false,
		"align": 0,
		"line": true,
		"type": 0
	}],
	"goods": [{
		"name": "编码",
		"width": 8,
		"variable": "code"
	},
	{
		"name": "名称",
		"width": 12,
		"variable": "name"
	},
	{
		"name": "数量",
		"width": 6,
		"variable": "quantity"
	},
	{
		"name": "  金额",
		"width": 8,
		"variable": "price"
	}],
	"warn": [{
		"text": "-------------{$warnTitle}--------------",
		"size": 9,
		"bold": false,
		"align": 0,
		"line": true,
		"type": 0
	},
	{
		"text": "  ",
		"size": 9,
		"bold": false,
		"align": 0,
		"line": true,
		"type": 0
	},
	{
		"text": "{$warnMsg}",
		"size": 11,
		"bold": true,
		"align": 0,
		"line": true,
		"type": 0
	}],
	"msg": [{
		"text": "----------{$posTitle}-----------",
		"size": 9,
		"bold": false,
		"align": 0,
		"line": true,
		"type": 0
	},
	{
		"text": "{$posMsg}",
		"size": 9,
		"bold": false,
		"align": 0,
		"line": true,
		"type": 0
	}]
}

模板中{$title}等表示指定的占位符,将来在打印参数中会被替换

打印规则


模板打印规则

打印参数

  • 打印根据模板和打印参数合成按照顺序进行打印
  • 打印参数替换模板中的占位符
  • 打印参数解析商品信息进行输出

参数示例

{
	"keys": {
		"dateTime": "2016-09-10 12:21:00",
		"posTitle": "收银软件下单结果",
		"brandName": "智慧餐厅",
		"orderId": "1609101220001",
		"shopName": "天山店",
		"title": "网络订单",
		"tableName": "外卖1",
		"barCode": "7255",
		"allPrice": "66.88",
		"tableNumb": "0002",
		"warnTitle": "异常提示",
		"posMsg": "点菜成功!1001 无此菜 本次点菜3/3份。其中2成功,1失败。合计XXXX元祝您用餐愉快!欢迎下次光临",
		"warnMsg": "部分菜品未下成功请联系服务员人工处理"
	},
	"goods": [{
		"code": "01001",
		"quantity": "1.0",
		"price": "18.0",
		"name": "牛肉"
	},
	{
		"code": "01002",
		"quantity": "1.0",
		"price": "10.0",
		"name": "酸辣土豆"
	},
	{
		"code": "01003",
		"quantity": "1.0",
		"price": "6.0",
		"name": "拍黄瓜"
	}]
}

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

  • keys中的值负责替换模板中的占位符,如果模板中有,keys中没有则将占位符原样输出
  • goods中的参数对用模板中的goods的每个属性

封装的PrintJob


    /**
	 * 任务类型:0=普通订单 1=预定单 2=支付订单 3=警告单 4=test单
	 */
	private int missionType;
	
	/**
	 * 需要打印的参数--可扩展
	 */
	private Map<String, Object> param;
	
	/**
	 * 打印机逻辑名称
	 */
	private String printerName;

根据不同的missionType自动选用对应的模板,替换参数后打印

效果图(多模板)

输入图片说明 输入图片说明 输入图片说明 输入图片说明 输入图片说明 输入图片说明

空文件

简介

热敏打印机驱动打印小票 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化