效果:

实现:主入口

public static void main(String[] args) {//获取默认的打印机PrintService defaultPrint = PrintServiceLookup.lookupDefaultPrintService();//设置打印内容String fnSku = "M010000000003306079";String productName = "SmallRig FS5 Support for 1954 VCT-14 Shoulder Plate 2104";String sku= "5689723";//打印张数int num = 1;//打印print(fnSku,productName,sku,num,defaultPrint );}

主程序

 /*** @Description:* 通过生成图片打印条形码* @Author:  qiuxiaoxing* @CreateDate:  2021/3/25 17:55* @Version: 1.0*/public static String print(String fnSku, String productName, String sku,int num,PrintService defaultPrint){try {//***************设置条形码***************byte[] codeData = BarCodeImageUtil.generateBarCode128(fnSku, 10.00, 0.2, true);ByteArrayInputStream codeImgIn = new ByteArrayInputStream(codeData);BufferedImage codeImg = ImageIO.read(codeImgIn);//***************设置名称***************//每张图片的高度int image_height = 300;//每行或者每个文字的高度int line_height = 50;int every_line = image_height / line_height;//转换英文名称String[] name = changeProductName(productName);// 每张图片有多少行文字byte[] nameData = TextToImageUtil.createImage(name, new Font("宋体", Font.BOLD, 60), 1700, image_height, every_line, line_height);ByteArrayInputStream nameImgIn = new ByteArrayInputStream(nameData);BufferedImage nameImg = ImageIO.read(nameImgIn);//***************设置sku***************String[] strArr1 = new String[]{"NEW                "+sku};// 每张图片的高度int image_height1 = 300;//每行或者每个文字的高度int line_height1 = 30;int every_line1 = image_height1 / line_height1;// 每张图片有多少行文字byte[] skuData = TextToImageUtil.createImage(strArr1, new Font("宋体", Font.BOLD, 60), 2000, image_height1, every_line1, line_height1);ByteArrayInputStream skuImgIn = new ByteArrayInputStream(skuData);BufferedImage skuImg = ImageIO.read(skuImgIn);//***************绘制需要打印的图片***************//设置生成的图片宽高BufferedImage image = new BufferedImage(890, 500, BufferedImage.TYPE_INT_BGR);Graphics g = image.getGraphics();//绘制白色背景g.setColor(Color.WHITE);g.fillRect(0, 0, 890, 500);//绘制条形码//计算x的偏移量,让条形码居中int width = codeImg.getWidth();int x =(890-width)/2;g.drawImage(codeImg, x, 40, null);//绘制名称g.drawImage(nameImg, 55, 296, null);//绘制skug.drawImage(skuImg, 40, 430, null);g.dispose();ByteArrayOutputStream ous = new ByteArrayOutputStream();try {ImageIO.write(image, "png", ous);} catch (IOException e) {e.printStackTrace();}byte[] bytes = ous.toByteArray();/*try{//生成图片查看(测试使用)FileImageOutputStream imageOutput = new FileImageOutputStream(new File("D:\\Backup\\桌面\\print1.jpg"));imageOutput.write(bytes, 0, bytes.length);imageOutput.close();} catch(Exception ex) {ex.printStackTrace();}*///调用打印机JPGPrint(bytes,num,defaultPrint);} catch (Exception e) {return e.getMessage();}return null;}
 /*** 特殊处理英文名称* @param productName* @return*/private static String[] changeProductName(String productName) {String[] s = productName.split(" ");java.util.List<String> list = new ArrayList<>();for(int i = 0; i < s.length; i++){if(StrUtil.isNotEmpty(s[i])){list.add(s[i]);}}//需要打印的字符List<String> neadPrint = new ArrayList();if(list.size() <= 5){for(int j = 0; j < list.size(); j++){if(j<(list.size()-1)){neadPrint.add(list.get(j) + " ");}else{neadPrint.add(list.get(j));}}}else{//前2个单词 + ... + 后3个单词neadPrint.add(list.get(0)+" ");neadPrint.add(list.get(1)+" ");neadPrint.add(" ... ");neadPrint.add(list.get(list.size()-3)+" ");neadPrint.add(list.get(list.size()-2)+" ");neadPrint.add(list.get(list.size()-1));}String nameUp = "";String nameDown = "";//一行最多25个字符for(String it : neadPrint){if(nameUp.length() < 25){nameUp = nameUp + it;}else{nameDown = nameDown + it;}}if(nameUp.length() > 25){nameDown = nameUp.substring(25,nameUp.length())+nameDown;nameUp = nameUp.substring(0,25);}if(nameDown.length() > 0){nameDown = nameDown.trim();}if(nameDown.length() > 25){nameDown = nameDown.substring(0,25);}return  new String[]{nameUp+nameDown};}
 /*** 打印图片* @param buf* @param num* @param defaultPrint*/public static void JPGPrint(byte[] buf,int num,PrintService defaultPrint){InputStream fis = null;try {// 设置打印格式,如果未确定类型,可选择autosenseDocFlavor flavor = DocFlavor.INPUT_STREAM.PNG;// 设置打印参数PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();aset.add(OrientationRequested.PORTRAIT);//份数aset.add(new Copies(num));aset.add(PrintQuality.HIGH);//单面打印aset.add(Sides.ONE_SIDED);aset.add(MediaSizeName.ISO_B10);DocAttributeSet das = new HashDocAttributeSet();//设置打印纸张的大小(以毫米为单位)das.add(new MediaPrintableArea(0f, 0f, 50f, 45f, MediaPrintableArea.MM));// 构造待打印的文件流fis = new ByteArrayInputStream(buf);Doc doc = new SimpleDoc(fis, flavor, das);// 创建打印作业DocPrintJob job = defaultPrint.createPrintJob();job.print(doc, aset);} catch (Exception e1) {e1.printStackTrace();} finally {// 关闭打印的文件流if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}}

生产条形码和文字图片的工具类

import javax.imageio.ImageIO;
import javax.imageio.stream.FileImageOutputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;public class TextToImageUtil {public static void main(String[] args) {String message = "SmallRig FS5";String[] strArr = message.split("\n");int image_height = 700; // 每张图片的高度int line_height = 30; //每行或者每个文字的高度int every_line = image_height / line_height; // 每张图片有多少行文字byte[] re = createImage(strArr, new Font("宋体", Font.PLAIN, 22), 350, image_height, every_line, line_height);try{FileImageOutputStream imageOutput = new FileImageOutputStream(new File("D:\\Backup\\桌面\\obj.jpg"));imageOutput.write(re, 0, re.length);imageOutput.close();} catch(Exception ex) {ex.printStackTrace();}}/*** 根据str,font的样式等生成图片* @param strArr* @param font* @param width* @param image_height 每张图片的高度* @param every_line 每张图片有多少行文字* @param line_height 每行或者每个文字的高度* @return*/public static byte[] createImage(String[] strArr, Font font,int width, int image_height, int every_line, int line_height){FontMetrics fm = sun.font.FontDesignMetrics.getMetrics(font);int stringWidth = fm.charWidth('字');// 标点符号也算一个字int line_string_num = width % stringWidth == 0 ? (width / stringWidth) : (width / stringWidth) + 1;List<String> listStr = new ArrayList<>();List<String> newList = new ArrayList<>();for (int h = 0; h < strArr.length; h++) {listStr.add(strArr[h]);}for (int j = 0; j < listStr.size(); j++) {if( listStr.get(j).length() > line_string_num){newList.add(listStr.get(j).substring(0,line_string_num));listStr.add(j+1,listStr.get(j).substring(line_string_num));listStr.set(j,listStr.get(j).substring(0,line_string_num));}else{newList.add(listStr.get(j));}}int a = newList.size();int b = every_line;int imgNum = a % b == 0 ? (a / b) : (a / b) + 1;ByteArrayOutputStream ous = new ByteArrayOutputStream();for (int m = 0; m < imgNum; m++) {// 创建图片BufferedImage image = new BufferedImage(width, image_height,BufferedImage.TYPE_INT_BGR);Graphics g = image.getGraphics();g.setClip(0, 0, width, image_height);g.setColor(Color.white); // 背景色白色g.fillRect(0, 0, width, image_height);g.setColor(Color.black);//  字体颜色黑色g.setFont(font);// 设置画笔字体// 每张多少行,当到最后一张时判断是否填充满for (int i = 0; i < every_line; i++) {int index = i + m * every_line;if (newList.size() - 1 >= index) {//g.drawString(newList.get(index), 0, line_height * (i + 1)+12);MyDrawString(newList.get(index), 0, line_height * (i + 1)+12,0.9,g);}}g.dispose();try {ImageIO.write(image, "png", ous);} catch (IOException e) {e.printStackTrace();}}return ous.toByteArray();}public static void MyDrawString(String str,int x,int y,double rate,Graphics g){String tempStr=new String();int orgStringWight=g.getFontMetrics().stringWidth(str);int orgStringLength=str.length();int tempx=x;int tempy=y;while(str.length()>0){tempStr=str.substring(0, 1);str=str.substring(1, str.length());g.drawString(tempStr, tempx, tempy);tempx=(int)(tempx+(double)orgStringWight/(double)orgStringLength*rate);}}
}
import org.apache.commons.lang.ObjectUtils;
import org.krysalis.barcode4j.impl.code128.Code128Bean;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import javax.imageio.stream.FileImageOutputStream;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;public class BarCodeImageUtil {/*** 生成code128条形码** @param height        条形码的高度* @param width         条形码的宽度* @param message       要生成的文本* @param withQuietZone 是否两边留白* @return 图片对应的字节码*/public static byte[] generateBarCode128(String message, Double height, Double width, boolean withQuietZone) {Code128Bean bean = new Code128Bean();// 分辨率int dpi = 512;// 设置两侧是否留白bean.doQuietZone(withQuietZone);// 设置条形码高度和宽度bean.setBarHeight((double) ObjectUtils.defaultIfNull(height, 9.0D));if (width != null) {bean.setModuleWidth(width);}// 设置图片类型String format = "image/png";ByteArrayOutputStream ous = new ByteArrayOutputStream();BitmapCanvasProvider canvas = new BitmapCanvasProvider(ous, format, dpi,BufferedImage.TYPE_BYTE_BINARY, false, 0);// 生产条形码bean.generateBarcode(canvas, message);try {canvas.finish();} catch (IOException e) {}return ous.toByteArray();}public static void main(String[] args) {byte[] bytes = generateBarCode128("768LQ-BSE2346B", 10.00, 0.2, true);try{FileImageOutputStream imageOutput = new FileImageOutputStream(new File("D:\\Backup\\桌面\\obj.jpg"));imageOutput.write(bytes, 0, bytes.length);imageOutput.close();} catch(Exception ex) {ex.printStackTrace();}}}

maven 依赖

<dependency><groupId>net.sf.barcode4j</groupId><artifactId>barcode4j</artifactId><version>2.1</version>
</dependency>
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.6</version><scope>compile</scope>
</dependency>

java调用默认打印机打印发货标签相关推荐

  1. java 调用 默认打印机 打印小票

    直接上代码 参考:java 实现58热敏票据打印 如有侵权,请联系QQ 1450648869 package com.example.demo.print;import java.awt.Color; ...

  2. java调用默认打印机,打印小票(80mm)

    一.默认打印机工具类 package vpos.zs.print;import net.sf.json.JSONObject;import java.util.Map; import java.uti ...

  3. Java调用小票打印机(型号TM-288B)打印小票 (上)

    Java调用小票打印机(型号TM-288B)打印小票 (上) 项目需求需要用Java调用小票打印机打印小票,网上查了很多资料然后慢慢调试最后算成功了 本地安装小票打印机驱动 根据自己的型号下载驱动(此 ...

  4. C#调用系统默认打印机打印文字和图片

    本方法适用于有打印驱动的打印机打印.直接用电脑默认打印机进行打印文字和图片. 首先安装打印机驱动,然后在设备和打印机中将要用的打印机设为默认打印机,然后调用该方法即可 Pulic Void Print ...

  5. Java调用TSC打印机进行打印

    最近项目中用到了打印机,最开始的完全不懂,现在弄好了,所以做了总结,该篇包括后台的调用打印(两种方式)跟前端的js的打印,但是只有IE现在支持打印,而且如果想远程连接打印机,二维码的生成和直接由打印机 ...

  6. PHP\Java\C#\Js\Go\Python调用小票打印机打印订单实现

    优声云打印机U7是成都优声科技有限公司推出的一款WIFI.4G联网的打印机.注意这是一款热敏58mm小票打印机,就是大家购物,外卖那样的收银小票. 在原来的小票打印机世界里,通常都是U口和蓝牙,更高级 ...

  7. JAVA调用TSC打印机打印标签(二维码,数据等)超详细!!

    本文打印机型号: TSC MA3400P 后端调用tsc打印机是通过DLL来进行调用的,首先你需要两个TSC文件直接复制到项目目录下边即可 可以直接去官网下载:https://www.chinatsc ...

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

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

  9. java调用博思得打印机的心得

    转载:http://www.zuidai和ma.com/blog/2793091475983360.htm www.zuidai ma.com居然是违禁字符,我也是醉了,所以在www.zuidai后面 ...

最新文章

  1. Maven配置JRE版本
  2. 手机怎么下载python并安装-Python入门【1】Python下载安装,这几步你要了解
  3. pycharm与github相配置连接(上传、删除、更新项目)
  4. less中的for循环
  5. python最大分词_中文分词算法之最大正向匹配算法(Python版)
  6. linux frame buffer 显示图片 没有颜色,新路程----linux framebuffer显示图片c程序
  7. AndroidStudio3.0多渠道打包
  8. UVA 10791 Minimum Sum LCM 数论
  9. 千万不能错过的Android NDK下载安装及配置
  10. dac生成信号频率取决于_关于高速AD/DAC测量及设计中82个疑难问题的解答
  11. java线程生命周期的图示以及文字说明
  12. tomcat服务器拒绝访问文件,tomcat拒绝访问特定文件
  13. MOS管推挽电路设计及特性解析
  14. apache的IO包中的FileUtils方法的使用
  15. 文章本天成 妙手偶得之 两句三年得 一吟双泪流
  16. JVM垃圾回收说为学日益,为道日损
  17. 插入法排序c语言程序,C语言之插入排序算法
  18. mysql查询条件为不等于某个值时,null 查询不到?
  19. 单元测试框架NUnit 之 constraints 约束
  20. 顶级智囊支招 丰泽智慧城市建设

热门文章

  1. 通过用jQuery写一个页面,我学到了什么
  2. 2022年全球程序员收入报告出炉:国内程序员人均56w年薪。。网友说:我拖后腿了!...
  3. bootbox.js bootbox.promt()
  4. Python读取Execl文件批量生成二维码
  5. 计算机辅助检测医学,人工智能在医学影响分析方面,可以起到计算机辅助诊断的作用,进行病灶检测、病灶量化诊断...
  6. 微信视频号从零到月入万元攻略
  7. 张氏华孙公 福建省上杭县张氏第一代开基祖宗
  8. 快乐想象识字认字注册码发放!
  9. 小武学fpgastep3
  10. python根据x轴、y轴坐标在坐标轴里画出曲线图