Parcourir la source

斑马打印测试

zhuhao il y a 2 ans
Parent
commit
6c7a41f2d7

+ 225 - 0
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/util/ZplPrinter.java

@@ -0,0 +1,225 @@
+package com.github.zuihou.business.util;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+
+import javax.print.Doc;
+import javax.print.DocFlavor;
+import javax.print.DocPrintJob;
+import javax.print.PrintException;
+import javax.print.PrintService;
+import javax.print.PrintServiceLookup;
+import javax.print.SimpleDoc;
+import javax.print.attribute.standard.PrinterName;
+
+public class ZplPrinter {
+    private String printerURI = null;//打印机完整路径
+    private PrintService printService = null;//打印机服务
+    private byte[] dotFont;
+    private String begin = "^XA";   //标签格式以^XA开始
+    private String end = "^XZ";     //标签格式以^XZ结束
+    private String content = "";
+
+    public static void main(String[] args) {
+        ZplPrinter p = new ZplPrinter("\\\\192.168.0.12\\ZDesigner 105SLPlus-300dpi ZPL");
+        //1.打印单个条码
+        String bar0 = "1234567890";//条码内容
+        String bar0Zpl = "^FO110,110^BY6,3.0,280^BCN,,Y,N,N^FD${data}^FS";//条码样式模板
+        p.setBarcode(bar0, bar0Zpl);
+        String zpl = p.getZpl();
+        System.out.println(zpl);
+        boolean result1 = p.print(zpl);//打印
+
+        p.resetZpl();//注意要清除上次的打印信息
+        //2.打印中、英、数字、条码混合
+        //左边的条码
+        String bar1 = "07";
+        p.setChar(bar1, 190, 130, 60, 60);
+        String bar1Zpl = "^FO100,200^BY8,3.0,240^BCR,,N,N,N^FD${data}^FS";//条码样式模板
+        p.setBarcode(bar1,bar1Zpl);
+        //下边的条码
+        String bar2 = "00000999990018822969";//20位
+        String bar2Paper = "^FO380,600^BY3,3.0,100^BCN,,Y,N,N^FD${data}^FS";//条码样式模板
+        p.setBarcode(bar2,bar2Paper);
+
+        p.setText("云箭集团", 380, 260, 60, 60, 30, 2, 2, 24);
+
+        p.setText("品类:前格框", 380, 485, 56, 56, 30, 2, 2, 24);
+        p.setChar("78787878788", 500, 560, 40, 40);
+
+        String zpl2 = p.getZpl();
+        //System.out.println(zpl2);
+        boolean result2 = p.print(zpl2);
+    }
+
+    /**
+     * 构造方法
+     * @param printerURI 打印机路径
+     */
+    public ZplPrinter(String printerURI){
+        this.printerURI = printerURI;
+        //加载字体
+        String relativelyPath=System.getProperty("user.dir");
+        File file = new File(relativelyPath + "//ts24.lib");
+        if(file.exists()){
+            FileInputStream fis;
+            try {
+                fis = new FileInputStream(file);
+                dotFont = new byte[fis.available()];
+                fis.read(dotFont);
+                fis.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }else{
+            System.out.println("ts24.lib文件不存在");
+        }
+        //初始化打印机
+        PrintService[] services = PrintServiceLookup.lookupPrintServices(null,null);
+        if (services != null && services.length > 0) {
+            for (PrintService service : services) {
+                if (printerURI.equals(service.getName())) {
+                    printService = service;
+                    break;
+                }
+            }
+        }
+        if (printService == null) {
+            System.out.println("没有找到打印机:["+printerURI+"]");
+            //循环出所有的打印机
+            if (services != null && services.length > 0) {
+                System.out.println("可用的打印机列表:");
+                for (PrintService service : services) {
+                    System.out.println("["+service.getName()+"]");
+                }
+            }
+        }else{
+            System.out.println("找到打印机:["+printerURI+"]");
+            System.out.println("打印机名称:["+printService.getAttribute(PrinterName.class).getValue()+"]");
+        }
+    }
+    /**
+     * 设置条形码
+     * @param barcode 条码字符
+     * @param zpl 条码样式模板
+     */
+    public void setBarcode(String barcode,String zpl) {
+        content += zpl.replace("${data}", barcode);
+    }
+
+    /**
+     * 中文字符、英文字符(包含数字)混合
+     * @param str 中文、英文
+     * @param x x坐标
+     * @param y y坐标
+     * @param eh 英文字体高度height
+     * @param ew 英文字体宽度width
+     * @param es 英文字体间距spacing
+     * @param mx 中文x轴字体图形放大倍率。范围1-10,默认1
+     * @param my 中文y轴字体图形放大倍率。范围1-10,默认1
+     * @param ms 中文字体间距。24是个比较合适的值。
+     */
+    public void setText(String str, int x, int y, int eh, int ew, int es, int mx, int my, int ms) {
+        byte[] ch = str2bytes(str);
+        for (int off = 0; off < ch.length;) {
+            if (((int) ch[off] & 0x00ff) >= 0xA0) {
+                int qcode = ch[off] & 0xff;
+                int wcode = ch[off + 1] & 0xff;
+                content += String.format("^FO%d,%d^XG0000%01X%01X,%d,%d^FS\n", x, y, qcode, wcode, mx, my);
+                begin += String.format("~DG0000%02X%02X,00072,003,\n", qcode, wcode);
+                qcode = (qcode + 128 - 32) & 0x00ff;
+                wcode = (wcode + 128 - 32) & 0x00ff;
+                int offset = ((int) qcode - 16) * 94 * 72 + ((int) wcode - 1) * 72;
+                for (int j = 0; j < 72; j += 3) {
+                    qcode = (int) dotFont[j + offset] & 0x00ff;
+                    wcode = (int) dotFont[j + offset + 1] & 0x00ff;
+                    int qcode1 = (int) dotFont[j + offset + 2] & 0x00ff;
+                    begin += String.format("%02X%02X%02X\n", qcode, wcode, qcode1);
+                }
+                x = x + ms * mx;
+                off = off + 2;
+            } else if (((int) ch[off] & 0x00FF) < 0xA0) {
+                setChar(String.format("%c", ch[off]), x, y, eh, ew);
+                x = x + es;
+                off++;
+            }
+        }
+    }
+    /**
+     * 英文字符串(包含数字)
+     * @param str 英文字符串
+     * @param x x坐标
+     * @param y y坐标
+     * @param h 高度
+     * @param w 宽度
+     */
+    public void setChar(String str, int x, int y, int h, int w) {
+        content += "^FO" + x + "," + y + "^A0," + h + "," + w + "^FD" + str + "^FS";
+    }
+    /**
+     * 英文字符(包含数字)顺时针旋转90度
+     * @param str 英文字符串
+     * @param x x坐标
+     * @param y y坐标
+     * @param h 高度
+     * @param w 宽度
+     */
+    public void setCharR(String str, int x, int y, int h, int w) {
+        content += "^FO" + x + "," + y + "^A0R," + h + "," + w + "^FD" + str + "^FS";
+    }
+    /**
+     * 获取完整的ZPL
+     * @return
+     */
+    public String getZpl() {
+        return begin + content + end;
+    }
+    /**
+     * 重置ZPL指令,当需要打印多张纸的时候需要调用。
+     */
+    public void resetZpl() {
+        begin = "^XA";
+        end = "^XZ";
+        content = "";
+    }
+    /**
+     * 打印
+     * @param zpl 完整的ZPL
+     */
+    public boolean print(String zpl){
+        if(printService==null){
+            System.out.println("打印出错:没有找到打印机:["+printerURI+"]");
+            return false;
+        }
+        DocPrintJob job = printService.createPrintJob();
+        byte[] by = zpl.getBytes();
+        DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
+        Doc doc = new SimpleDoc(by, flavor, null);
+        try {
+            job.print(doc, null);
+            System.out.println("已打印");
+            return true;
+        } catch (PrintException e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+    /**
+     * 字符串转byte[]
+     * @param s
+     * @return
+     */
+    private byte[] str2bytes(String s) {
+        if (null == s || "".equals(s)) {
+            return null;
+        }
+        byte[] abytes = null;
+        try {
+            abytes = s.getBytes("gb2312");
+        } catch (UnsupportedEncodingException ex) {
+            ex.printStackTrace();
+        }
+        return abytes;
+    }
+}

BIN
imcs-admin-boot/ts24.lib