2015-11-04 2 views
1

Я получаю DataMatrix код, используя следующую строку:Как обращаться с FNC1/<GS> при кодировании GS1-совместимого кода 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}));

Поскольку в противном случае я просто получить "FNC1910005FNC1230202 [...]" закодированы в DataMatrix, а что Я хочу, конечно, <GS> вместо текста «FNC1».

Однако при замене FNC1 с <GS> (я попытался с помощью '\ u001c', а), я получаю это очень странный двойной DM-код вместо нормального:

Strange-double-data-matrix

Только если я пропущу замену «FNC1» на <GS>, я получу правильный.

Любая идея, как получить правильный код DataMatrix на основе моей <GS> -содержащей строки? Или я просто делаю что-то неправильно, имея <GS> непосредственно в String? Что я должен сделать в этом случае, чтобы заставить 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 до размера я хочу, но это ZXing, что дает неправильный выход с самого начала.)

ответ

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 генерирует свои штрих-коды, я смутил это вместе из класса проекта 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 
} 
Смежные вопросы