最近开发java程序调用斑马制卡机的功能,基本思路如下:1.利用java生成一个上岗证图片的正面和反面,2.java调用打印SDK打印彩色上岗证。

本次文章内容只涉及生成图片和打印两块功能,不涉及部署那一块。现在直接贴代码

1.java生成工作证正面和反面

1.1生成正面(包括头像照片和姓名等文字信息)

 private static BufferedImage getFront(String path){BufferedImage bimage = null;try {ImageIcon imgIcon = new ImageIcon(path);Image theImg = imgIcon.getImage();int width = theImg.getWidth(null) == -1 ? 1023 : theImg.getWidth(null);//3250int height = theImg.getHeight(null) == -1 ? 639 : theImg.getHeight(null);//2040bimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics2D g = bimage.createGraphics();//消除文字锯齿g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);//消除画图锯齿g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);//清除画线锯齿g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,RenderingHints.VALUE_STROKE_DEFAULT);g.setColor(Color.white);//背景颜色g.fillRect(0, 0, 1023, 639);//背景面积及位置,width=x.height=yg.drawImage(theImg, 0, 0, null);String fontName="微软雅黑";//微软雅黑g.setColor(Color.black);g.setFont(new Font(fontName, Font.PLAIN, 50));g.drawString("某某建筑工地", 60, 90);//上岗证g.setColor(Color.black);g.setFont(new Font(fontName, Font.PLAIN, 70));g.drawString("上岗证", 750, 100);   //上岗证//画直线(上)g.setStroke(new BasicStroke(4.0f));//线条粗细g.setColor(Color.black);//线条颜色g.drawLine(0, 120, 1023, 120);//线条起点及终点位置//绘制头像
//将图片转换为BufferedImage对象BufferedImage bImage = ImageIO.read(new File("D:\\头像.jpg"));g.drawImage(bImage, 64, 179, 229, 275, null);//姓名g.setColor(Color.black);g.setFont(new Font(fontName, Font.PLAIN, 45));g.drawString("姓 名:", 355, 220);//姓名变量g.setColor(Color.black);g.setFont(new Font(fontName, Font.PLAIN, 45));g.drawString("XXX", 600, 220);//等级g.setColor(Color.black);g.setFont(new Font(fontName, Font.PLAIN, 45));g.drawString("等 级:", 355, 332);//等级变量g.setColor(Color.black);g.setFont(new Font(fontName, Font.PLAIN, 45));g.drawString("高 级", 620, 332);//岗位g.setColor(Color.black);g.setFont(new Font(fontName, Font.PLAIN, 45));g.drawString("岗 位:", 355, 446);//岗位变量g.setColor(Color.black);g.setFont(new Font(fontName, Font.PLAIN, 45));g.drawString("搬砖工", 570, 446);//画直线(下)g.setStroke(new BasicStroke(4.0f));//线条粗细g.setColor(Color.black);//线条颜色g.drawLine(0, 516, 1023, 516);//线条起点及终点位置g.setColor(Color.black);g.setFont(new Font(fontName, Font.PLAIN, 50));g.drawString("部  门:水泥混泥土搬砖部", 60, 600);g.dispose();//处理绘图//以下是测试代码,将以上生成的图片绘制到电脑磁盘里,看看效果ImageIO.write(bimage,"bmp",new File("D:\\front123.bmp"));} catch (Exception e) {e.printStackTrace();}return bimage;}

说明:如果卡片正面是彩色的,可以先准备好一个彩色背景的图片,然后再在上面画头像、文字和直线

1.2生成反面

private static BufferedImage getBack(String path){BufferedImage bimage = null;try {//首先需要对图片进行预处理,即修改成指定尺寸ImageIcon imgIcon = new ImageIcon(path);Image theImg = imgIcon.getImage();int width = theImg.getWidth(null) == -1 ? 1023 : theImg.getWidth(null);//3250int height = theImg.getHeight(null) == -1 ? 639 : theImg.getHeight(null);//2040bimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics2D g = bimage.createGraphics();g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);//消除画图锯齿g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,RenderingHints.VALUE_STROKE_DEFAULT);g.setColor(Color.WHITE);//背景颜色g.fillRect(0, 0, 1023, 639);//背景面积及位置,width=x.height=yg.drawImage(theImg, 0, 0, null);//画印章BufferedImage bImage = ImageIO.read(new File("D:\\yz.jpg"));//graphics.drawImage(bufferedImage.getScaledInstance(imageW, imageH, Image.SCALE_DEFAULT),100, 100, null);g.drawImage(bImage, 450, 50, 420, 420, null);//员工编号g.setColor(Color.black);g.setFont(new Font("微软雅黑", Font.PLAIN, 45));g.drawString("员工编号:", 60, 93); //编 号变量,字母编号位置计算方式跟汉字不一样g.setColor(Color.black);g.setFont(new Font("微软雅黑", Font.PLAIN, 45));g.drawString("2020102301", 260, 95);  //兼职岗位g.setColor(Color.black);g.setFont(new Font("微软雅黑", Font.PLAIN, 45));g.drawString("兼职岗位:", 60, 237);//兼职岗位变量g.setColor(Color.black);g.setFont(new Font("微软雅黑", Font.PLAIN, 45));g.drawString("运砖", 260, 237);//发证单位g.setColor(Color.black);g.setFont(new Font("微软雅黑", Font.PLAIN, 45));g.drawString("发证单位:", 60, 380);//发证单位变量g.setColor(Color.black);g.setFont(new Font("微软雅黑", Font.PLAIN, 45));g.drawString("某某建筑工地包工头抽烟办公室", 260, 380);//有效期限g.setColor(Color.black);g.setFont(new Font("微软雅黑", Font.PLAIN, 45));g.drawString("有效期限:", 60, 537);//有效期限变量g.setColor(Color.black);g.setFont(new Font("微软雅黑", Font.PLAIN, 45));g.drawString("2020年08月到2020年12月", 260, 539);g.dispose();//处理绘图//以下是测试代码,将以上生成的图片绘制到电脑磁盘里ImageIO.write(bimage,"bmp",new File("D:\\back123.bmp"));} catch (Exception e) {e.printStackTrace();}return bimage;//返回生成好的图片
}

1.3主程序

import java.awt.*;
import java.io.UnsupportedEncodingException;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
public static void main(String[] args) throws IOException {//正面头像front.jpg为彩色背景的图片,尺寸大小1023*639(宽*高)BufferedImage bufferedImage1=getFront("resources/front.jpg");//反面是白色的,所以不需要额外添加背景色的图片BufferedImage bufferedImage2=getBack("D:\\");
}

2.调用打印服务

首先请参考斑马制卡机官网API文档熟悉用法,官网地址

https://techdocs.zebra.com/link-os/2-14/pc_card/

另外就是下载需要的SDK和demo支持

https://www.zebra.cn/gb/en/support-downloads/eula/unrestricted-eula.-227178c9720c025483893483886ea540bd07dd0f9873752cf891686eb495040ba85f97bf163f9fdbc62ce8bbe325bdfda5bb7449f89dc4c397db9c6a4362efc05821d050e3efc345f03ff4a747d77477225247d52ee0ea63a56442494470a7681299b8950e32f7b.html#

下面直接贴代码

import java.awt.Color;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import org.apache.commons.io.IOUtils;import com.zebra.sdk.comm.*;
import com.zebra.sdk.common.card.containers.GraphicsInfo;
import com.zebra.sdk.common.card.containers.JobStatusInfo;
import com.zebra.sdk.common.card.enumerations.*;
import com.zebra.sdk.common.card.exceptions.ZebraCardException;
import com.zebra.sdk.common.card.graphics.*;
import com.zebra.sdk.common.card.graphics.enumerations.RotationType;
import com.zebra.sdk.common.card.printer.*;
import com.zebra.sdk.common.card.printer.discovery.ZebraCardPrinterFilter;
import com.zebra.sdk.device.ZebraIllegalArgumentException;
import com.zebra.sdk.printer.discovery.*;import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;public class ZebraTest2 {/*** @param args*/public static void main(String[] args) {Connection connection = null;ZebraCardPrinter zebraCardPrinter = null;DiscoveredPrinter[] printers = null;ZebraGraphics graphics = null;try {printers = UsbDiscoverer.getZebraUsbPrinters(new ZebraCardPrinterFilter());if (printers.length > 0) {connection = printers[0].getConnection();connection.open();zebraCardPrinter = ZebraCardPrinterFactory.getInstance(connection);}if (zebraCardPrinter == null) {return;}List<GraphicsInfo> graphicsData = new ArrayList<GraphicsInfo>();//生成画笔graphics = new ZebraCardGraphics(zebraCardPrinter);//生成需要打印的图片集合generatePrintJobImage(graphics, graphicsData);//打印服务int jobId = zebraCardPrinter.print(1, graphicsData);pollJobStatus(zebraCardPrinter, jobId);JobStatusInfo jStatus = zebraCardPrinter.getJobStatus(jobId);System.out.println("Job complete: " + jStatus.printStatus);} catch (ConnectionException e) {System.out.println("Error discovering local printers: " + e.getMessage());e.printStackTrace();} catch (Exception e) {e.printStackTrace();} finally {cleanUp(connection, zebraCardPrinter, graphics);}}private static void generatePrintJobImage(ZebraGraphics graphics, List<GraphicsInfo> graphicsData) throws IOException {BufferedImage img = null;ByteArrayOutputStream baos = null;GraphicsInfo grInfo = new GraphicsInfo();try {graphics.initialize(0, 0, OrientationType.Landscape, PrintType.Color, Color.WHITE);// Front Color,打印正面grInfo.side = CardSide.Front;grInfo.printType = PrintType.Color;grInfo.graphicType = GraphicType.BMP;String filepath = "resources/front123.bmp"; // replace with path to your imageimg = ImageIO.read(new File(filepath));baos = new ByteArrayOutputStream();ImageIO.write(img, "bmp", baos);graphics.drawImage(baos.toByteArray(), 0, 0, 0, 0, RotationType.RotateNoneFlipNone);grInfo.graphicData = graphics.createImage(null);graphics.clear();graphicsData.add(grInfo);// Front OverlaygrInfo = new GraphicsInfo();grInfo.side = CardSide.Front;grInfo.printType = PrintType.Overlay;grInfo.graphicType = GraphicType.NA;grInfo.graphicData = null;graphicsData.add(grInfo);// Back MonoK,打印反面graphics.initialize(0, 0, OrientationType.Landscape, PrintType.Color, Color.WHITE);grInfo = new GraphicsInfo();grInfo.side = CardSide.Back;grInfo.printType = PrintType.Color;grInfo.graphicType = GraphicType.BMP;filepath = "resources/back123.bmp"; // replace with path to your imageimg = ImageIO.read(new File(filepath));baos = new ByteArrayOutputStream();ImageIO.write(img, "bmp", baos);graphics.drawImage(baos.toByteArray(), 0, 0, 0, 0, RotationType.RotateNoneFlipNone);grInfo.graphicData = graphics.createImage(null);graphics.clear();graphicsData.add(grInfo);} finally {IOUtils.closeQuietly(baos);}}static boolean pollJobStatus(ZebraCardPrinter device, int actionID) throws ConnectionException, ZebraCardException, ZebraIllegalArgumentException {boolean success = false;long dropDeadTime = System.currentTimeMillis() + 40000;long pollInterval = 500;// Poll job statusJobStatusInfo jStatus = null;do {jStatus = device.getJobStatus(actionID);System.out.println(String.format("Job %d, Status:%s, Card Position:%s, " + "ReadyForNextJob:%s, Mag Status:%s, Contact Status:%s, Contactless Status:%s, " + "Error Code:%d, Alarm Code:%d", actionID, jStatus.printStatus, jStatus.cardPosition, jStatus.readyForNextJob,jStatus.magneticEncoding, jStatus.contactSmartCard, jStatus.contactlessSmartCard, jStatus.errorInfo.value, jStatus.alarmInfo.value));if (jStatus.contactSmartCard.contains("station")) {success = true;break;} else if (jStatus.contactlessSmartCard.contains("station")) {success = true;break;} else if (jStatus.printStatus.contains("done_ok")) {success = true;break;} else if (jStatus.printStatus.contains("alarm_handling")) {System.out.println("Error Dectected: " + jStatus.alarmInfo.description);} else if (jStatus.printStatus.contains("error") || jStatus.printStatus.contains("cancelled")) {success = false;break;}if (System.currentTimeMillis() > dropDeadTime) {success = false;}try {Thread.sleep(pollInterval);} catch (InterruptedException e) {e.printStackTrace();}} while (true);return success;}private static void cleanUp(Connection connection, ZebraCardPrinter genericPrinter, ZebraGraphics graphics) {try {if (genericPrinter != null) {genericPrinter.destroy();genericPrinter = null;}} catch (ZebraCardException e) {e.printStackTrace();}if (graphics != null) {graphics.close();graphics = null;}if (connection != null) {try {connection.close();connection = null;} catch (ConnectionException e) {e.printStackTrace();}}}
}

说明:将之前生成好的图片,bmp格式的放到程序可以找到的位置,包括正面和反面。本实例采用的2-14版本的jdk

相关需要下载的资源

a.斑马SDK以及demo

https://download.csdn.net/download/qq_34309663/13023613

b.我自己写的demo

https://download.csdn.net/download/qq_34309663/13025187

java调用斑马证卡打印机制卡机ZXP Series 3C打印彩色工作证相关推荐

  1. Java调用Zebra800条码打印机

    开发中用到了斑马打印机打印标签,这次开发中只是用来打文字,没有生成条形码,所以在别人的基础上我又改动了一下.要参考打条形码的可以看代码中的其它相关方法.我用的是Zebra800,java调用斑马相关型 ...

  2. 调用斑马打印机实现标签打印

    Java 调用斑马打印机实现标签打印 代码实现 最近的一个项目中,需要实现java调用斑马的打印机实现标签打印功能,百度了一些资源,找了不少人搞了一台快报废的斑马105SL 300DPI打印机,分分钟 ...

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

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

  4. java中的进制输出转换_Java I/O : Java中的进制详解

    作者:李强强 上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算.这一讲,泥瓦匠带你走进Java中的进制详解. 一.引子 在Java世界里,99%的工作都是处理这高层. ...

  5. java 调用打印机 api_java 调用打印机API无法打印,但是直接打印可以,请问有人遇到过这样的问题吗?...

    java调用打印机的代码如下:publicstaticvoidmain(String[]args){PrintRequestAttributeSetpras=newHashPrintRequestAt ...

  6. Java调用linux指令工具类,直接执行cmd,执行grep指令返回结果,执行sed追加指令,hdfs下载指令,获取文件行数

    Java调用linux指令工具类,直接执行cmd,执行grep指令返回结果,执行sed追加指令,hdfs下载指令,获取文件行数 问题背景 LinuxUtils工具类 Lyric:梦想挟带眼泪 问题背景 ...

  7. Java调用百度API出现{status:211,message:APP SN校验失败}

    Java调用百度API出现{"status":211,"message":"APP SN校验失败"} {"status" ...

  8. java 实现N进制转M进制

    1. 把10进制转成N进制:除N取余,逆序排列 这里逆序排列使用StringBuilder类的reverse()函数来实现. /*** 10进制整数转换为N进制整数. 10进制转换为N进制的方法是:这 ...

  9. java调用短信接口实现发送短信

    java调用短信接口实现发送短信 1.下载接口文件 2.打开java文件夹 2.1获取jar包依赖 2.2获取代码模板 3.创建项目 3.1打开eclipse软件,创建一个动态的web项目 3.2导入 ...

  10. eclipse java调用c 代码吗_linux下通过eclipse开发用java调用c程序的方法

    linux下通过eclipse开发用java调用c程序的方法: 1.先建立好java工程并建立java文件如下: public class testso {     static {         ...

最新文章

  1. java mysql 变量_MySQL基础_变量
  2. np.zeros(shape) 注意shape的规范格式为元组,不是list
  3. 【Qt】Qt工程管理
  4. Arcgis 使用ArcToolbox实现数据统计
  5. SLAM GMapping(5)运动模型
  6. Java 文件操作-File
  7. Mybatis+Oracle批处理
  8. Vue路由设置嵌套(一级二级三级展示并且显示定向选中)
  9. kafka 幂等机制入门实例
  10. 微服务深入浅出(4)-- 负载均衡Ribbon
  11. shell基础之for循环语句
  12. python中size的用法_PyArray_SIZE的正确用法是什么?
  13. 一维热传导问题与C++描述
  14. Typora 如何自动生成标题序号
  15. 钢琴艺术培训市场现状研究分析报告 -
  16. 手把手教你买基金----读书笔记
  17. Oracle数据库打补丁方法
  18. 阴阳师系统转移开放服务器,阴阳师:运营商倒闭后?原来只是子账号数据转移,可迁移到官服...
  19. 什么是进销存?进销存软件有哪些功能?
  20. 职场必备的五款有格调的办公软件 让你从此呼风唤雨

热门文章

  1. Ext applyTo和renderTo的区别和用法
  2. asp.net panel 加html,ASP.NET中 Panel 控件的使用方法
  3. 用计算机制作标准曲线的方法,如何绘制标准曲线
  4. 博士申请 | 美国弗吉尼亚理工大学周大为老师招收图神经网络方向全奖博士生...
  5. Struts2拦截器详解
  6. java ftpclient prompt,一个JAVA FTP客户端制作的收获
  7. Linux入门基础学习参考资料
  8. VMware 8.02虚拟机安装MAC lion 10.7.3教程 附送原版提取镜像InstallESD.iso!
  9. Windows Phone上的相机景深计算器
  10. 计算机文化基础—病毒