java 无驱动socket连接热敏小票打印机示例,编写自定义模板 芯烨/xprinter,附工具类即开即用

您所在的位置:网站首页 餐厅小票打印机怎么连接 java 无驱动socket连接热敏小票打印机示例,编写自定义模板 芯烨/xprinter,附工具类即开即用

java 无驱动socket连接热敏小票打印机示例,编写自定义模板 芯烨/xprinter,附工具类即开即用

2023-12-19 17:06| 来源: 网络整理| 查看: 265

前言

说下自己的趟坑之路

最近被这个打印机忙的焦头烂额

对于没有硬件任何经验的人来说,一开始是蒙的,热敏打印机根据模板打印出小票来?不都是配套的么, 还需要我们开发?

第一天 按部就班来, 安装驱动,然后搜索网上一大堆,大部分也是 java awt绘制图打印, 最后打印出来了也有二维码,也可以选择哪个打印机来打印,如代码:

import javax.print.PrintService; import javax.print.PrintServiceLookup; import javax.print.attribute.HashPrintRequestAttributeSet; import javax.print.attribute.PrintRequestAttributeSet; import javax.print.attribute.standard.Copies; import java.awt.*; import java.awt.print.*; public class Prient { public static void main(String[] args) { int height = 250; // 通俗理解就是书、文档 Book book = new Book(); // 打印格式 PageFormat pf = new PageFormat(); pf.setOrientation(PageFormat.PORTRAIT); // 通过Paper设置页面的空白边距和可打印区域。必须与实际打印纸张大小相符。 Paper p = new Paper(); p.setSize(height-20, height); p.setImageableArea(0, 0, height-20, height); pf.setPaper(p); // 把 PageFormat 和 Printable 添加到书中,组成一个页面 book.append((g, pageFormat, page) -> { if (page > 0) { return Printable.NO_SUCH_PAGE; } Graphics2D g2d = (Graphics2D) g; g2d.setFont(new Font("Default", Font.PLAIN, 14)); g2d.drawString("等位排单号", 50, 10); g2d.drawString("-------------------------------------", 7, 20); g2d.drawString("手机号码:" + "11111111111", 7, 35); g2d.drawString("领号日期:" + "11111", 7, 65); g2d.drawString("-------------------------------------", 7, 80); g2d.setFont(new Font("Default", Font.PLAIN, 25)); g2d.drawString("小号", 7, 105); g2d.setFont(new Font("Default", Font.PLAIN, 14)); g2d.drawString("您之前还有" + 5 + "桌客人在等待", 7, 130); g2d.drawImage(QrCodeUtils.creatRrCode("http://baidu.com",120,120),50,140,null); return Printable.PAGE_EXISTS; }, pf); // // 设置打印属性 PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); aset.add(new Copies(1));// 打印份数 // 查找所有打印服务 PrintService[] services = PrintServiceLookup.lookupPrintServices(null, aset); // 将所有查找出来的打印机与自己想要的打印机进行匹配,找出自己想要的打印机 PrintService myPrinter = null; for (int i = 0; i < services.length; i++) { // System.out.println("service found: " + services[i]); String svcName = services[i].toString(); if (svcName.contains("80C")) { // 指定打印机 //if (svcName.contains("AYZN_Print")) { // 指定打印机 //if (svcName.contains("ZMIN X1i")) { // 指定打印机 System.out.println("OK"); myPrinter = services[i]; } } // 获取打印服务对象 PrinterJob job = PrinterJob.getPrinterJob(); // 获取打印服务对象 if (myPrinter != null) { try { job.setPrintService(myPrinter); // 设置打印类 job.setPageable(book); // 打印 // System.out.println("--》打印数据"); job.print(); } catch (Exception pe) { pe.printStackTrace(); } } else { System.out.println("no printer services found"); } } }

但是仔细一想, 我如此这般,那么以后我的服务端是不是也得安装驱动, 于是下了linux驱动安装一个服务器,百般艰难,如果我以后如此部署,简直要我命呀

第二天 于是找另外一个路子,想到是不是可以不用驱动就可以打印呢, 我当时觉得有点异想天开,没想到一搜真可以, 我先去官网下载了一个c++的dll文件,动态库, 如代码

import com.sun.jna.Library; import com.sun.jna.Native; public class CallMain { //动态库类 public interface DllInterface extends Library { DllInterface INSTANCE = (DllInterface)Native.loadLibrary("E:\\JsPrinterDll_64.dll", DllInterface.class); int uniConnectNetPortByIp(String ip, int port, int timeout); int uniWrite(int i, String content, int size); int uniTwobarCodes(int fs, String content, int nZoomIn, int nErrorLevel, int bCut); int uniselectCharacterSize(int i, int n); Boolean uniClose(int i); Boolean uniInitNetSev(); Boolean uniCloseNetServ(); int uniselectChineseCharModel(int i); int uniprintAndFeedLine(int i); } public static void main(String[] args) { System.out.println("---------1.简单调用-----------"); DllInterface instance = DllInterface.INSTANCE; Boolean init = instance.uniInitNetSev(); int con = instance.uniConnectNetPortByIp("10.1.50.115",9100, 5000); if (con > 0) { int si = instance.uniselectCharacterSize(con,100010); int ch = instance.uniselectChineseCharModel(con); String a = "aaaa"; instance.uniWrite(con, a, a.length()); // instance.uniTwobarCodes(con, "https://www.baidu.com",7,1,0); instance.uniWrite(con, "\n\n\n\n\n\n\n\n", 8); boolean b= instance.uniClose(con); } boolean c =instance.uniCloseNetServ(); } }

然后调用类库中的函数,说说遇到的问题, 字体无法放大,不切纸,无法打印汉子,乱码等等,当然应该有解决方案,有些函数我应该没找到,慢慢的一个在解决,最后逐渐崩溃

第三天 不甘心如此这般,继续寻找度娘寻求帮助,还可以socket,拿来一试,妈呀,输出Writer,这不就是所期待的么, 要啥出啥,在去官网下载编程手册,对照写各种想要的,真是皇天不负有心人

正文

根据官方文档编写自定模板,授人以鱼不如授人以渔,后附工具类

去xprinter官网下载开发文档中的编程手册,打开如图

则对应代码:

public void setUnderline(int val) throws IOException { writer.write(0x1B);//16进制码 writer.write("-");//2D 也可 writer.write(val);//n的值,当然48/49/50 也可 writer.flush(); }

 其他的详细看文档写出你想要的模板来

不多说了, 剩下的自己研究吧~

附工具类,连接打印机, 并常用模板 打印小票工具类



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3