我使用以下行获取DataMatrix代码:
BitMatrix bitMatrix = new DataMatrixWriter().encode(dmie.preEncodeBarcode(dataToEncode), BarcodeFormat.DATA_MATRIX, 50, 50, null);
我得到的输入字符串包含“FNC1”(就像字符串中的普通字符一样)以标记动态字段的结尾,总共字符串有4个不同的GS1 DataMatrix应用程序标识符及其各自的值。
preEncodeBarcode()的作用是将“FNC1”替换为<GS>
,如下所示:
input = input.replaceAll("FNC1", new String(new byte[] {0x1d}));
因为否则我只是在DataMatrix中编码“FNC1910005FNC1230202 [...]”,而我想要的当然是<GS>
而不是文本“FNC1”。
然而,当用<GS>
替换FNC1时(我也试过使用'\ u001c'),我得到了这个非常奇怪的双DM代码而不是正常代码:
只有当我跳过用<GS>
替换“FNC1”时才能得到合适的。
知道如何根据我的<GS>
- 包含String来获取正确的DataMatrix代码吗?或者我只是直接在String中使用<GS>
做错了什么?在这种情况下,我该怎么办才能让zxing给我一个正确的DataMatrix?我一直在读书,但我真的无法理解这一点。
更新:我不确定,但我可能会遇到一些奇怪的错误。这是我在预处理输入字符串(空格)后发送到DataMatrixWriter的内容:
[d29100001 21000000049347037 24000163718 390300000002990
我觉得相当模糊的是,如果我(在撰写本文时)发送input.substring(2, input.length());
或input.substring(0, input.length()-3);
,那么它可以正常工作,而如果我只删除一个(或更少)字符从最后开始或者2或更少,然后我得到这个奇怪的DataMatrix。更奇怪的是,这种行为甚至不一致 - 如果我在最后添加6个随机数字然后它工作正常,但如果我然后删除其中的三个数字然后我再次得到问题。最糟糕的是,一小时前我无法发送input.substring(0, input.length()-3)
,但现在我可以。
换句话说,我完全感到困惑。
(PS。我使用找到的代码here将DataMatrix缩放到我想要的大小,但是从一开始就提供了错误的输出。)
答案 0 :(得分:0)
感谢Lachezar Dobrev over at the zxing Google group我能够按预期工作。事实证明,您可以将EncodeHintType移交给DataMatrixWriter,这会强制它应用方形。
这对我有用:
HashMap hintMap = new HashMap();
hintMap.put(EncodeHintType.DATA_MATRIX_SHAPE, SymbolShapeHint.FORCE_SQUARE);
BitMatrix bitMatrix = new DataMatrixWriter().encode(input, BarcodeFormat.DATA_MATRIX, 50, 50, hintMap);
一周之后更新:事实证明,无论你给出什么输入,zxing都不是GS1兼容的,所以整个FNC1 /问题除此之外。相反,我建议使用Okapi Barcode,它可以完美运行。
我没有找到任何指南或教程,但根据Okapi Java GUI如何生成条形码,我在项目的Make Barcode
课程中一起困惑。
DataMatrix dataMatrix = new DataMatrix();
dataMatrix.setDataType(Symbol.DataType.GS1);
dataMatrix.setReaderInit();
dataMatrix.setPreferredSize(24); //144x144
dataMatrix.forceSquare(true);
dataMatrix.setContent(dataToEncode);
BufferedImage image = new BufferedImage((dataMatrix.getWidth() * magnification) + (2 * borderSize),
(dataMatrix.getHeight() * magnification) + (2 * borderSize), BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, (dataMatrix.getWidth() * magnification) + (2 * borderSize),
(dataMatrix.getHeight() * magnification) + (2 * borderSize));
Java2DRenderer renderer = new Java2DRenderer(g2d, magnification, borderSize, Color.WHITE, Color.BLACK);
renderer.render(dataMatrix);
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "png", baos);
//Before Base64-encoding the image and return as a String
Base64.Encoder encoder = Base64.getEncoder();
return encoder.encodeToString(baos.toByteArray());
} catch (IOException e) {
//Do some logging
return "Something went wrong";//Return super-informative error message
}