斑马打印机-RFID打印机 ZT411R最全攻略,从0上手 通过【JAVA生成ZPL指令+ts24.lib+ip:端口】的方式调用打印,无须安装驱动

前言:本文如标题所言,主要分享如何通过JAVA调用斑马的RFID进行打印

1.准备

        首先得准备好你的RFID打印机、本文实例用得是斑马ZT411 RFID版。根据打印机操作手册完成打印机得安装,其中包括标签和色带安装、以及打印机得配网(推荐配置固定IP)。

下载 斑马打印机连接工具,方便配置打印机,以及测试ZPL指令

        下载后根据打印机具体型号选择安装相应的驱动方便测试(说明:java中连接打印机是不需要安装驱动的)

下载 ZebraDesigner for Developers 3 条码标签编辑软件

**下载** ts24.lib斑马打印机点阵字体-Java文档类资源-CSDN下载,无需积分 将下载完的ts24.lib文件放在好记住的位置后文代码中会使用该文件的地址。 

下载 斑马打印机ZPL中文指令手册-Java文档类资源-CSDN下载 无需积分

2.开始打印

1.打印工具类

import com.szzl.cms.stock.domain.HcBind;
import com.szzl.common.utils.DateUtils;
import com.szzl.common.utils.StringUtils;
import com.szzl.system.service.ISysConfigService;
import com.zebra.sdk.comm.*;
import com.zebra.sdk.printer.PrinterStatus;
import com.zebra.sdk.printer.ZebraPrinter;
import com.zebra.sdk.printer.ZebraPrinterFactory;
import com.zebra.sdk.printer.ZebraPrinterLanguageUnknownException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

/**
 * <p>RFID打印机测试</p>
 *
 * @author : LIn
 * @date : 2022-06-17 11:14
 **/
@Service
public class ZplPrinter {

    @Autowired
    private ISysConfigService configService;

    private byte[] dotFont;


    /**
     * 标签模板
     */
    public static String printModel(HcBind hcBind) {
        ZplPrinter p = new ZplPrinter();
        StringBuilder begin = new StringBuilder();
        StringBuilder content = new StringBuilder();
        // 耗材名称
        PrintDataBackDTO name = p.getText("名称:" + hcBind.getName(), 54, 70);
        begin.append(name.getBegin());
        content.append(name.getContent());
        // 耗材规格
        PrintDataBackDTO spec = p.getText("规格:" +  hcBind.getSpec(), 54, 120);
        begin.append(spec.getBegin());
        content.append(spec.getContent());
        // 厂家
        PrintDataBackDTO manufacturer = p.getText("厂家:" +  hcBind.getManufacturer(), 54, 170);
        begin.append(manufacturer.getBegin());
        content.append(manufacturer.getContent());
        // 批次
        PrintDataBackDTO batchNo = p.getText("批次:" +  hcBind.getBatchNo(), 54, 220);
        begin.append(batchNo.getBegin());
        content.append(batchNo.getContent());
        // 效期
        PrintDataBackDTO effectDate = p.getText("效期:" + DateUtils.parseDateToStr("yyyy-MM-dd",hcBind.getEffectDate()), 54, 270);
        begin.append(effectDate.getBegin());
        content.append(effectDate.getContent());

        //返回EPC在这里设置 (),,到^FS前可填入参数名称 "^RS8 ^RFR,H,0,8,E^FN1^FS^HV1,,EPC:^FS"   ^RS8,,,1表示这里的1表示只读一个标签
        content.append("^RS8,,,1 ^RFR,H,0,8,E^FN1^FS^HV1,,^FS");

        // 条形码
        content.append("^BY2,3,104^FT791,297^BCN,,Y,N^FH\\^FD>;").append(hcBind.getUniqueCode()).append("^FS");
        ///二维码
        content.append("^FT1015,313^BQN,2,5^FH\\^FDLA,").append(hcBind.getUniqueCode()).append("^FS");

        ///EPC打印出来
        content.append("^FPH,6^FT54,320^AQN,28,9^FN2^FS^FN2^RFR,H,2,16,E^FS");

        //打印数量
        content.append("^PQ1,0,1,Y");
        return begin.toString() + content.toString() + "^XZ";
    }

    /**
     * 打印并获取Epc
     */
    public Map<String,Object> printGetEpc(HcBind hcBind) throws ConnectionException {
        String sendStr = printModel(hcBind);
        String printerIp = configService.selectConfigByKey("rfid.printer.ip");
        Connection connection =   ConnectionBuilder.build("TCP_MULTI:" + printerIp + ":9100:9200");
        Map<String,Object> map = new HashMap<String, Object>();
        try {
            connection.open();
            //获得tid指令
            //String date="^XA^RS8^RFR,H,0,12,E^FN1^FS^HV1,,TID:^FS^XZ";
            byte[] sendAndWaitForResponse = connection.sendAndWaitForResponse(sendStr.getBytes(),8000,8000,"" );
            StringBuilder epcBuilder = new StringBuilder();
            for (byte b : sendAndWaitForResponse) {
                char c = (char) b;
                String str = String.valueOf(c);
                epcBuilder.append(str);
            }
            String epc = epcBuilder.toString();
            //判断EPC是否为空 并且长度是否为24 这里根据实际标签信息决定
            if(StringUtils.isNotEmpty(epc) && epc.length() == 24){
                map.put("dealState", "success");
                map.put("epc", epc);
            }else{
                map.put("dealState", "error");
                map.put("dealMsg","获取标签RFID失败,请检查打印机打印机状态,并完成RFID校准");
            }
        } catch (ConnectionException e) {
            map.put("dealState", "error");
            map.put("dealMsg","打印出现异常,请联系管理员");
        } finally {
            connection.close();
        }
        return map;
    }

    /**
     * 根据ip获得打印机状态
     * @return
     * @throws ConnectionException
     */
    public Map<String,Object> getPrinterStatus() throws ConnectionException {
//        String printerIp = configService.selectConfigByKey("rfid.printer.ip");
        //打印机连接信息
        Connection connection = new TcpConnection("192.168.36.95", TcpConnection.DEFAULT_ZPL_TCP_PORT);
        //返回打印机状态用
        Map<String,Object> map = new HashMap<String, Object>();
        map.put("dealState", "success");
        try {
            //打开与打印机的链接
            connection.open();
            //获得打印机工厂
            ZebraPrinter zPrinter = ZebraPrinterFactory.getInstance(connection);
            // 获得打印机状态
            /**{"isHeadCold":false,  是否过冷
             "isHeadOpen":false, 是否打开
             "isHeadTooHot":false, 是否过热
             "isPaperOut":false, 是否缺纸
             "isPartialFormatInProgress":false, 是否正在进行格式化
             "isPaused":true, 暂停
             "isReadyToPrint":false, 准备好打印
             "isReceiveBufferFull":false, 接收缓冲区满了
             "isRibbonOut":false, 带出
             "labelLengthInDots":1956, 用点标注长度
             "labelsRemainingInBatch":0, 批号仍在分批
             "numberOfFormatsInReceiveBuffer":0,接收缓冲区的格式数
             "printMode":"TEAR_OFF"} 打印模式
             *
             * **/
            PrinterStatus currentStatus = zPrinter.getCurrentStatus();
            map.put("currentStatus", currentStatus);
            connection.close();
        } catch (ConnectionException | ZebraPrinterLanguageUnknownException e) {
            map.put("dealState", "error");
            map.put("dealMsg", e);
        } finally {
            //关闭打印机连接
            connection.close();
        }
        return map;
    }

    /**
     * 构造方法
     *
     */
    public ZplPrinter() {
        File file = new File("C://ts24.lib");//这里放自己的ts24.lib位置
        FileInputStream fis;
        try {
            fis = new FileInputStream(file);
            dotFont = new byte[fis.available()];
            fis.read(dotFont);
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 打印内容
     *
     * @param str 内容
     * @param x   x坐标
     * @param y   y坐标
     */
    private PrintDataBackDTO getText(String str, int x, int y) {
        PrintDataBackDTO result = new PrintDataBackDTO();
        StringBuilder begin = new StringBuilder();
        begin.append("^XA~SD25^PW1146^PR1,1");
        StringBuilder content = new StringBuilder();
        byte[] ch = str2bytes(str);
        for (int off = 0; off < ch.length; ) {
            if (((int) ch[off] & 0x00ff) >= 0xA0) {
                try {
                    //中文字符
                    int qcode = ch[off] & 0xff;
                    int wcode = ch[off + 1] & 0xff;
                    content.append(String.format("^FO%d,%d^XG0000%01X%01X,%d,%d^FS\n", x, y, qcode, wcode, 1, 1));
                    begin.append(String.format("~DG0000%02X%02X,00072,003,\n", qcode, wcode));
                    qcode = (qcode + 128 - 32) & 0x00ff;
                    wcode = (wcode + 128 - 32) & 0x00ff;
                    int offset = (qcode - 16) * 94 * 72 + (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.append(String.format("%02X%02X%02X\n", qcode, wcode, qcode1));
                    }
                    x = x + 24;
                    off = off + 2;
                } catch (Exception e) {
                    //替换成X号
                    content.append(getChar("X", x, y, 30, 20));
                    x = x + 15;
                    off = off + 2;
                }
            } else if (((int) ch[off] & 0x00FF) < 0xA0) {
                content.append(getChar(String.format("%c", ch[off]), x, y, 30, 20));
                x = x + 15;
                off++;
            }
        }

        result.setBegin(begin);
        result.setContent(content);
        return result;
    }

    /**
     * 英文字符串(包含数字)
     *
     * @param str 英文字符串
     * @param x   x坐标
     * @param y   y坐标
     * @param h   高度
     * @param w   宽度
     */
    private String getChar(String str, int x, int y, int h, int w) {
        return "^FO" + x + "," + y + "^A0," + h + "," + w + "^FD" + str + "^FS";
    }

    /**
     * 字符串转byte[]
     */
    private byte[] str2bytes(String s) {
        if (null == s || "".equals(s)) {
            return null;
        }
        byte[] abytes = null;
        try {
            abytes = s.getBytes("gb2312");
        } catch (UnsupportedEncodingException ex) {
            System.out.println("字符串转byte出错");
        }

        return abytes;
    }
}
//调用示例
Map<String, Object> printResult = zplPrinter.printGetEpc(hcBind);

2.打印对象根据需求自定义printModel方法

3.使用ZebraDesigner 3 for Developers生成.prn文件,用记事本打开,拷贝后 打开Zebra Setup Utilities

 打开后拷入ZPL指令

 点击 【发送到打印机】按钮 即可测试打印

4.调好的位置信息根据需求放入printModel方法中

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: ZPL指令TS24.lib点阵字体不显示中文的问题可能有以下几个可能原因: 第一,TS24.lib点阵字体库不支持中文字符集。TS24.lib点阵字体库是一种非中文字体库,它可能只包含了英文字符集或特定语言字符集,而没有包含中文字符集。因此,当我们使用TS24.lib字体来打印中文字符时,它无法识别和显示中文字符,导致不显示中文。 第二,打印机的编码格式不匹配。在使用ZPL指令打印中文字符时,需要保证打印机与电脑端的编码格式是一致的。如果打印机的编码格式与ZPL指令中使用的编码格式不匹配,中文字符的显示可能会出现问题。因此,需要检查打印机的编码设置,确保与ZPL指令中使用的编码格式一致。 第三,ZPL指令中的参数设置问题。在使用ZPL指令打印中文字符时,需要正确设置相关参数,如字符集选择、字体大小等。如果参数设置不正确,也可能导致中文字符不显示。因此,需要检查ZPL指令中的参数设置,确保正确选择了支持中文字符集的字体以及正确设置了字符大小等参数。 综上所述,TS24.lib点阵字体不显示中文的问题可能是因为字体库不支持中文字符集、打印机的编码格式不匹配或者ZPL指令中的参数设置问题。需要根据具体情况进行调查和排查,找到具体的原因并进行相应的调整,才能解决这个问题。 ### 回答2: ZPL指令ts24.lib是用于打印点阵字体的,但是默认情况下无法显示中文。因为点阵字体是基于ASCII字符集的,而中文字符超出了ASCII字符集的范围。要解决这个问题,可以采用以下两种方式: 1. 使用ZPL指令设置中文字符编码表:可以通过修改打印机的配置来导入中文字符编码表,这样打印机就可以识别和显示中文字符了。具体的设置方式可以参考打印机的用户手册或者与打印机厂商联系。 2. 使用Unicode编码进行打印ZPL指令还支持Unicode编码,Unicode包含了全球范围内的字符集,包括中文字符。可以将中文字符的Unicode编码传递给ZPL指令,让打印机根据编码来打印中文字符。例如,可以使用^CI指令设置Unicode编码表,然后使用^FD指令传递中文字符的Unicode编码。具体的使用方法可以参考ZPL指令的文档。 需要注意的是,以上方法可能需要一些技术的支持和配置,具体的操作可能因打印机型号和软件版本而有所差异。建议在遇到问题时,咨询打印机厂商或者专业的技术人员,以获取更准确的解决方案。 ### 回答3: zpl指令ts24.lib点阵字体不支持中文字符显示。该字体是基于Latin-1字符集设计的,只包含了拉丁字符和一些特殊符号,没有包含中文字符。因此,当我们使用zpl指令调用ts24.lib点阵字体来显示中文字符时,无法正确显示。 要在ZPL打印中显示中文字符,我们需要使用支持中文字符的字体库。可以选择使用字体库文件,如Unicode字体库,来支持本土化字符集。这些字体库不仅包含拉丁字符,还包括中文字符和其他语言字符。 一种常见的解决方法是在打印机安装和配置Unicode字体库。在使用ZPL指令时,我们可以选择适当的Unicode字体并将其设置为默认字体。然后,将中文字符转化成Unicode编码,并在ZPL指令中使用该编码来显示中文字符。 例如,可以使用"^CI28"指令将默认字体设置为Unicode字体库中的一个字体,并使用"^FD"指令加上Unicode编码来显示中文字符。 需要注意的是,在使用Unicode字体库时,打印机和操作系统的语言设置也需要正确配置。确保打印机和操作系统都以Unicode编码方式进行通信,以确保正确显示中文字符。 另一种方法是使用支持中文字符的ZPL模拟器或软件开发工具进行模拟和测试,以确保中文字符可以正确显示,并根据需要进行调整和优化。 综上所述,要在zpl指令ts24.lib点阵字体中显示中文字符,我们需要安装和配置支持中文字符的Unicode字体库,并使用适当的ZPL指令调用并显示中文字符。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值