构建 Java 条形码应用:命令行、GUI 和 Web
本文旨在帮助 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,请从 在线门户申请免费的 **试用许可证**。
命令行应用程序
- 创建一个新的 Maven 项目
mvn archetype:generate -DgroupId=com.java.barcode -DartifactId=app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
- 导入 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.*;
- 使用
ImageIO
和BufferedImage
解码图像文件
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; }
- 启用多条形码支持
测试图像包含多个条形码。要读取编码不同条形码符号的多个条形码,我们需要使用 MultiFormatReader
和 GenericMultipleBarcodeReader
。
- 调用解码方法
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); }
- 为了方便运行 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
- 检查条形码解码结果。
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;
我们需要的控件包括 JTextArea
、JButton
、JFileChooser
和 JComboBox
。
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 有任何疑问,请随时 联系我们。