在项目中使用斑马打印机遇到了如下问题:

在实际打印信息前,需要修改打印机驱动设置,主要是设置打印颜色深度,默认值一般会打印的比较浅。通常情况下,在设置的颜色深度后,打印机能够很好的工作。但是如果我将程序注册为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();

}

}

来源:oschina

链接:https://my.oschina.net/u/2450094/blog/800030

java 斑马_java调用斑马GK888t打印机(ZPL指令)相关推荐

  1. java 存储过程_Java 调用存储过程

    本文阐述了怎么使用DBMS存储过程.我阐述了使用存储过程的基本的和高级特性,比如返回ResultSet.本文假设你对DBMS和JDBC已经非常熟悉,也假设你能够毫无障碍地阅读其它语言写成的代码(即不是 ...

  2. js 引用 java常量_java调用JS 与JS 调java

    这个 刚开始 我也不会,把我整的是个蛋疼的啊, 最后发现其实挺简单的,我现在给大家说的是我自己掌握的一种, 1. 先是要给项目配置一些权限 (1).访问网络权限 (2).访问SD卡权限 2.给webv ...

  3. linux shell java 参数_java调用linux中的shell脚本传递参数并返回执行结果

    [刚接触 linux下的开发,最近遇到java调用shell脚本的问题,找到一个比较适合菜鸟级的方法,转述如下: 在需要运行的SHELL脚本第一行添加 #!/bin/sh然后在终端运行  chmod ...

  4. JAVA飞信_java调用飞信接口发短信 - 贪吃蛇学院-专业IT技术平台

    java调用飞信接口发短信,看到挺好的,有利于大家做毕业设计加亮点,就发给大家了(新人发帖,不会发多个文件名,测试类就放这了) 需要这3个jar包: commons-codec-1.4.jar com ...

  5. java 父类_java 调用父类的父类

    展开全部 在father中在定义一个62616964757a686964616fe59b9ee7ad9431333335313738调用父类的方法,在子类逐级调用...class GrandPa { ...

  6. 飞信java接口_java调用飞信接口免费短信发送到对方手机

    飞信发送信息限(移动用户) 1.用飞信加为好友才可以跟对方发飞信(达到此条件发飞信不收取费用) 2.FetionConfig配置文件里的 WeekendGreetings=是发送另一个配置文件名 如 ...

  7. 汇编写java模块_java – maven汇编插件moduleset源指令不包括任何文件,不符合附带的模块...

    我有一个多模块的maven项目,我正在尝试获取组件插件的moduleset源部分. 我有模块"module_parent","module_a"和"m ...

  8. java调用zebra_java调用斑马GK888t打印机(ZPL指令)

    在项目中使用斑马打印机遇到了如下问题: 在实际打印信息前,需要修改打印机驱动设置,主要是设置打印颜色深度,默认值一般会打印的比较浅.通常情况下,在设置的颜色深度后,打印机能够很好的工作.但是如果我将程 ...

  9. C#调用斑马打印机打印条码标签(支持COM/LPT/USB/ZPL/EPL/Bitmap)

    利用标签设计软件做好模板,打印至本地文件,把其中的ZPL.EPL指令拷贝出来,替换其中动态变化的内容为变量名,做成一个模板文本,在代码中动态替换变量,再把指令输出至打印机. ZebraPrintHel ...

  10. zebradesginer zpl代码_老司机为您win7系统安装斑马GK888t打印机驱动的操作技巧

    很多人都懂一些简单的电脑系统问题的操作方案,但是win7系统安装斑马GK888t打印机驱动的问题思路却鲜为人知,小编前几天就遇到了win7系统安装斑马GK888t打印机驱动的问题,于是才准备整理win ...

最新文章

  1. Python参考书籍
  2. linux系统运行时间
  3. github的webhooks无法刷新config服务端的bus-refresh接口
  4. fpga如何约束走线_如何正确的约束时钟—Vivado优化到关键路径
  5. html里面表格问题
  6. 【今日CV 视觉论文速览】30 Nov 2018
  7. Xshell连接Ubuntu时提示SSH服务器拒绝了密码
  8. 敏捷开发般若敏捷系列之六:如何推广敏捷(下)(以无我之心,行无住之法)...
  9. python课程典范选优_python学生选课系统
  10. tp5 php文件做模板模板,TP5视图和模板
  11. 合并报表软件系统推荐
  12. 管理信息系统案例分析_万华集团 IT 规划案例分析
  13. 使用TypeScript两年后,还值得吗?
  14. ArcGIS模型构建器案例学习-批量删除空要素类地理模型
  15. Rinne Loves Dynamic Graph
  16. cuda性能分析工具
  17. 压敏电阻选型,超详细的指南攻略
  18. 软件工程——Beta冲刺(1/3)
  19. phd计算机考试,21校计算机Phd详细申请经验
  20. android+win8+双系统,Android/Win8双系统 天敏iBox睿盒D9i评测上

热门文章

  1. 编辑为什么建议转投_论文被退稿建议转投他刊是什么意思?
  2. leetcode---1728. 猫和老鼠 II
  3. RFC1180 TCP/IP指南
  4. G码云+hexo搭建博客
  5. [opencv4]——fatal error: opencv2/opencv.hpp: No such file or directory #include <opencv2/opencv.hpp>
  6. 我的团长我的团第八集
  7. ibms智能化系统集成服务器,智能化集成管理系统(IBMS)
  8. 重装正版Win10系统图文教程
  9. 拯救懒癌患者,京东订单自动写评价脚本!
  10. 可测函数列的依测度收敛性