基于Zpl实现斑马打印机打印条码
基于他人代码,为需要的朋友提供
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;
import sun.awt.AppContext;
/**
* 采用点阵字库ts24.lib
* @author Labrador
*
*/
public class ZplPrinter {
private String printerURI = null; //打印机完整路径
private PrintService printService = null; //打印机服务
private byte[] dotFont;
private String darkness = "~SD22"; //Set Darkness设置色带颜色的深度 0-30
private String width = "^PW1200"; //Print Width打印宽度0-1500
private String length = "^LL800"; //Label Length标签长度0-x(暂无作用)
private String begin = "^XA" + darkness + width; //标签格式以^XA开始
private String end = "^XZ"; //标签格式以^XZ结束
private String content = ""; //打印内容
private String message = ""; //打印的结果信息
/**
* 构造方法
* @param printerURI 打印机路径
*/
public ZplPrinter(String printerURI){
this.printerURI = printerURI;
//加载字体
File file = new File("E://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("C://ts24.lib文件不存在");
}
//初始化打印机
AppContext.getAppContext().put(PrintServiceLookup.class.getDeclaredClasses()[0], null);//刷新打印机列表
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) {//中文字符
try {
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;
} catch (Exception e) {
e.printStackTrace();
//替换成X号
setChar("X", x, y, eh, ew);
x = x + es;//注意间距更改为英文字符间距
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" + darkness + width;
end = "^XZ";
content = "";
}
/**
* 打印
* @param zpl 完整的ZPL
*/
public boolean print(String zpl){
if(printService==null){
message = "打印出错:没有找到打印机["+printerURI+"]";
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);
message = "已打印";
System.out.println("已打印");
return true;
} catch (PrintException e) {
message = "打印出错:"+e.getMessage();
System.out.println("打印出错:"+e.getMessage());
e.printStackTrace();
return false;
}
}
public String getMessage(){
return message;
}
/**
* 字符串转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;
}
}
测试类
public class ZplPrinterTest {
public static void main(String[] args) {
ZplPrinter p = new ZplPrinter("ZDesigner ZT410-300dpi ZPL");
// ZplPrinter p = new ZplPrinter("\\\\10.0.1.102\\ZDesigner ZT410-300dpi ZPL");
// ZplPrinter p = new ZplPrinter("\\\\10.10.13.224\\ZDesigner GT800 (ZPL)");
// printBarcode(p);
// p.resetZpl();//清除
// printPicking300DPI(p);
// p.resetZpl();//清除
// printPicking203DPI(p);
// p.resetZpl();//清除
printRestoking(p);
}
private static boolean printBarcode(ZplPrinter p){
//1.打印单个条码
String bar0 = "131ZA010101";//条码内容
// String bar0Zpl = "^FO110,110^BY6,3.0,280^BCN,,Y,N,N^FD${data}^FS";//条码样式模板
String bar0Zpl = "^FO100,50^AAN,100,110^BY6,3.0,280^BCN,,N,N,N^FD${data}^FS";//条码样式模板
p.setBarcode(bar0, bar0Zpl);
p.setChar(bar0,200,380,140,110);
p.setText("上", 880, 380, 60, 60, 30, 4, 4, 24);
String zpl = p.getZpl();
System.out.println(zpl);
boolean result = p.print(zpl);//打印
return result;
}
private static boolean printPicking300DPI(ZplPrinter p){
//左边的条码
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 = "123459999900188ABCDE";//20位
String bar2Paper = "^FO380,600^BY3,3.0,100^BCN,,Y,N,N^FD${data}^FS";//条码样式模板
p.setBarcode(bar2,bar2Paper);
p.setText("国药控股湖南有限公司", 380, 40, 60, 60, 30, 2, 2, 24);
p.setChar("CSS0BPKPPR", 380, 100, 60, 60);
p.setText("09件",940, 80, 60, 60, 30, 2, 2, 24);
p.setText("补", 1100, 80, 60, 60, 30, 2, 2, 24);
p.setText("公司自配送 公路", 380, 180, 80, 80, 30, 3, 3, 24);
p.setChar("03231151",940, 187, 40, 40);
p.setChar("2015-10-10",940, 227, 30, 30);
p.setText("湖南六谷大药房连锁有限公司", 380, 260, 60, 60, 30, 2, 2, 24);
p.setText(":长沙市:开福区:捞刀河镇中岭村258号:", 380, 320, 60, 60, 30, 2, 2, 22);
p.setText("多SKU", 800, 485, 60, 60, 30, 2, 2, 24);
p.setText("库位:49", 380, 420, 56, 56, 30, 2, 2, 24);
p.setText("品类:感冒胶囊", 380, 485, 56, 56, 30, 2, 2, 24);
p.setText("批号:", 380, 550, 56, 56, 30, 2, 2, 24);
p.setChar("78787878788", 500, 560, 40, 40);
String zpl = p.getZpl();
System.out.println(zpl);
boolean result = p.print(zpl);
return result;
}
private static boolean printPicking203DPI(ZplPrinter p){
//左边的条码
String bar1 = "07";
p.setChar(bar1, 126, 86, 40, 40);
String bar1Zpl = "^FO66,133^BY5,3.0,160^BCR,,N,N,N^FD${data}^FS";//条码样式模板
p.setBarcode(bar1,bar1Zpl);
//下边的条码
String bar2 = "00000999990018822969";//20位
String bar2Paper = "^FO253,400^BY2,3.0,66^BCN,,Y,N,N^FD${data}^FS";//条码样式模板
p.setBarcode(bar2,bar2Paper);
p.setText("国药控股湖南有限公司", 253, 26, 40, 40, 20, 1, 1, 24);
p.setChar("CSS0BPKPPR", 253, 66, 20, 20);
p.setText("09件",626, 53, 40, 40, 20, 1, 1, 24);
p.setText("补", 733, 53, 40, 40, 20, 1, 1, 24);
p.setText("公司自配送 公路", 253, 120, 53, 53, 20, 1, 1, 24);
p.setChar("03231151",626, 124, 26, 26);
p.setChar("2015-10-10",626, 151, 20, 20);
p.setText("湖南六谷大药房连锁有限公司", 253, 173, 40, 40, 20, 1, 1, 24);
p.setText("长沙市开福区捞刀河镇中岭村258号", 253, 213, 30, 30, 20, 1, 1, 22);
p.setText("多SKU", 533, 323, 40, 40, 20, 1, 1, 24);
p.setText("库位:49", 253, 280, 37, 37, 20, 1, 1, 24);
p.setText("品类:感冒胶囊", 253, 323, 37, 37, 20, 1, 1, 24);
p.setText("批号:", 253, 366, 37, 37, 20, 1, 1, 24);
p.setChar("78787878788", 333, 373, 26, 26);
String zpl = p.getZpl();
System.out.println(zpl);
boolean result = p.print(zpl);
return result;
}
private static boolean printRestoking(ZplPrinter p){
//上方的条码
String bar1 = "1434455567773344abcd";
String bar1Zpl = "^FO85,70^BY4,3.0,140^BCN,,Y,N,N^FD${data}^FS";//条码样式模板
p.setBarcode(bar1,bar1Zpl);
//源货位
p.setText("来源:131ZA010101", 100, 320, 60, 60, 30, 2, 2, 24);
//目标货位
p.setText("目的:131ZA010102",640, 320, 60, 60, 30, 2, 2, 24);
//货品编号
p.setText("货品编号:YF10001", 100, 440, 60, 60, 30, 2, 2, 24);
//件装数
p.setText("补货数量:200", 640, 440, 60, 60, 30, 2, 2, 24);
//品名
p.setText("复方一支黄花:", 100, 580, 60, 60, 30, 2, 2, 24);
String zpl = p.getZpl();
System.out.println(zpl);
boolean result = p.print(zpl);
return result;
}
}
基于Zpl实现斑马打印机打印条码相关推荐
- JavaSwimg jacob调用模板,斑马打印机打印条码
场景 任务重.时间赶,未使用ZPL语言调用打印机,也未使用斑马的SDK包 扫码枪扫描条码,打印机打印出扫描条码 思路说明 因为业务场景不需要使用web形式,所以使用java swimg 做的界面,ja ...
- BarTender 通过ZPL命令操作打印机打印条码, 操作RFID标签
解决方案 1. 由于开发准备的前期工作, 手里面是有很多的原厂API, 通过阅读大概阅读了这些pdf文档(尽管看不懂...) ,大概知道原理是通过ZPL命令去调用DLL发送至打印机执行. 所以,顺藤摸 ...
- C#发送ZPL控制斑马Zebra打印机源码
1.最近想把斑马打印机集成到自己的C#程序里,找了好多资料,最后采用通过发送ZPL语言给打印机来完成打印这种方式,该程序可以创建.保存.调用ZPL模板,可以修改打印条码的参数并保存到模板里. 2.下面 ...
- C#调用斑马打印机打印条码标签(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)
在批量打印商品标签时一般都要加上条码或图片,而这类应用大多是使用斑马打印机,所以我也遇到了怎么打印的问题. 一种办法是用标签设计软件做好模板,在标签设计软件中打印,这种办法不用写代码,但对我来说觉得不 ...
- C#调用斑马打印机打印条码标签(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)...
在批量打印商品标签时一般都要加上条码或图片,而这类应用大多是使用斑马打印机,所以我也遇到了怎么打印的问题. 一种办法是用标签设计软件做好模板,在标签设计软件中打印,这种办法不用写代码,但对我来说觉得不 ...
- C#调用斑马打印机打印条码标签(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)【转】...
原文地址:http://blog.csdn.net/ldljlq/article/details/7338772 在批量打印商品标签时一般都要加上条码或图片,而这类应用大多是使用斑马打印机,所以我也遇 ...
- C#调用斑马打印机打印条码标签(含源码)(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)
在批量打印商品标签时一般都要加上条码或图片,而这类应用大多是使用斑马打印机,所以我也遇到了怎么打印的问题. 一种办法是用标签设计软件做好模板,在标签设计软件中打印,这种办法不用写代码,但对我来说觉得不 ...
- 记一次图片转换ZPL格式(ZPL格式是用于斑马打印机)
由于公司一个地方需要用到图片转换ZPL格式去打印;这里的ZPL格式是打印斑马打印机,这里面有一些小的地方是需要注意的. 由于斑马打印机的型号不一样,设置不一样,外加自身的图片格式(.jpg,.png的 ...
- 发送ZPL指令到斑马打印机,并监控打印成功或者失败的状态信息
Visual C# 入门 本文共分为两个部分: 第一部分:介绍如何与Zebar进行连接,把ZPL指令或者模板文件发送到斑马打印机进行打印. 第二部分:介绍如何接收Zebar进行打印之后如何得到斑马打印 ...
- 基于C#在WPF中使用斑马打印机进行打印
最近在项目中接手了一个比较有挑战性的模块--用斑马打印机将需要打印的内容打印出来.苦苦折腾了两天,总算有所收获,就发到网上来骗骗分数-_-|| 项目中使用的打印机型号为GX430t的打印机,接手的时候 ...
最新文章
- 双 11 的狂欢,干了这碗「流量防控」汤
- 控制文件的多路复用技术
- 设计模式 — 创建型模式 — 建造者模式
- objective-c 中字符串与日期相互转换
- ssm前端时间格式转换
- Win32 远程线程
- pythonunicode和str_python2 中 unicode 和 str 之间的转换及与python3 str 的区别
- mysql死锁 简单例子_写一个Mysql死锁的例子
- windows中mysql5.7中配置中文字符集和默认datadir
- 又挖到宝藏了,低调使用
- Pr 音频效果参考:混响
- 小程序的大于小于等于的写法
- 关于__construct()和__destruct
- Python(十一) 原生爬虫
- 零成本学arduino教程——74hc165扩展寄存器教程
- 1.1关于机器学习和深度学习
- 画论63 俞蛟《读画闲评》
- 欢迎观看Toni_hou的#生活#2
- 101条伟大的计算机编程名言
- 《springboot实战》学习笔记
热门文章
- Java游戏实验报告_Java实验报告(实验三)
- 5g手机可以用4g的手机卡吗
- html5校园生活,校园日常生活日记(精选12篇)
- 汇编语言之DOSBox
- A/B Test(AB测试) 流程、常见面试问题及解答
- [渝粤教育] 南宁学院 Python程序设计 参考 资料
- 国外AI知名论坛资源网站
- Raspberry Pi with Node.js and Arduino
- 海报生成的Java方法
- win10计算机磁盘图标,Win10系统硬盘图标怎么更换?Win10系统自定义硬盘图标的方法...