java调用zebra_java调用斑马GK888t打印机(ZPL指令)
在项目中使用斑马打印机遇到了如下问题:
在实际打印信息前,需要修改打印机驱动设置,主要是设置打印颜色深度,默认值一般会打印的比较浅。通常情况下,在设置的颜色深度后,打印机能够很好的工作。但是如果我将程序注册为windows系统服务,以自启动的方式运行程序后,对于打印机驱动的设置将不会生效。而直接使用控制台启动程序,却是正常的。经过分析之后,怀疑可能是由于,系统服务的启动方式和直接控制台启动的方式是有区别的,两种方式程序的登录用户是不同的,系统服务的登录用户是SYSTEM(非administration)用户,控制台启动方式就是普通的USER用户。而打印机的驱动设置,貌似每个用户之间是相互独立的,所以修改了USER用户的设置,SYSTEM用户的设置仍然是默认值,所以打印机驱动就不会生效。
这个问题的一个解决方案,就是使用ZPL指令,直接控制打印机。ZPL是打印机专用的一种编程语言,具体可以参考《ZPL语言中文手册》。通过使用ZPL指令,可以打印问题,条码,图片,也可以修改各种打印参数,包括修改打印浓度参数。所以通过ZPL的方式可以忽略系统打印机的驱动设置,也就能够随意修改颜色深度设置了。
但是如何调用ZPL呢?
一种方式可以通过cmd命令行的方式向打印机发送ZPL指令文件,具体可参考连接:http://www.chongshang.com.cn/news/view.asp?id=334。
另一种是通过JAVA调用打印机,在发送ZPL指令。这里我参考了github上的代码,详见:https://github.com/w3blogfr/zebra-zpl。从这个代码中就知道如何通过JAVA向打印机发送ZPL指令了。
github上的这个demo程序,用于打印一般的文字,条码是挺不错的,但是我的项目中需要打印一张位图图片,这个demo中并没有相关的示例。所以我查了下ZPL语言的手册,发现其中的~DG命令能够满足我的需求,经过研究之后,终于能够使用ZPL打印图片了。以下是打印部分的参考代码:
import java.awt.image.BufferedImage;
import java.awt.print.PrinterException;
import java.io.File;
import javax.imageio.ImageIO;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.SimpleDoc;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @detail GK888t斑马打印机ZPL指令打印
* 相比之前的打印方式,这种方式能够通过程序设置打印机参数
* 并且解决了使用服务启动时,不能调整打印机参数的问题
*
*/
public class PrinterZPL {
private Logger logger = LoggerFactory.getLogger(getClass());
/**
* @param parcelDetailBo
* @return 0成功,-1打印机不存在
* @throws PrinterException
*/
public JSONObject startPrint() {
try {
// 根据打印机名获取打印服务
PrintService service = PrinterUtil.getPrintService(printerName);
// 判断打印机是否找到
if (service == null) {
printJson.put("fullName", "未找到打印机,可能是驱动未安装");
return printJson;
} else {
printJson.put("fullName", service.toString());
}
// 判断打印机是否连接
if (Devcon.DeviceCheck(printerName).isEmpty()) {
printJson.put("connect", "打印机未连接,或电源未打开");
return printJson;
} else {
printJson.put("connect", "打印数据已发送至打印机");
}
// 颜色浓度值
String darkness = SystemProperties.readString("gk888t_darkness", "20");
// 从文件读取图像数据,并完成转换
ZPLVo zplVo = getImagePixel(imgPath);
// 组装ZPL打印指令,指令详情请参考ZPL的相关手册
String zplCode = "~DGR:SAMPLE.GRF," +
zplVo.getData().length + "," + // 图形中的总字节数
zplVo.getWidth() + ","// 每行的字节数
+ bytesToHexString(zplVo.getData())// 该数据字符串用于定义图像,也表示图像的 ASCII 十六进制。每个字符表示横向的 8 个点。
+ "~SD" + darkness + "^XA" + "^FO50,20^XGR:SAMPLE.GRF,2,2^FS"// FO后面的为起始坐标,^SF前的两个参数分别为横向、纵向扩展比例
+ "^XZ";// 指令结束
// 调用打印机,发送ZPL指令
Doc doc = new SimpleDoc(zplCode.getBytes(), DocFlavor.BYTE_ARRAY.AUTOSENSE, null);
service.createPrintJob().print(doc, null);
} catch (Exception e) {
logger.error("打印异常", e);
printJson.put("error", e.getMessage());
}
return printJson;
}
/**
* 根据坐标获取图像的颜色值
* @param bi
* @param x
* @param y
* @return
*/
public int getRgb(BufferedImage bi, int x, int y) {
try {
return bi.getRGB(x + 0, y) & 0xffffff;
} catch (Exception e) {
return 1;
}
}
/**
* 读取一张图片的RGB值
*
* @throws Exception
*/
public ZPLVo getImagePixel(String image) throws Exception {
try {
ZPLVo zplVo = new ZPLVo();
// 读取图像
BufferedImage bi = ImageIO.read(new File(image));
// 设置宽度,不能整除时向上取整
zplVo.setWidth((int)Math.ceil(bi.getWidth() / 8.0));
zplVo.setData(new byte[zplVo.getWidth() * bi.getHeight()]);
int zplIndex = 0;
// 循环读取图像像素
for (int j = 0; j < bi.getHeight(); j++) {
for (int i = 0; i < bi.getWidth(); i += 8) {
// 当前像素值
int rgb0 = getRgb(bi, i + 0, j);
int rgb1 = getRgb(bi, i + 1, j);
int rgb2 = getRgb(bi, i + 2, j);
int rgb3 = getRgb(bi, i + 3, j);
int rgb4 = getRgb(bi, i + 4, j);
int rgb5 = getRgb(bi, i + 5, j);
int rgb6 = getRgb(bi, i + 6, j);
int rgb7 = getRgb(bi, i + 7, j);
byte value = 0;
// 实际每个像素点在ZPL的图像数据中只占1位
value |= (rgb0 == 0 ? 0x00 : 0x80);
value |= (rgb1 == 0 ? 0x00 : 0x40);
value |= (rgb2 == 0 ? 0x00 : 0x20);
value |= (rgb3 == 0 ? 0x00 : 0x10);
value |= (rgb4 == 0 ? 0x00 : 0x08);
value |= (rgb5 == 0 ? 0x00 : 0x04);
value |= (rgb6 == 0 ? 0x00 : 0x02);
value |= (rgb7 == 0 ? 0x00 : 0x01);
// ZPL显示的图像颜色需要取反
value = (byte) ~value;
// 保存
zplVo.getData()[zplIndex++] = value;
}
}
return zplVo;
} catch (Exception e) {
logger.error("", e);
return null;
}
}
/**
* 把字节数组转换成16进制字符串
*
* @param bArray
* @return
*/
public static final String bytesToHexString(byte[] bArray) {
StringBuffer sb = new StringBuffer(bArray.length);
String sTemp;
for (int i = 0; i < bArray.length; i++) {
sTemp = Integer.toHexString(0xFF & bArray[i]);
if (sTemp.length() < 2)
sb.append(0);
sb.append(sTemp.toUpperCase());
}
return sb.toString();
}
}
java调用zebra_java调用斑马GK888t打印机(ZPL指令)相关推荐
- zebradesginer zpl代码_老司机为您win7系统安装斑马GK888t打印机驱动的操作技巧
很多人都懂一些简单的电脑系统问题的操作方案,但是win7系统安装斑马GK888t打印机驱动的问题思路却鲜为人知,小编前几天就遇到了win7系统安装斑马GK888t打印机驱动的问题,于是才准备整理win ...
- 斑马GK888T打印机跑纸(打印半张以及闪红灯)解决办法
斑马GK888T打印机跑纸(打印半张以及闪红灯)解决办法 型号为GK888T,每次打印条码到第二张或者后面几张就会卡纸,然后打印机复位按钮闪红灯,打印机停止工作,此时必须关了重开打印机然后打一张又是上 ...
- c# asp.net mvc使用斑马GK888t打印机打印标签
前言 c#语言,asp.net mvc,南京都昌电子病历模板工具(类似word),斑马GK888t,打印手腕带和标签纸. 实现步骤为:在页面上显示一个或多个都昌模板工具,点击页面上的button,出现 ...
- 树莓派3下Python调用斑马GK888t打印机
折腾了几天终于初有收获.继去年的三无温控探头之后,海爷又支援了他珍藏的斑马打印机.结合之前的研究成果,这下终于可以尝试用树莓派实现自助打印的业务模式了. 首先当然是通过USB物理连接打印机到树莓 ...
- 通过ZPL指令调用zebra打印机打印面单(java版)
1.获取打印机的IP及端口(端口默认为9100): 2.通过RabbitMQ发送监听调用打印方法: 3.查询数据库中打印机是否存在,并获取打印机IP及端口: 4.查询要打印的订单信息及明细: 5.打印 ...
- 【项目管理】Java使用pdfbox调用打印机打印PDF文件
[项目管理]Java使用pdfbox调用打印机打印PDF文件 1.项目前言 2.项目实现 3.关键代码 4.效果演示 5.问题处理 5.1 安装对应字体 5.2 修改对应代码 系统:Win10 Jav ...
- 发送ZPL指令到斑马打印机,并监控打印成功或者失败的状态信息
Visual C# 入门 本文共分为两个部分: 第一部分:介绍如何与Zebar进行连接,把ZPL指令或者模板文件发送到斑马打印机进行打印. 第二部分:介绍如何接收Zebar进行打印之后如何得到斑马打印 ...
- java如何驱动z4mplus打印二维码_斑马 Zebra 打印机驱动下载
斑马Zebra打印机驱动下载 环境支持: Windows Vista.Windows 7.Windows 8 和 Windows 10的所有版本. Windows Server 2008.2008 R ...
- java如何驱动z4mplus打印二维码_斑马 Zebra 打印机驱动下载,打印软件下载
斑马Zebra打印机驱动下载 环境支持: Windows Vista.Windows 7.Windows 8 和 Windows 10的所有版本. Windows Server 2008.2008 R ...
最新文章
- fastqc检验时不能执行java_利用fastqc检测原始序列的质量
- 金属圆柱求取倾斜角度
- Hyper-V 2016 系列教程34 在局域网内架设Windows时间服务器
- open() api
- eclipse调试java web_eclipse调试web项目
- ue4 时间轴是什么意思_UE4中Timeline的使用
- 读书笔记_《深度学习与计算机视觉》.叶韵 编著.田疆 西门子高级研究员 作序.机械工业出版社
- HD2500显卡驱动linux,英特尔HD Graphics 4000/2500 集成显卡驱动
- RK3399驱动开发 | 09 - 基于RK808 PMIC的电源管理驱动
- html做成小程序,HTML-简单表单制作-表单制作-小程序表单制作
- 鸿蒙蕴含的哲理,蕴含哲理的唯美句子,喜欢的就收藏吧!
- C#操作Excel(三)相关函数
- google gms安装
- 苹果开发者账号(公司级)和邓白氏编码(D-U-N-S)申请记录(2015.06)
- Socket 和 ServerSocket
- 微机实验 求某数据区内负数的个数
- springboot 使用熔断器
- rancher导入集群时证书报错
- laravel-excel使用(老猫包子店的故事)
- S1000D 5.0 中文版
热门文章
- 计算机毕业设计Java印染公司信息管理系统(系统+程序+mysql数据库+Lw文档)
- mysql启动显示系统错误1067_启动MySql时出现1067系统错误 解决方案
- 自定义控件从入门到轻生之---解锁新姿势
- 一学就会的便签整理法 帮你轻松收集灵感
- 汽车上为什么非要用SOA?
- mac安装sql server
- 开放式基金全景点评:净值全面攀升 关注老基金(ZZ)
- matlab分布式计算报告,简单的matlab分布式计算
- “黑球”行动再升级,SMBGhost漏洞攻击进入实战
- 七段显示器 + 74HC595 显示 / 设定