65.9K
CodeProject 正在变化。 阅读更多。
Home

构建 Java 条形码应用:命令行、GUI 和 Web

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2020年3月19日

CPOL

4分钟阅读

viewsIcon

6531

本文旨在帮助 Java 开发人员将 Java 条形码 SDK 集成到不同的 Java 应用程序中。

在过去的 20 年里,尽管涌现了许多新的编程语言,Java 一直排名前三。为什么 Java 尽管已经很古老了,仍然如此受欢迎?Java 不仅广泛用于企业和云应用程序,它还是开发 Android 应用的主要编程语言。本文旨在帮助 Java 开发人员将 Java 条形码 SDK 集成到不同的 Java 应用程序中。

概述

在 21 世纪,条形码无处不在。条形码技术在医疗保健、保险、零售、物流、银行、教育等各种行业都有需求。有大量的条形码符号,并且每天每秒都需要处理条形码图像。需求巨大,因此许多企业开始将条形码解码功能引入其系统。最常争论的问题之一是我们应该使用免费还是商业条形码库。在接下来的段落中,您将看到如何在 Java 条形码应用程序中使用 ZXing(免费)或 Dynamsoft Barcode Reader(商业)。如果您对其他 Java 条形码 SDK 感兴趣,可以根据源代码轻松替换解码部分来测试其他 SDK。

ZXing 和 Dynamsoft Barcode Reader 之间的区别

让我们暂时搁置免费和商业 SDK 的话题,专注于 ZXing 和 Dynamsoft Barcode Reader 在 SDK 实现、符号、解码方法和内存使用方面的比较。

SDK 实现

开源项目 ZXing 是一个用 Java 编写的条形码扫描库。

Dynamsoft Barcode Reader 是一个用 C/C++ 编写的企业级条形码 SDK。Dynamsoft Barcode Reader 的 Java API 是基于 JNI(Java Native Interface)封装的。

符号

ZXing 支持的符号包括 UPC-A、UPC-E、EAN-8、EAN-13、UPC/EAN 扩展 2/5、Code 39、Code 93、Code 128、Codabar、ITF、QR Code、Data Matrix、Aztec、PDF 417、MaxiCode、RSS-14 和 RSS-Expanded。

Dynamsoft Barcode Reader 支持的符号包括 UPC-A、UPC-E、EAN-8、EAN-13、Industrial 2 of 5、Interleaved 2 of 5、Code 11、Codabar、Code 39、Code 93、Code 128、QR Code、PDF417、DataMatrix、MaxiCode、Aztec Code、DataBar、GS1 Composite Code、USPS Intelligent Mail、Postnet、Planet、Australian Post 和 UK Royal Mail。

解码方法

ZXing 只提供从图像缓冲区解码条形码的方法,因为它不包含任何图像编解码器。

Dynamsoft Barcode SDK 包含图像编解码器,可以带来更好的用户体验。它支持从图像文件(BMP、JPEG、PNG、Gif、TIFF 和 PDF)、文件流和图像缓冲区解码条形码。

内存使用

ZXing 是用 Java 编写的,因此 ZXing 的图像缓冲区的内存是在 JVM 堆中分配的。默认情况下,JVM 堆大小是有限的,这意味着如果处理的图像尺寸过大且垃圾回收未及时触发,很容易耗尽堆内存并意外导致应用程序崩溃。

与 ZXing 相比,在使用 Dynamsoft Barcode Reader 时,您无需担心内存使用问题,因为它在 C/C++ 中分配内存并进行图像处理。

桌面端 Java 条形码阅读器应用

在桌面操作系统上,我们可以使用 Java 创建不同类型的应用程序。这里我们有一张图片用于测试 SDK 性能。

配置 ZXing 和 Dynamsoft Barcode Reader 的 Maven 依赖项

<repositories>
        <repository>
            <id>dbr</id>
            <url>https://download.dynamsoft.com/maven/dbr/jar</url>
        </repository>
    </repositories>
<dependencies>
        <dependency>
            <groupId>com.dynamsoft</groupId>
            <artifactId>dbr</artifactId>
            <version>7.3</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.4.0</version>
          </dependency>
</dependencies>

要激活 Dynamsoft Barcode Reader,请从 在线门户申请免费的 **试用许可证**。

命令行应用程序

  1. 创建一个新的 Maven 项目
mvn archetype:generate -DgroupId=com.java.barcode -DartifactId=app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
  1. 导入 ZXing 和 Dynamsoft Barcode Reader
import com.dynamsoft.barcode.*;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.RGBLuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.multi.*;
  1. 使用 ImageIOBufferedImage 解码图像文件
import java.awt.image.*;
import javax.imageio.ImageIO;
BufferedImage image = null;
        try {
            image = ImageIO.read(new File(filename));
        } catch (IOException e) {
            System.out.println(e);
            return;
        }
  1. 启用多条形码支持

测试图像包含多个条形码。要读取编码不同条形码符号的多个条形码,我们需要使用 MultiFormatReaderGenericMultipleBarcodeReader

  1. 调用解码方法

ZXing 不方便之处在于我们必须先将 BufferedImage 转换为 BinaryBitmap

BinaryBitmap bitmap = null;
int[] pixels = image.getRGB(0, 0, image.getWidth(), image.getHeight(), null, 0, image.getWidth());
RGBLuminanceSource source = new RGBLuminanceSource(image.getWidth(), image.getHeight(), pixels);
bitmap = new BinaryBitmap(new HybridBinarizer(source));
            
MultiFormatReader reader = new MultiFormatReader();  
GenericMultipleBarcodeReader multiReader = new GenericMultipleBarcodeReader(reader);
        try {
            Result[] zxingResults = multiReader.decodeMultiple(bitmap);
        } catch (NotFoundException e) {
            e.printStackTrace();
        }
        pixels = null;
        bitmap = null;

调用 Dynamsoft Barcode Reader 方法要简单得多,因为它支持将 BufferedImage 作为输入参数。

BarcodeReader br = null;
        try {
            br = new BarcodeReader("LICENSE-KEY");
        } catch (Exception e) {
            System.out.println(e);
            return;
        }
        
        TextResult[] results = null;
        try {
            results = br.decodeBufferedImage(image, "");
        } catch (Exception e) {
            System.out.println("decode buffered image: " + e);
        }
  1. 为了方便运行 Java 程序,我们可以将所有依赖项打包到一个 jar 文件中。在 pom.xml 中添加 maven-assembly-plugin
<build>
    <plugins>
      <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <configuration>
              <descriptorRefs>
                  <descriptorRef>jar-with-dependencies</descriptorRef>
              </descriptorRefs>
          </configuration>
      </plugin>
    </plugins>
  </build>

构建 Maven 项目

mvn clean install assembly:assembly -Dmaven.test.skip=true

如下运行 Java 条形码程序

java -cp target/command-line-1.0-SNAPSHOT-jar-with-dependencies.jar 
com.java.barcode.App ..\images\AllSupportedBarcodeTypes.png
  1. 检查条形码解码结果。

GUI 应用程序

基于上面创建的命令行 Java 条形码程序,我们可以添加 Swing 类将命令行应用程序修改为 GUI 应用程序。

这是相关类

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JComboBox;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.filechooser.FileNameExtensionFilter;

import java.awt.BorderLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

我们需要的控件包括 JTextAreaJButtonJFileChooserJComboBox

  • JTextArea:显示结果。
  • JButton:触发点击事件。
  • JFileChooser:从磁盘驱动器选择图像文件。
  • JComboBox:切换 ZXing 和 Dynamsoft Barcode Reader。

使用所有控件初始化布局

public App() {
        super(new BorderLayout());
        
        mFileChooser = new JFileChooser();
        FileNameExtensionFilter filter = new FileNameExtensionFilter(
                ".png", "png");
        mFileChooser.setFileFilter(filter);
        mLoad = new JButton("Load File");
        mLoad.addActionListener(this);
        
        mSourceList = new JComboBox(new String[]{"ZXing", "Dynamsoft"});
        mSourceList.setSelectedIndex(0);
        
        JPanel buttonPanel = new JPanel(); 
        buttonPanel.add(mSourceList);
        buttonPanel.add(mLoad);
        add(buttonPanel, BorderLayout.PAGE_START);
        
        mTextArea = new JTextArea();
        mTextArea.setSize(480, 480);
        JScrollPane sp = new JScrollPane(mTextArea); 
        add(sp, BorderLayout.CENTER);
    }

通过单击按钮选择图像并解码条形码

public void actionPerformed(ActionEvent e) {

        int returnVal = mFileChooser.showOpenDialog(App.this);
 
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File file = mFileChooser.getSelectedFile();     
            String filename = file.toPath().toString();          
            if (mSourceList.getSelectedItem().toString().equals("Dynamsoft")) {
                TextResult[] results = decodefileDynamsoft(filename);
            }
            else {
                Result[] results = decodefileZXing(filename);
            }
        } 
    }

构建并运行 GUI 应用

mvn clean install assembly:assembly -Dmaven.test.skip=true
java -cp target/gui-1.0-SNAPSHOT-jar-with-dependencies.jar com.java.barcode.App

Web 应用程序

Spring Boot 用于创建 Web 应用程序。我们可以遵循官方的 教程 来入门一个简单的 Web 应用程序。

为了快速测试服务器端 Java 条形码 API,我们可以通过添加以下依赖项将 swagger-ui 集成到 Spring Boot 应用程序中。

        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-core</artifactId>
            <version>1.1.45</version>
            <exclusions>
                <exclusion>
                    <groupId>io.github.classgraph</groupId>
                    <artifactId>classgraph</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-ui</artifactId>
            <version>1.1.45</version>
        </dependency>

创建一个包含 ZXing 和 Dynamsoft Barcode Reader 的 POST 映射的控制器。

@RestController
public class BarcodeController {

    private DynamsoftBarcode mDynamsoftBarcode;
    private ZXingBarcode mZXingBarcode;

    @Autowired
    public BarcodeController(DynamsoftBarcode dynamsoft, ZXingBarcode zxing) {
        mDynamsoftBarcode = dynamsoft;
        mZXingBarcode = zxing;
    }

    @PostMapping(value = "/api/dynamsoft"
            , consumes = MediaType.MULTIPART_FORM_DATA_VALUE
            , produces = MediaType.APPLICATION_JSON_VALUE)
    public BarcodeResponse getDynamsoft(@RequestPart MultipartFile file) throws Exception {
        return mDynamsoftBarcode.decode(file.getOriginalFilename(), file.getInputStream());
    }

    @PostMapping(value = "/api/zxing"
            , consumes = MediaType.MULTIPART_FORM_DATA_VALUE
            , produces = MediaType.APPLICATION_JSON_VALUE)
    public BarcodeResponse getZXing(@RequestPart MultipartFile file) throws Exception {
        return mZXingBarcode.decode(file.getOriginalFilename(), file.getInputStream());
    }
}

构建并运行 Java 条形码 Web 应用程序

mvn clean install
java -jar target/web-1.0-SNAPSHOT.jar

访问 https://:8080/swagger-ui.html,通过 POST 事件测试 ZXing 和 Dynamsoft Barcode Reader。

Android 开发怎么样?

在开发移动应用程序时,我们使用 Gradle 而不是 Maven 来添加依赖项。

allprojects {
    repositories {
        google()
        jcenter()
        maven {
            url "http://download.dynamsoft.com/maven/dbr/aar"
        }
    }
}
implementation 'com.google.zxing:core:3.4.0'
implementation 'com.dynamsoft:dynamsoftbarcodereader:7.3.0'

源代码

https://github.com/yushulx/java-barcode-command-gui-web

技术支持

如果您对 Dynamsoft Barcode Reader SDK 有任何疑问,请随时 联系我们

© . All rights reserved.