我有一个字符串,如(01)8638634367382(15)230316(3103)000998(10)45456465604,我想使用java中的barcode4j库将其作为条形码png。
// Create the barcode bean
Code128Bean barcode = new Code128Bean();
// Configure the barcode generator
final int dpi = 400;
barcode.setModuleWidth(0.2);
barcode.doQuietZone(false);
int codeset = Code128Constants.CODESET_C;
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (!Character.isDigit(c)) {
codeset = Code128Constants.CODESET_B;
break;
}
}
barcode.setCodeset(codeset);
// Generate the barcode bitmap
BitmapCanvasProvider canvas = new BitmapCanvasProvider(dpi, BufferedImage.TYPE_BYTE_BINARY, false, 0);
barcode.generateBarcode(canvas, input);
try {
canvas.finish();
} catch (IOException e) {
throw new RuntimeException("Error generating barcode", e);
}
// Encode the bitmap as a base64 string
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
ImageIO.write(canvas.getBufferedImage(), "png", outputStream);
} catch (IOException e) {
throw new RuntimeException("Error encoding barcode as PNG", e);
}
byte[] barcodeBytes = outputStream.toByteArray();
String base64Barcode = Base64.getEncoder().encodeToString(barcodeBytes);
return base64Barcode;
但是生成的条形码不能被任何条形码扫描软件识别,我也把图像编码成base64字符串,当我想在程序的任何部分显示时,我解码它并显示图像,你知道这有什么问题吗?
我希望生成此格式的可读条形码(01)8638634367382(15)230316(3103)000998(10)45456465604,当然它必须可以通过任何软件扫描。
1条答案
按热度按时间jrcvhitl1#
您提供的示例是一个用括号表示的GS1应用程序标识符元素字符串。
除非库为您完成,否则您需要将其转换为无括号的表示形式,FNC 1位于第一位,适合直接编码为Code 128。(正是这个过程将GS1-128与普通Code 128区分开来。)
有关GS1数据的各种表示的更多详细信息,请参见this article。
GS1提供Barcode Syntax Resource,这是一个本地库,具有Java绑定,可以处理GS1应用程序标识符语法数据。