我遇到内容相同但原始字节不同的两个条形码之间的差异。一个条形码是使用名为 Labelary 的在线工具生成的,该工具专为创建 ZPL 标签而设计,另一个条形码是使用 ZXing 库在我的 Java 代码中生成的。尽管内容相同,但条形码的视觉外观有所不同。
原始文本: 12345678
原始字节: 69 0c 22 38 4e 2f 6a
BarcodeGenerator.java
public byte[] getBarCode128(String data, int width, int height) {
Code128Writer writer = new Code128Writer();
BitMatrix matrix = writer.encode(data, BarcodeFormat.CODE_128, width, height);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
MatrixToImageWriter.writeToStream(matrix, "png", outputStream);
return outputStream.toByteArray();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
Main.java
public static void main(String[] args) {
String data = "12345678";
int width = (int) (data.length() * 11 * moduleWidth);
int height = 270;
BarcodeGenerator barcode = new BarcodeGenerator();
byte[] barcodeImageBytes = barcode.getBarCode128(data, (int) width, (int) height);
}
Run Code Online (Sandbox Code Playgroud)
单击此处查看源代码。
原始文本: 12345678
原始字节: 68 11 12 13 14 15 16 17 18 3c 6a
造成这种差异的潜在原因是什么?如何确保使用 Java 中的 ZXing 库正确生成条形码?
两者都是正确的,只是编码不同。一种69是代码 C,每个代码点有两位数字。较长的68一个是代码 B。
另请参阅: https: //en.wikipedia.org/wiki/Code_128
如果您想强制您的代码也执行较长的代码 B,您可以将FORCE_CODE_SET编码提示设置为“B”。
对编码提示的疯狂猜测:
Map<EncodeHintType, String> hints = new HashMap<>();
hints.put(EncodeHintType.FORCE_CODE_SET, "B");
BitMatrix matrix = writer.encode(data, BarcodeFormat.CODE_128, width, height, hints);
Run Code Online (Sandbox Code Playgroud)