Java中Barcode4J生成的条形码转Base64无结果,求排查
问题分析与解决:Barcode4J生成Base64空字符串
你遇到的这个问题其实是个常见的顺序错误——用Barcode4J生成条形码时,本地文件输出正常,但转Base64就空,核心原因是输出流的处理顺序搞反了。
先看你代码里的关键问题:你在调用canvas.finish()之前就尝试读取out.toByteArray(),但BitmapCanvasProvider只有在执行finish()方法后,才会把绘制完成的条形码数据真正写入到绑定的输出流中。这时候你提前取字节数组,自然拿不到任何内容。
修正后的代码
public void testNothing() throws FileNotFoundException, UnsupportedEncodingException { Code39Bean bean = new Code39Bean(); int resolution = 150; bean.setModuleWidth(UnitConv.in2mm(1.0f / resolution)); bean.setWideFactor(3); bean.doQuietZone(false); // 用try-with-resources自动管理资源,避免手动关闭的繁琐与错误 try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { BitmapCanvasProvider canvas = new BitmapCanvasProvider( out, "image/x-png", resolution, BufferedImage.TYPE_BYTE_BINARY, false, 0); bean.generateBarcode(canvas, "1234"); // 关键步骤:先完成canvas绘制,确保所有图像数据写入输出流 canvas.finish(); System.out.println("Generating Base64"); String imgString = new String(Base64Encoder.encode(out.toByteArray())); System.out.println("String Generated :" + imgString); } catch (IOException e) { e.printStackTrace(); } }
关键修正点说明
- 调整
canvas.finish()的执行顺序:必须在读取输出流字节数组前调用这个方法,它会触发Canvas把绘制好的条形码数据flush到绑定的ByteArrayOutputStream中。 - 使用try-with-resources简化资源管理:Java 7+的特性可以自动关闭实现
AutoCloseable的资源,避免手动关闭时可能出现的遗漏或顺序错误,代码更简洁可靠。 - 移除冗余的手动close调用:原来代码中多次重复关闭
out的逻辑可以完全被try-with-resources替代,减少出错概率。
这样修改后,你就能得到正常的Base64编码字符串了。
内容的提问来源于stack exchange,提问作者Aniket
相关产品推荐
相关产品推荐

