我有一个像 (01)8638634367382(15)230316(3103)000998(10)45456465604 这样的字符串,我想在 java 中使用 barcode4j lib 将它作为条码 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 当然它必须可以被任何软件扫描。
您提供的示例是括号中的 GS1 应用标识符元素字符串。
除非库为您完成,否则您需要将其转换为 FNC1 在第一个位置的无括号表示,适合直接编码为 Code 128。(正是这个过程将 GS1-128 与普通 Code 128 区分开来。)
您提供的括号中的 AI 元素字符串 —(01)8638634367382(15)230316(3103)000998(10)45456465604 — 未正确解码:
GTIN (01) 8638634367382 <-- Invalid. Too short.
BEST BEFORE or BEST BY (15) 230316
NET WEIGHT (kg) (3103) 000998
BATCH/LOT (10) 45456465604
将 GTIN 替换为有效的 - (01)0101234567890128 - 将允许您以第一种语法对 FNC1 中的数据进行编码,如下所示:
{FNC1}01012345678901281523031631030009981045456465604
根据 barcode4j 文档他们的软件特有的用于编码
{FNC1}
字符的转义序列是文字 0xF1 ASCII 值:
可以使用功能 1 到 4。它们在消息中被编码为 ASCII 字符 0xF1(241)、0xF2(242)、0xF3(243)和 0xF4(244)。
本文中提供了有关 GS1 数据的各种表示的更多详细信息。
GS1 提供条码语法资源,这是一个本地库,具有 Java 绑定,可以处理 GS1 应用程序标识符语法数据。
我最后遇到了同样的问题,在某些方面似乎不是很清楚……经过长时间的分析,我发现除了你之前所说的,如果你想要一个有效的 gs1 代码 128,你必须添加一些控制字符. 例如,在字符串数据的末尾,您必须添加一个控制字符,最后添加一个停止字符。所有这些都由 char ascii 数字打印。顺便说一下,我没有在 Java 中找到一个例程或函数来传递一个字符串(带有 ais 和数据)返回一个已经解析过的字符串,所以我不得不自己做一个(我“复制”了一个用 vb 编码的,所以它是容易)。