使用场景:
最近公司有一个项目需求,需要导出Excel图片,导出的图片需要生成条形码,这里写了一个基于谷歌zxing的条形码生成工具类
首先需要引入相关zxing依赖
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.4.1</version> <!-- 或者您项目中使用的版本 -->
</dependency>
Code
直接上代码
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.oned.Code128Writer;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
/**
* 生成条形码工具类
*/
public class CodeGenerateUtils {
/**
* 主要调用方法
* @param barcodeText 条形码内容
* @param additionalText 条形码底部附加文本内特
* @return 返回图片字节
*/
public static byte[] generateBarcode(String barcodeText, String additionalText) {
try {
// 生成带有附加文本的条形码
BufferedImage combinedImage = generateBarcodeWithText(barcodeText, additionalText); // 增加高度以容纳附加文本
// 将 BufferedImage 转为字节数组输出流
ByteArrayOutputStream bass = new ByteArrayOutputStream();
ImageIO.write(combinedImage, "png", bass);
return bass.toByteArray();
// 设置响应头和内容
} catch (WriterException | IOException e) {
throw new RuntimeException(e);
}
}
// 生成条形码并在底部添加附加文本
private static BufferedImage generateBarcodeWithText(String text, String additionalText) throws WriterException, IOException {
// 生成条形码
BufferedImage barcodeImage = generateBarcode(text, 200, 100);
// 创建更高的 BufferedImage,用于容纳条形码和附加文本
BufferedImage combinedImage = new BufferedImage(200, 100 + 20, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = combinedImage.createGraphics();
// 设置整个图像的背景为白色
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, 200, 100 + 20);
// 将条形码绘制到新的 BufferedImage 中
g2d.drawImage(barcodeImage, 0, 0, null);
// 设置字体和颜色
Font font = new Font("Arial", Font.PLAIN, 12);
g2d.setFont(font);
g2d.setColor(Color.BLACK);
// 计算文本位置
int textWidth = g2d.getFontMetrics().stringWidth(additionalText);
int x = (200 - textWidth) / 2;
int y = 100 + 15; // 在条形码下方留出一定的空白
// 添加附加文本到图片
g2d.drawString(additionalText, x, y);
g2d.dispose();
return combinedImage;
}
// 生成条形码
private static BufferedImage generateBarcode(String text, int width, int height) throws WriterException {
Code128Writer barcodeWriter = new Code128Writer();
BitMatrix bitMatrix = barcodeWriter.encode(text, BarcodeFormat.CODE_128, width, height, null);
return MatrixToImageWriter.toBufferedImage(bitMatrix);
}
}
注意点:
由于每个人想要生成条形码的样式不一样,需要自行在generateBarcodeWithText
方法里面设置条形码的各种属性,包括长宽大小颜色以及附加文本(不需要附加文本可以直接剔除,根据自己实际需求添加
)都可以自行修改。