maven依赖(core生成二维码,javase生成条形码,axis是base64转换):
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
</dependency>
工具类:
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.oned.Code128Writer;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.apache.axis.encoding.Base64;
import org.springframework.util.StringUtils;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.util.HashMap;
import java.util.Map;
public class CodeUtil {
//二维码
public static String getQRCode(String content, int width, int height) {
if (!StringUtils.isEmpty(content)) {
HashMap<EncodeHintType, Comparable> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.MARGIN, 0);
String base64 = null;
try {
QRCodeWriter writer = new QRCodeWriter();
BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints);
BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", os);
base64 = Base64.encode(os.toByteArray());
System.out.println("二维码base64:" + base64);
os.flush();
os.close();
String resultImage = "data:image/png;base64," + base64;
return resultImage;
} catch (Exception e) {
System.out.println(e);
}
}
return null;
}
//条形码
public static String getBarCode(String content, int width, int height) {
String base64 = null;
try {
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.MARGIN, 0);
int realWidth = getBarCodeNoPaddingWidth(width, content, width);
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.CODE_128, realWidth, height, hints);
BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", os);
base64 = Base64.encode(os.toByteArray());
System.out.println("条形码base64:" + base64);
os.flush();
os.close();
String resultImage = "data:image/png;base64," + base64;
return resultImage;
} catch (Exception e) {
return null;
}
}
private static int getBarCodeNoPaddingWidth(int expectWidth, String contents, int maxWidth) {
boolean[] code = new Code128Writer().encode(contents);
int inputWidth = code.length;
double outputWidth = Math.max(expectWidth, inputWidth);
double multiple = outputWidth / inputWidth;
//优先取大的
int returnVal = 0;
int ceil = (int) Math.ceil(multiple);
if (inputWidth * ceil <= maxWidth) {
returnVal = inputWidth * ceil;
} else {
int floor = (int) Math.floor(multiple);
returnVal = inputWidth * floor;
}
return returnVal;
}
}
生成二维码和条形码:
Map map = new HashMap<>();
try {
String content = "2021102610000135";
String QRCode = CodeUtil.getQRCode(content,300,300);
String BarCode = CodeUtil.getBarCode(content,300,150);
map.put("QRCode", QRCode);
map.put("BarCode", BarCode);
map.put("randomCode", content);
} catch (Exception e) {
logger.error("生成二维码和条形码错误", e);
}
前端放在img标签内即可展示:
<img src = "BarCode">
randomCode
<img src = "QRCode">
效果如下: