Рубрики
Без рубрики

Генерация штрих-кодов и QR-кодов на Java

В Java есть несколько библиотек, которые мы можем использовать для генерации штрих-кодов или QR-кодов. Здесь мы рассмотрим, как их использовать и интегрировать в веб-приложение.

Автор оригинала: Catalin Burcea.

1. Обзор

Штрих-коды используются для визуальной передачи информации. Скорее всего, мы предоставим соответствующее изображение штрих-кода на веб-странице, по электронной почте или в печатном документе.

В этом уроке мы рассмотрим, как генерировать наиболее распространенные типы штрих-кодов в Java.

Во-первых, мы узнаем о внутреннем устройстве нескольких типов штрих-кодов. Далее мы рассмотрим наиболее популярные библиотеки Java для генерации штрих-кодов. Наконец, мы увидим, как интегрировать штрих-коды в наше приложение, обслуживая их из веб-службы с помощью Spring Boot.

2. Типы штрих-кодов

Штрих-коды кодируют такую информацию, как номера продуктов, серийные номера и номера партий. Кроме того, они позволяют таким сторонам, как розничные торговцы, производители и транспортные поставщики, отслеживать активы по всей цепочке поставок.

Мы можем сгруппировать множество различных символов штрих-кодов в две основные категории:

  • линейные штрих-коды
  • 2D штрих-коды

2.1. Коды UPC (Универсальный код продукта)

UPC-коды являются одними из наиболее часто используемых 1D-штрих-кодов, и мы в основном находим их в Соединенных Штатах.

UPC-A-это только цифровой код, содержащий 12 цифр : идентификационный номер производителя (6 цифр), номер изделия (5 цифр) и контрольную цифру. Существует также код UPC-E, который имеет только 8 цифр и используется для небольших пакетов.

2.2. Коды EAN

Коды EAN известны во всем мире как Европейский артикул и Международный артикул . Они предназначены для сканирования торговых точек. Существует также несколько различных вариантов кода EAN, включая EAN-13, EAN-8, JAN-13 и ISBN.

Код EAN-13 является наиболее часто используемым стандартом EAN и аналогичен коду UPC. Он состоит из 13 цифр — ведущего “0”, за которым следует UPC-код.

2.3. Код 128

Штрих-код Code 128-это компактный линейный код высокой плотности, используемый в логистической и транспортной отраслях для заказа и распределения. Он может кодировать все 128 символов ASCII , и его длина является переменной.

2.4. PDF417

PDF417-это сложенный линейный штрих-код, состоящий из нескольких 1D штрих-кодов, уложенных один на другой. Следовательно, он может использовать традиционный линейный сканер.

Мы можем ожидать, что найдем его в различных приложениях, таких как проездные (посадочные талоны), идентификационные карты и управление запасами.

PDF417 использует исправление ошибок Рида-Соломона вместо контрольных цифр. Это исправление ошибок позволяет символу выдержать некоторое повреждение, не вызывая потери данных. Однако он может быть большим по размеру – в 4 раза больше, чем другие 2D-штрих-коды, такие как Datamatrix и QR-коды.

2.5. QR-коды

QR-коды становятся наиболее широко признанными 2D-штрих-кодами во всем мире. Большое преимущество QR-кода заключается в том, что мы можем хранить большие объемы данных в ограниченном пространстве.

Они используют четыре стандартизированных режима кодирования для эффективного хранения данных:

  • числовой
  • буквенно-цифровой
  • байт/двоичный код
  • кандзи

Кроме того, они гибки по размеру и легко сканируются с помощью смартфона. Подобно PDF417, QR-код может выдержать некоторые повреждения, не вызывая потери данных.

3. Библиотеки штрих-кодов

Мы собираемся исследовать несколько библиотек:

  • Барбекю
  • Штрих-код
  • ZXing
  • QRGen

Барбекю -это библиотека Java с открытым исходным кодом, которая поддерживает широкий набор форматов штрих-кодов 1D. Кроме того, штрих-коды могут быть выведены в формате PNG, GIF, JPEG и SVG.

Barcode4j также является библиотекой с открытым исходным кодом. Кроме того, он предлагает форматы 2D – штрих – кодов, такие как DataMatrix и PDF417, и другие форматы вывода. Формат PDF417 доступен в обеих библиотеках. Но, в отличие от Barcode4j, Барбекю считает его линейным штрих-кодом.

ZXing (“пересечение зебры”)-это многоформатная библиотека обработки изображений штрих-кодов с открытым исходным кодом 1D/2D, реализованная на Java, с портами на другие языки. Это основная библиотека , которая поддерживает QR-коды на Java.

Библиотека QRGen предлагает простой API генерации QR-кода, построенный поверх ZXing. Он предоставляет отдельные модули для Java и Android.

4. Генерация Линейных Штрих-Кодов

Давайте создадим генератор изображений штрих-кодов для каждой библиотеки и пары штрих-кодов. Мы получим изображение в формате PNG, но мы также можем использовать другие форматы, такие как GIF или JPEG.

4.1. Использование библиотеки Барбекю

Как мы увидим, барбекю предоставляет простейший API для генерации штрих-кодов. Нам нужно только предоставить текст штрих-кода в качестве минимального ввода. Но мы могли бы дополнительно установить шрифт и разрешение (точки на дюйм). Что касается шрифта, мы можем использовать его для отображения текста штрих-кода под изображением.

Во-первых, нам нужно добавить зависимость Барбекю Maven:


    net.sourceforge.barbecue
    barbecue
    1.5-beta1

Давайте создадим генератор для штрих-кода EAN13:

public static BufferedImage generateEAN13BarcodeImage(String barcodeText) throws Exception {
    Barcode barcode = BarcodeFactory.createEAN13(barcodeText);
    barcode.setFont(BARCODE_TEXT_FONT);

    return BarcodeImageHandler.getImage(barcode);
}

Мы можем генерировать изображения для остальных типов линейных штрих-кодов аналогичным образом.

Следует отметить, что нам не нужно указывать цифру контрольной суммы для штрих-кодов EAN/UPC, так как она автоматически добавляется библиотекой.

4.2. Использование библиотеки штрих-кодов

Давайте начнем с добавления зависимости Barcode Maven:


    net.sf.barcode4j
    barcode4j
    2.1

Аналогично, давайте построим генератор для штрих-кода EAN13:

public static BufferedImage generateEAN13BarcodeImage(String barcodeText) {
    EAN13Bean barcodeGenerator = new EAN13Bean();
    BitmapCanvasProvider canvas = 
      new BitmapCanvasProvider(160, BufferedImage.TYPE_BYTE_BINARY, false, 0);

    barcodeGenerator.generateBarcode(canvas, barcodeText);
    return canvas.getBufferedImage();
}

Конструктор BitmapCanvasProvider принимает несколько параметров: разрешение, тип изображения, включение сглаживания и ориентация изображения. Кроме того, нам не нужно устанавливать шрифт, потому что текст под изображением отображается по умолчанию .

4.3. Использование библиотеки ZXing

Здесь нам нужно добавить две зависимости Maven: библиотеку core image/| и клиент Java :


    com.google.zxing
    core
    3.3.0


    com.google.zxing
    javase
    3.3.0

Давайте создадим генератор EAN13:

public static BufferedImage generateEAN13BarcodeImage(String barcodeText) throws Exception {
    EAN13Writer barcodeWriter = new EAN13Writer();
    BitMatrix bitMatrix = barcodeWriter.encode(barcodeText, BarcodeFormat.EAN_13, 300, 150);

    return MatrixToImageWriter.toBufferedImage(bitMatrix);
}

Здесь нам нужно указать несколько параметров в качестве входных данных, таких как текст штрих-кода, формат штрих-кода и размеры штрих-кода. В отличие от двух других библиотек, мы также должны добавить цифру контрольной суммы для штрих-кодов EAN. Но для штрих-кодов UPC-A контрольная сумма необязательна.

Кроме того, эта библиотека не будет отображать текст штрих – кода под изображением.

5. Генерация 2D Штрих-Кодов

5.1. Использование библиотеки ZXing

Мы собираемся использовать эту библиотеку для создания QR-кода. API аналогичен API линейных штрих-кодов:

public static BufferedImage generateQRCodeImage(String barcodeText) throws Exception {
    QRCodeWriter barcodeWriter = new QRCodeWriter();
    BitMatrix bitMatrix = 
      barcodeWriter.encode(barcodeText, BarcodeFormat.QR_CODE, 200, 200);

    return MatrixToImageWriter.toBufferedImage(bitMatrix);
}

5.2. Использование библиотеки QRGen

Библиотека больше не развернута в Maven Central, но мы можем найти ее на jitpack.io .

Во-первых, нам нужно добавить репозиторий jetpack и зависимость QRGen в ваш pom.xml:


    
        jitpack.io
        https://jitpack.io
    



    
        com.github.kenglxn.qrgen
        javase
        2.6.0
    

Давайте создадим метод, который генерирует QR-код:

public static BufferedImage generateQRCodeImage(String barcodeText) throws Exception {
    ByteArrayOutputStream stream = QRCode
      .from(barcodeText)
      .withSize(250, 250)
      .stream();
    ByteArrayInputStream bis = new ByteArrayInputStream(stream.toByteArray());

    return ImageIO.read(bis);
}

Как мы видим, API основан на шаблоне Builder и обеспечивает два типа вывода: File и OutputStream . Мы можем использовать библиотеку ImageIO , чтобы преобразовать ее в BufferedImage .

6. Создание службы ОТДЫХА

Теперь у нас есть выбор библиотеки штрих-кодов для использования, давайте рассмотрим, как обслуживать штрих-коды из веб-службы Spring Boot.

Мы начнем с RestController :

@RestController
@RequestMapping("/barcodes")
public class BarcodesController {

    @GetMapping(value = "/barbecue/ean13/{barcode}", produces = MediaType.IMAGE_PNG_VALUE)
    public ResponseEntity barbecueEAN13Barcode(@PathVariable("barcode") String barcode)
    throws Exception {
        return okResponse(BarbecueBarcodeGenerator.generateEAN13BarcodeImage(barcode));
    }
    //...
}

Кроме того, нам нужно вручную зарегистрировать конвертер сообщений для HTTP-ответов BufferedImage , потому что по умолчанию нет:

@Bean
public HttpMessageConverter createImageHttpMessageConverter() {
    return new BufferedImageHttpMessageConverter();
}

Наконец, мы можем использовать почтальона или браузер для просмотра сгенерированных штрих-кодов.

6.1. Генерация штрих-кода UPC-A

Давайте вызовем UPC-веб-сервис, использующий библиотеку барбекю:

[GET] http://localhost:8080/barcodes/barbecue/upca/12345678901

Вот результат:

6.2. Создание штрих-кода EAN13

Аналогично, мы собираемся вызвать веб-службу EAN13:

[GET] http://localhost:8080/barcodes/barbecue/ean13/012345678901

А вот наш штрих-код:

6.3. Генерация штрих-кода Code128

В этом случае мы будем использовать метод POST. Давайте вызовем веб-службу Code 128, используя библиотеку барбекю:

[POST] http://localhost:8080/barcodes/barbecue/code128

Мы предоставим тело запроса, содержащее данные:

Lorem ipsum dolor sit amet, consectetur adipiscing elit,
 sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Давайте посмотрим на результат:

6.4. Создание штрих-кода PDF417

Здесь мы собираемся вызвать веб-службу PDF417, которая похожа на код 128:

[POST] http://localhost:8080/barcodes/barbecue/pdf417

Мы предоставим тело запроса, содержащее данные:

Lorem ipsum dolor sit amet, consectetur adipiscing elit,
 sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

И вот полученный штрих-код:

6.5. Создание штрих-кода QR-кода

Давайте вызовем веб-сервис QR-кода с помощью библиотеки ZXing:

[POST] http://localhost:8080/barcodes/zxing/qrcode

Мы предоставим тело запроса, содержащее данные:

Lorem ipsum dolor sit amet, consectetur adipiscing elit,
 sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
 quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Вот наш QR-код:

Здесь мы видим силу QR-кодов для хранения больших объемов данных в ограниченном пространстве.

7. Заключение

В этой статье мы узнали, как генерировать наиболее распространенные типы штрих-кодов в Java.

Во-первых, мы изучили форматы нескольких типов линейных и 2D штрих-кодов. Затем мы изучили самые популярные библиотеки Java для их создания. Хотя мы попробовали несколько простых примеров, мы можем изучить библиотеки дальше для более индивидуальных реализаций.

Наконец, мы увидели, как интегрировать генераторы штрих-кодов в службу REST и как их протестировать.

Как всегда, пример кода из этого учебника доступен на GitHub .