Java實現POS打印機自定義無驅打印


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打印流程圖

goods流程圖

header、bill、footer打印主流程圖

區域流程圖

 

 

 

參考資料:https://github.com/SubLuLu/thermal_printer


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM