Java 集成斑马打印机方案,有直接手搓 ZPL 命令的,也有使用 SDK 的,官方提供的有一个 zebra-linkos-mpsdk,里面有一些 demo 等,博主粗略使用一种方案是要先用 Java 画图,然后将图片给到打印机打印出来,博主还找到一些第三方的 SDK,能快速的制作出 ZPL 命令,虽然命令不全,但是有了大纲,自己补全一些其余命令也是简单的多了,能对用ZPL命令的方式提高效率
手搓ZPL命令参考网站
- https://labelary.com/docs.html
Link-OS 多平台 SDK
demo
博主是直接在 SDK 提供的 Demo 中测试的,使用的网络发现打印机方式,案例如下,打印的图片就是 Demo 中的 斑马的 logo
import com.zebra.sdk.comm.Connection;
import com.zebra.sdk.comm.ConnectionException;
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 com.zebra.sdk.printer.discovery.DiscoveredPrinter;
import com.zebra.sdk.printer.discovery.DiscoveryException;
import com.zebra.sdk.printer.discovery.DiscoveryHandler;
import com.zebra.sdk.printer.discovery.NetworkDiscoverer;
import java.io.IOException;
public class PDemo2 {
private static ZebraPrinter zebraPrinter = null;
public static void main(String[] args) {
extracted();
}
private static void extracted() {
try {
// 发现斑马打印机
NetworkDiscoverer.findPrinters(new DiscoveryHandler() {
@Override
public void foundPrinter(DiscoveredPrinter printer) {
// 连接打印机
// 连接到打印机
Connection connection = printer.getConnection();
try {
connection.open();
zebraPrinter = ZebraPrinterFactory.getInstance(connection);
ZebraPrinter instance = ZebraPrinterFactory.getInstance(connection);
System.out.println(instance);
PrinterStatus printerStatus = zebraPrinter.getCurrentStatus();
//判断打印机目前是否能进行正常打印,如果不正常,循环睡眠至可打印为止
System.out.println("是否打印就绪:" + printerStatus.isReadyToPrint);
System.out.println("打印机缓存区是否已满:" + printerStatus.isReceiveBufferFull);
System.out.println("当前缓存区数量:" + printerStatus.numberOfFormatsInReceiveBuffer);
System.out.println("是否暂停:" + printerStatus.isPaused);
// 创建打印任务
// 在打印任务中添加打印内容
zebraPrinter.printImage("E:\\home\\tools\\zebra-linkos-mpsdk-jun-2024\\PC-Card\\v2.14.5198\\demos\\eclipse\\Zebra_Card_SDK_Demos\\resources\\zebra-logo-50px.png",
0,
0,
600,
600,
false);
// instance.printImage();
} catch (ConnectionException | ZebraPrinterLanguageUnknownException | IOException e) {
throw new RuntimeException(e);
}
System.out.println(zebraPrinter);
}
@Override
public void discoveryFinished() {
// 所有打印机都已发现,可以进行下一步操作了
}
@Override
public void discoveryError(String message) {
// 发现打印机时发生错误
}
});
} catch (DiscoveryException e) {
// 进行错误处理
}
}
}
生成 ZPL 命令的工具
这是个 GitHub 上的大佬开源的项目,可以生成一些简单的 ZPL 指令,提供了扩展的方式,可以用以快速生成 ZPL 指令
<dependency>
<groupId>fr.w3blog</groupId>
<artifactId>zebra-zpl</artifactId>
<version>0.0.1</version>
<scope>compile</scope>
</dependency>
该 SDK 中生成的字体不能打印中文,如下字体可以打印中文,前提是打印机安装了该字体
^CW1,E:SIMSUN.TTF^CI28
ZebraLabel zebraLabel = new ZebraLabel(912, 912);
zebraLabel.setDefaultZebraFont(ZebraFont.ZEBRA_ZERO);
zebraLabel.addElement(new ZebraText(10, 84, "Product:", 14));
zebraLabel.addElement(new ZebraText(395, 85, "Camera", 14));
zebraLabel.addElement(new ZebraText(10, 161, "CA201212AA", 14));
//Add Code Bar 39
zebraLabel.addElement(new ZebraBarCode39(10, 297, "CA201212AA", 118, 2, 2));
zebraLabel.addElement(new ZebraText(10, 365, "Qté:", 11));
zebraLabel.addElement(new ZebraText(180, 365, "3", 11));
zebraLabel.addElement(new ZebraText(317, 365, "QA", 11));
zebraLabel.addElement(new ZebraText(10, 520, "Ref log:", 11));
zebraLabel.addElement(new ZebraText(180, 520, "0035", 11));
zebraLabel.addElement(new ZebraText(10, 596, "Ref client:", 11));
zebraLabel.addElement(new ZebraText(180, 599, "1234", 11));
zebraLabel.getZplCode();
ZebraUtils.printZpl(zebraLabel, ip, port);