JAVA使用ZXing生成条形码Demo(可自定义文字及其位置)

墨蓝 2022-12-09 04:53 110阅读 0赞
  1. 最近在工作中遇到生成条形码的需求,于是在一番搜索之后找到ZXing这个工具。(生成的结果如下图)

20200922091545801.png

首先需要引入依赖:

  1. <!--zxing工具-->
  2. <dependency>
  3. <groupId>com.google.zxing</groupId>
  4. <artifactId>core</artifactId>
  5. <version>3.4.0</version>
  6. </dependency>
  7. <!--zxing工具之javase-->
  8. <dependency>
  9. <groupId>com.google.zxing</groupId>
  10. <artifactId>javase</artifactId>
  11. <version>3.4.0</version>
  12. </dependency>

下面是工具类:

  1. import com.google.zxing.BarcodeFormat;
  2. import com.google.zxing.EncodeHintType;
  3. import com.google.zxing.WriterException;
  4. import com.google.zxing.client.j2se.MatrixToImageWriter;
  5. import com.google.zxing.common.BitMatrix;
  6. import com.google.zxing.oned.Code128Writer;
  7. import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
  8. import com.yunchang.springboot.utils.DateUtil;
  9. import org.apache.commons.lang3.StringUtils;
  10. import javax.imageio.ImageIO;
  11. import java.awt.*;
  12. import java.awt.image.BufferedImage;
  13. import java.io.File;
  14. import java.io.IOException;
  15. import java.util.HashMap;
  16. import java.util.Map;
  17. /**
  18. * @author super man
  19. * @date 2020/9/16 0016 16:10
  20. * @description: 条形码生成工具
  21. */
  22. public class GoogleBarCodeUtils {
  23. /**
  24. * 条形码宽度
  25. */
  26. private static final int WIDTH = 300;
  27. /**
  28. * 条形码高度
  29. */
  30. private static final int HEIGHT = 52;
  31. /**
  32. * 加文字 条形码
  33. */
  34. private static final int WORD_HEIGHT = 110;
  35. /**
  36. * 条形码右下角第一段数据
  37. */
  38. private static final String RIGHT_FIRST_WORDS = "superMan";
  39. private static final String RIGHT_SECOND_WORDS = "Made in China";
  40. /**
  41. * 设置 条形码参数
  42. */
  43. private static Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>() {
  44. private static final long serialVersionUID = 1L;
  45. {
  46. // 设置编码方式
  47. put(EncodeHintType.CHARACTER_SET, "utf-8");
  48. // 容错级别 这里选择最高H级别
  49. put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
  50. put(EncodeHintType.MARGIN, 1);
  51. }
  52. };
  53. /**
  54. * 生成 图片缓冲
  55. *
  56. * @param vaNumber VA 码
  57. * @return 返回BufferedImage
  58. * @author fxbin
  59. */
  60. public static BufferedImage getBarCode(String vaNumber) {
  61. try {
  62. Code128Writer writer = new Code128Writer();
  63. // 编码内容, 编码类型, 宽度, 高度, 设置参数
  64. BitMatrix bitMatrix = writer.encode(vaNumber, BarcodeFormat.CODE_128, WIDTH, HEIGHT, hints);
  65. return MatrixToImageWriter.toBufferedImage(bitMatrix);
  66. } catch (WriterException e) {
  67. e.printStackTrace();
  68. }
  69. return null;
  70. }
  71. /**
  72. * 把带logo的二维码下面加上文字
  73. *
  74. * @param image 条形码图片
  75. * @param words 文字
  76. * @return 返回BufferedImage
  77. * @author fxbin
  78. */
  79. public static BufferedImage insertWords(BufferedImage image, String words, String time) {
  80. // 新的图片,把带logo的二维码下面加上文字
  81. if (StringUtils.isNotEmpty(words)) {
  82. BufferedImage outImage = new BufferedImage(WIDTH, WORD_HEIGHT, BufferedImage.TYPE_INT_RGB);
  83. Graphics2D g2d = outImage.createGraphics();
  84. // 抗锯齿
  85. setGraphics2D(g2d);
  86. // 设置白色
  87. setColorWhite(g2d);
  88. // 画条形码到新的面板
  89. g2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
  90. // 画文字到新的面板
  91. Color color = new Color(0, 0, 0);
  92. g2d.setColor(color);
  93. // 字体、字型、字号
  94. g2d.setFont(new Font("微软雅黑", Font.PLAIN, 16));
  95. //文字长度
  96. int strWidth = g2d.getFontMetrics().stringWidth(words);
  97. //总长度减去文字长度的一半 (居中显示)
  98. int wordStartX = (WIDTH - strWidth) / 2;
  99. //height + (outImage.getHeight() - height) / 2 + 12
  100. int wordStartY = HEIGHT + 20;
  101. // time 文字长度
  102. int timeWidth = 1;
  103. // rightFirstWords 文字长度
  104. int rightFirstWordsWidth = WIDTH - g2d.getFontMetrics().stringWidth(RIGHT_FIRST_WORDS);
  105. // rightSecondWords 文字长度
  106. int rightSecondWordsWidth = WIDTH - g2d.getFontMetrics().stringWidth(RIGHT_SECOND_WORDS);
  107. // 画文字
  108. g2d.drawString(words, wordStartX, wordStartY);
  109. g2d.drawString(time, timeWidth, wordStartY + 18);
  110. g2d.drawString(RIGHT_FIRST_WORDS, rightFirstWordsWidth, wordStartY + 18);
  111. g2d.drawString(RIGHT_SECOND_WORDS, rightSecondWordsWidth, wordStartY + 36);
  112. g2d.dispose();
  113. outImage.flush();
  114. return outImage;
  115. }
  116. return null;
  117. }
  118. /**
  119. * 设置 Graphics2D 属性 (抗锯齿)
  120. *
  121. * @param g2d Graphics2D提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制
  122. */
  123. private static void setGraphics2D(Graphics2D g2d) {
  124. // 消除画图锯齿
  125. g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  126. // 消除文字锯齿
  127. g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
  128. g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);
  129. Stroke s = new BasicStroke(1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER);
  130. g2d.setStroke(s);
  131. }
  132. /**
  133. * 设置背景为白色
  134. *
  135. * @param g2d Graphics2D提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制
  136. */
  137. private static void setColorWhite(Graphics2D g2d) {
  138. g2d.setColor(Color.WHITE);
  139. //填充整个屏幕
  140. g2d.fillRect(0, 0, 302, 113);
  141. //设置笔刷
  142. g2d.setColor(Color.BLACK);
  143. }
  144. public static void main(String[] args) throws IOException {
  145. BufferedImage image = insertWords(getBarCode("superMan"), "superMan", "2020-09-16");
  146. ImageIO.write(image, "jpg", new File("D:/superMan.png"));
  147. }
  148. }

web接口生成代码如下:

  1. @ApiOperation(value = "条形码图片")
  2. @PostMapping("generateBarCode")
  3. public void generateBarCodeByFnSku(
  4. @RequestParam(value = "superMan") String superMan,
  5. HttpServletResponse response) throws IOException {
  6. BufferedImage image = insertWords(getBarCode(superMan), superMan, DateUtil.getTodayDate("yyyy-MM-dd"));
  7. ServletOutputStream os = response.getOutputStream();
  8. ImageIO.write(image, "PNG", os);
  9. os.flush();
  10. os.close();
  11. }

若还有疑问,欢迎留言讨论!

-—————————————————————————————————————-2020-11-19———————————————————————————————————————————

回复留言中将文字放在条形码上方问题:

其实画这个条形码你可以想象你有一个画板,条形码和文字都是你要画的内容。

现在如果要把文字放在条形码上方就只需要将条形码和文字的位置调整一下就行。代码如下:

  1. public static BufferedImage insertWords(BufferedImage image, String words, String time, Integer type) {
  2. // 新的图片,把带logo的二维码下面加上文字
  3. if (StringUtils.isNotEmpty(words)) {
  4. BufferedImage outImage = new BufferedImage(WIDTH, WORD_HEIGHT, BufferedImage.TYPE_INT_RGB);
  5. Graphics2D g2d = outImage.createGraphics();
  6. // 抗锯齿
  7. setGraphics2D(g2d);
  8. // 设置白色
  9. setColorWhite(g2d, type);
  10. // 画条形码到新的面板
  11. g2d.drawImage(image, 0, 20, image.getWidth(), image.getHeight(), null);
  12. // 画文字到新的面板
  13. Color color = new Color(0, 0, 0);
  14. g2d.setColor(color);
  15. // 字体、字型、字号
  16. g2d.setFont(new Font("微软雅黑", Font.PLAIN, 16));
  17. //文字长度
  18. int strWidth = g2d.getFontMetrics().stringWidth(words);
  19. //总长度减去文字长度的一半 (居中显示)
  20. int wordStartX = (WIDTH - strWidth) / 2;
  21. //height + (outImage.getHeight() - height) / 2 + 12
  22. int wordStartY = HEIGHT + 20;
  23. // time 文字长度
  24. int timeWidth = 1;
  25. // rightFirstWords 文字长度
  26. int rightFirstWordsWidth = WIDTH - g2d.getFontMetrics().stringWidth(RIGHT_FIRST_WORDS);
  27. // rightSecondWords 文字长度
  28. int rightSecondWordsWidth = WIDTH - g2d.getFontMetrics().stringWidth(RIGHT_SECOND_WORDS);
  29. // 画文字
  30. g2d.drawString(words, wordStartX, 15);
  31. g2d.drawString(time, timeWidth, wordStartY + 18);
  32. g2d.drawString(RIGHT_FIRST_WORDS, rightFirstWordsWidth, wordStartY + 18);
  33. g2d.drawString(RIGHT_SECOND_WORDS, rightSecondWordsWidth, wordStartY + 36);
  34. g2d.dispose();
  35. outImage.flush();
  36. return outImage;
  37. }
  38. return null;
  39. }

结果如图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0prY2FvdGFpbg_size_16_color_FFFFFF_t_70

发表评论

表情:
评论列表 (有 0 条评论,110人围观)

还没有评论,来说两句吧...

相关阅读