DEV Community

Kirsten
Kirsten

Posted on • Edited on

[2025] The best barcode scanners for your app

Businesses are moving from dedicated scanner hardware to more flexible software solutions. Modern apps can now easily scan barcodes using camera APIs and scanning libraries, eliminating the need for expensive hardware scanners.

This article compares 3 free/open-source libraries and 3 commercial SDKs. We'll cover platform support, barcode types, performance, and pricing to help you choose the right barcode scanning solution for your project.

Open-Source and Free Software

In 2024, GitHub logged over five billion contributions across more than 500 million open source projects. Open source is hotter than ever, and for good reason: The source code is publicly available, enabling anyone to use, modify, and distribute open source libraries and apps freely.

For barcode scanning specifically, here are 3 popular free options (also including one that is proprietary, but free of charge).

ZXing (“zebra crossing”) is a mature, Apache 2.0 licensed barcode scanning library. It was originally developed in Java, but has since been ported to many languages and frameworks. Note that ZXing is currently in maintenance mode – it receives occasional bug fixes but no major new features.

The ML Kit Barcode Scanner API is part of Google’s ML Kit SDK. It is free, but not open source. The API is available for iOS and Android, and there is an official plugin for Flutter. ML Kit runs entirely on-device.

QuaggaJS (and its actively maintained fork, Quagga2) is an open-source JavaScript library for real-time barcode scanning in the browser. As it uses modern web APIs, it does not require any native plugins or extensions.

Supported Frameworks

Platform compatibility is one of the first factors to consider when choosing a solution.

ZXing has broad ecosystem coverage through ports and wrappers. You’ll find options for Android, iOS, .NET, and JavaScript. Community-created bindings also exist for Flutter, React Native, MAUI, and languages like Python and Rust.

The ML Kit Barcode Scanner API is officially available on Android and iOS only, with a first-party plugin for Flutter. Community wrappers exist for other cross-platform frameworks such as React Native, Xamarin, or Capacitor.

QuaggaJS runs on all modern browsers (Chrome, Firefox, Safari, Edge, and their mobile versions, but not Internet Explorer 11). Because it’s pure JavaScript, it also works inside hybrid app frameworks like Cordova, Ionic, or Capacitor.

Platform / Framework ZXing ML Kit Barcode Scanner API QuaggaJS
NATIVE / SERVER-BASED
Android zxing ML Kit Android
iOS zxingify-objc ML Kit iOS
Web/JavaScript zxing-js quagga2
Windows ZXing.Net
CROSS-PLATFORM
React Native react-native-barcode-z-xing react-native-ml-kit
Flutter flutter_zxing ML Kit Flutter plugin
.NET MAUI ZXing.Net.MAUI
Cordova cordova-plugin-zxing cordova-plugin-mlkit-barcode-scanner ✅ (hybrid apps)
Xamarin ZXing.Net.Mobile Xamarin.Google.MLKit.BarcodeScanning ✅ (hybrid apps)
Capacitor capacitor-mlkit/barcode-scanning ✅ (hybrid apps)

Supported Barcode Types

Different use cases require different barcode formats. Here's what each library can decode:

  • ZXing offers the most comprehensive coverage, supporting virtually all common 1D and 2D barcode formats, plus specialized ones like MaxiCode and GS1 DataBar variants.

  • ML Kit covers all major retail and consumer barcode types.

  • QuaggaJS scans common 1D barcodes only.

Symbology ZXing ML Kit Barcode Scanner API QuaggaJS
EAN-13
EAN-8
UPC-A
UPC-E
UPC/EAN Extension 2/5
Code 128
Code 39
Code 93
Code 32
Codabar
ITF
QR Code
DataMatrix
PDF417
MaxiCode
Aztec
GS1 DataBar (RSS-14)
GS1 DataBar Expanded (RSS-Expanded)
MSI Plessey

Beyond basic decoding, some libraries offer built-in parsing for structured data.

ML Kit has built-in parsers for common QR code payloads: URLs, Wi-Fi credentials, contact cards (vCard), calendar events, email addresses, phone numbers, and geo coordinates.

ZXing provides similar result parsers. However, these are utility classes within the project rather than a documented public API.

QuaggaJS returns only raw barcode strings. You'll need to implement your own parsing logic for structured data.

Performance

Scanning speed and accuracy can vary significantly based on device capabilities and scanning conditions. The chosen library, however, also has an impact.

ZXing provides reliable decoding on a broad range of platforms. However, performance varies noticeably by device. It can feel slower on lower-end hardware and struggles with poorly lit, very small, or damaged codes. Since you control the camera pipeline, however, you can optimize performance by configuring scan regions of interest (ROI) and tuning autofocus settings.

ML Kit generally outperforms ZXing in speed. However, you may get inconsistent results with dense formats like PDF417, as well as with EAN-13. As it uses a closed-source model, you can’t change the internals, but you can tune performance by only enabling the barcode formats you need and choosing recommended camera resolutions (e.g., 720p/1080p).

QuaggaJS performs well for 1D barcodes in the browser, but is heavily dependent on device power, camera quality, and scanning conditions. It struggles with low light, motion blur, angled barcodes, and damaged codes. Community feedback suggests it can be slower and less reliable than native alternatives.

Customizability

Customization can happen on two levels: the scanning logic under the hood, and the look and feel of the scanner UI.

ZXing is highly customizable since it only provides decoding logic. Since you have to implement your own camera pipeline and UI anyway, you have complete control over the interface, scan regions, and autofocus behavior. You can also modify the decoding pipeline, add barcode formats, or patch algorithms, though this requires forking the project.

ML Kit follows a plug-and-play approach with less flexibility. The machine learning model is proprietary and cannot be modified. Likewise, Google's ready-to-use scanner UI offers few configuration options. However, you can instead build a custom interface by feeding camera frames directly to the API.

QuaggaJS is written in plain JavaScript, making it easy to modify. It provides no built-in UI, so you control the video and canvas elements directly. The scanning pipeline can be configured (ROI, frequency, locator settings) or modified by editing the open-source code.

Support

ZXing is currently in maintenance mode. While it no longer receives major feature updates, it has a large and active user community on GitHub and Stack Overflow, where most common questions and issues are already addressed. However, there is no official support channel.

ML Kit, maintained by Google, continues to receive regular updates to ensure compatibility with the latest Android and iOS versions. Google provides documentation, guides, and codelabs. However, there is no formal support, so developers usually turn to community forums such as Stack Overflow.

QuaggaJS has a smaller community than ZXing or ML Kit. Developers can request help through GitHub issues and Stack Overflow. Response times vary, though, as the number of contributors is limited.

Commercial Solutions

In enterprise applications, the unreliable support for open-source solutions is a real risk. Commercial SDKs, in contrast, offer professional support and regular updates. Additionally, their performance is generally better across devices, and they offer more features for specific use cases.

In the following, we’ll take a look at the 3 most established barcode scanning software providers: Scandit, Scanbot SDK, and Dynamsoft.

Scandit delivers high-performance barcode scanning, optimized for retail and logistics environments. The company also offers ID scanning software.

Scanbot SDK is an all-in-one provider of data capture solutions. Its SDKs provide fast, reliable barcode scanning, document scanning, and data extraction from structured documents such as MRZs, credit cards, and checks.

Dynamsoft is focused on industrial applications. It provides robust scanning for desktop and server-side image processing, and places less emphasis on mobile environments.

Supported Frameworks

Commercial SDKs differ from free libraries in that they provide dedicated, optimized integrations for a range of platforms and frameworks. This removes the need for community-maintained ports or wrappers and ensures consistent performance across platforms.

Scandit, Scanbot SDK, and Dynamsoft all support the most common native and cross-platform environments.
Below is a breakdown:

Platform / Framework Scandit Scanbot SDK Dynamsoft
NATIVE / SERVER-BASED
Android
iOS
Web/JavaScript
Windows
macOS
Linux
CROSS-PLATFORM
React Native
Flutter
.NET MAUI
Cordova
Xamarin
Capacitor
Compose Multiplatform
Titanium

Supported Barcode Types

All three SDKs cover all common 1D and 2D barcode symbologies, including the standard retail and logistics codes. Scandit and Dynamsoft also support certain niche types such as DotCode, while Scanbot SDK offers the broadest set of data parsers.

Symbology Scandit Scanbot SDK Dynamsoft
1D CODES
EAN-13
EAN-8
UPC-E
UPC-A
UPC/EAN Extension 2/5
Code 128
Code 39
Code 93
Code 32
Codabar
ITF
MSI Plessey
4-State Customer Code
2D CODES
QR Code
DataMatrix
PDF417
MaxiCode
Aztec
GS1 DataBar (RSS-14)
GS1 DataBar Expanded (RSS-Expanded)
DotCode
DATA PARSERS
GS1
HIBC
Swiss QR
vCard
SEPA QR
VIN
AAMVA
AADHAAR

Performance and Features

All three SDKs are built for real-world conditions, reliably scanning barcodes that are blurry, low-contrast, poorly printed, scratched, dirty, or partially damaged. They also include speed and accuracy optimizations such as restricting active symbologies and limiting the scan region.

Additionally, these SDKs offer a number of convenience and usability features. These include advanced user guidance and AR overlays, as well as special modes for scanning multiple barcodes.

Notably, all three work offline, meaning a poor network connection is no problem. Scandit’s and Dynamsoft’s SDKs do, however, transfer some metadata to external servers.

Feature Scandit Scanbot SDK Dynamsoft
Multi-barcode scanning
Scan from image
Scan from PDF
User guidance
AR overlay
Scan barcode and text together
Offline scanning
No data transmission to 3rd parties

Customizability

All three SDKs offer pre-built UIs with configurable scanning behavior (active symbologies, scan regions) and customizable on-screen elements.

Scandit provides multiple pre-built workflows, including SparkScan and MatrixScan, along with customizable UI components. You can adjust colors, text sizes, and UI element positioning. However, under the standard license, the software displays a Scandit watermark in the viewfinder.

Scanbot SDK offers Ready-to-Use (RTU) UI components, including specialized modes like Scan & Count and Find & Pick. Both the viewfinder and result screens are configurable through RTU UI. For advanced customization needs, Scanbot SDK also provides Classic UI options. Unlike with Scandit, there is no watermark in the scanner interface.

Dynamsoft includes a built-in camera view with support for overlays, bounding boxes, and torch controls. While customization options are more limited compared to Scandit and Scanbot SDK, this reflects Dynamsoft's primary focus on robust backend functionality.

Trial license

All three commercial SDKs provide trial licenses for testing integration and features. None of them require credit card details for this, though the exact terms vary.

Scandit and Dynamsoft both provide 30-day trial licenses, though you need to register with your email to receive your license key.

Scanbot SDK offers a 7-day trial without hassle. No email signup is required to request and receive your license key.

Support and updates

As paid SDKs, all three providers offer dedicated assistance for integration issues and bug fixes. Regular updates ensure compatibility with new OS versions and devices.

Scandit provides standard support through ticketing and email channels. Higher licensing tiers include access to 24/7 emergency lines, dedicated technical support, and assigned account managers.

Scanbot SDK offers developer support through Slack, Microsoft Teams, and email. Even during trial integration, you can reach out to the Customer Success and Engineering teams. All support is included in your license price.

Dynamsoft does offer support, though details aren’t as publicly documented. You’ll need to contact them directly for complete support information.

Pricing

Scandit uses a volume-based pricing model, typically tied to either the number of scans or that of active devices. This can be cost-effective for smaller projects, but the costs rise quickly in large deployments.

Scanbot SDK has a flat annual fee. Pricing depends on the number of apps or domains and on which modules you need (Barcode Scanner, Document Scanner, or Data Capture Modules).

Dynamsoft offers flexible licensing models that vary by product and use case. Quotes are provided on request, with higher costs for offline licensing compared to cloud-connected use.

Conclusion

Open-source libraries are a solid choice for simple use cases, but they require ongoing maintenance to keep up with new frameworks and devices.

For production scenarios that demand reliability, cross-platform support, professional assistance, and regular updates, commercial SDKs are the safer option. They deliver stability, faster troubleshooting, and long-term maintainability.

Top comments (4)

Collapse
 
bernert profile image
BernerT

Solid overview of open-source vs commercial barcode scanners. The tables and performance notes make the trade-offs easy to grasp. Small nit: the GitHub contributions link seems off, and the Capacitor ML Kit link points to a NuGet package—might be a copy/paste issue. A quick decision flow or a couple of real-world benchmarks would be a nice addition.

Collapse
 
kirsten-1984 profile image
Kirsten

Thanks for the feedback and recommendations! I've adjusted the links - indeed, a copy/paste mistake, thanks for pointing that out.

Collapse
 
yushulx profile image
Xiao Ling

Please don’t share incorrect information. Let me help fix the comparison table. If you’d like to verify, you can try my sample code: github.com/yushulx/cmake-cpp-barco....

Collapse
 
kirsten-1984 profile image
Kirsten

Hi @yushulx, thank you for noticing! I double-checked and updated the table, thanks!!