生成条形码需要ja坐标:
<!--生成条形码-->
<dependency>
<groupId>net.sf.barcode4j</groupId>
<artifactId>barcode4j-light</artifactId>
<version>2.0</version>
</dependency>
调用打印机java使用自身带有的print就可以做到
我们先生成条形码:generateFile方法传入需要条形码包含的信息和生成的路径就可以
package com.hongseng.app.config.barcode;
import org.krysalis.barcode4j.impl.code39.Code39Bean;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import org.krysalis.barcode4j.tools.UnitConv;
import java.awt.image.BufferedImage;
import java.io.*;
/**
*
* @program: fire
* @description:
* @author: fbl
* @create: 2021-08-11 10:24
**/
public class BarcodeUtil {
/**
* 生成文件s
*
* @param msg
* @param path
* @return
*/
public static File generateFile(String msg, String path) {
File file = new File(path);
try {
generate(msg, new FileOutputStream(file));
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
return file;
}
/**
* 生成字节
*
* @param msg
* @return
*/
public static byte[] generate(String msg) {
ByteArrayOutputStream ous = new ByteArrayOutputStream();
generate(msg, ous);
return ous.toByteArray();
}
/**
* 生成到流
*
* @param msg
* @param ous
*/
public static void generate(String msg, OutputStream ous) {
if (msg == null || msg.equals("") || ous == null) {
return;
}
Code39Bean bean = new Code39Bean();
// 精细度
final int dpi = 150;
// module宽度
final double moduleWidth = UnitConv.in2mm(1.0f / dpi);
// 配置对象
bean.setModuleWidth(moduleWidth);
bean.setWideFactor(3);
bean.doQuietZone(false);
String format = "image/png";
try {
// 输出到流
BitmapCanvasProvider canvas = new BitmapCanvasProvider(ous, format, dpi,
BufferedImage.TYPE_BYTE_BINARY, false, 0);
// 生成条形码
bean.generateBarcode(canvas, msg);
// 结束绘制
canvas.finish();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
在指定路径生产条形码之后,将路径作为参数调用接口打印
第一个参数是路径,其余四个参数是纸张和图片的尺寸
package com.hongseng.app.config.barcode;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.print.*;
import java.io.IOException;
import java.net.URL;
import static java.awt.print.Printable.PAGE_EXISTS;
/**
* @program: fire
* @description:
* @author: fbl
* @create: 2021-08-11 10:03
**/
public class PrintDemo {
public static void qrCodePrint(String path, int pageWidth, int pageHeight, int showWidth, int showHeight) {
// 通俗理解就是书、文档
Book book = new Book();
// 设置成竖打
PageFormat pf = new PageFormat();
pf.setOrientation(PageFormat.PORTRAIT);
// 通过Paper设置页面的空白边距和可打印区域。必须与实际打印纸张大小相符。
Paper p = new Paper();
//纸张大小
p.setSize(pageWidth, pageHeight);
p.setImageableArea(0, 0, pageWidth, pageHeight);
pf.setPaper(p);
// 把 PageFormat 和 Printable 添加到书中,组成一个页面
book.append((graphics, pageFormat, pageIndex) -> {
try {
URL url = new URL(path);//也可以通过file构建一个本地图片File对象传递给ImageIO.read()方法
Image image = ImageIO.read(url);
//将图片绘制到graphics对象中(为什么把需要打印的内容drawImage就可以实现打印自己取看值传递一引用传递的区别)
graphics.drawImage(image, 0, 0, showWidth, showHeight, null);
} catch (IOException e) {
e.printStackTrace();
}
return PAGE_EXISTS;//返回0(PAGE_EXISTS)则执行打印,返回1(NO_SUCH_PAGE)则不执行打印
}, pf);
// 获取打印服务对象
PrinterJob job = PrinterJob.getPrinterJob();
// 设置打印类
job.setPageable(book);
try {
//可以用printDialog显示打印对话框,在用户确认后打印;也可以直接打印
job.print();
} catch (PrinterException e) {
e.printStackTrace();
}
}
}
我的service层将两个工具类协同调用
package com.hongseng.app.service.barcode;
import com.hongseng.app.config.barcode.BarcodeUtil;
import com.hongseng.app.config.barcode.PrintDemo;
import model.dto.barcode.BarCodeDto;
import model.dto.barcode.PicturePrintDto;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import result.Result;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.UUID;
/**
* @program: fire_control
* @description:
* @author: fbl
* @create: 2021-04-01 09:55
**/
@Service
public class BarCodeService {
@Value("${spring.servlet.multipart.location}")
private String picturePath;
@Value("${server.port}")
private String port;
public void prodCode(BarCodeDto barCodeDto) {
String codeName = UUID.randomUUID().toString().replaceAll("-", "") + ".png";
String path = picturePath + codeName;
// 生成条形码图片
BarcodeUtil.generateFile(barCodeDto.getId() + "", path);
InetAddress localHost = null;
try {
localHost = Inet4Address.getLocalHost();
} catch (UnknownHostException e) {
e.printStackTrace();
}
String ip = localHost.getHostAddress();
// 上传图片
String finalPath = "http://" + ip + ":" + port + "/file/" + codeName;
// 打印图片
// 打印
PrintDemo.qrCodePrint(finalPath, barCodeDto.getPageWidth(), barCodeDto.getPageHeight(), barCodeDto.getShowWidth(), barCodeDto.getShowHeight());
}
}
BarCodeDto 类参数:
package model.dto.barcode;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* @program: temperature-statistics
* @description:
* @author: fbl
* @create: 2021-08-12 08:19
**/
@Data
public class BarCodeDto {
@NotNull
private Integer id;
@NotNull
private Integer pageWidth;
@NotNull
private Integer pageHeight;
@NotNull
private Integer showWidth;
@NotNull
private Integer showHeight;
}
controller层调用就不写了