# https://scanbot.io/ llms-full.txt ## Scanbot SDK Solutions Scanbot SDK has been acquired by Apryse! [Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft) [Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft) close [Skip to content](https://scanbot.io/#main) # Fast and reliableBarcode ScanningDocument ScanningData Capturefor mobile & web apps Your trusted partner for barcode scanning, document scanning, and data extraction [Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/) Trusted by 300+ global industry leaders ![Volvo Customer](https://scanbot.io/wp-content/uploads/2024/12/company-volvo.svg)![Shiseido Customer](https://scanbot.io/wp-content/uploads/2024/09/company-shiseido.svg)![](https://scanbot.io/wp-content/uploads/2024/06/coop_logo-150x39.png)![PwC Customer](https://scanbot.io/wp-content/uploads/2024/05/company_pwc.svg)![TitleMax Customer](https://scanbot.io/wp-content/uploads/2023/10/company_title-max.svg)![Procter & Gamble Customer](https://scanbot.io/wp-content/uploads/2023/09/company_procter-and-gamble.svg)![Generali Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_generali-150x121.png)![Deutsche Telekom Case Study](https://scanbot.io/wp-content/uploads/2023/06/company_deutsche-telekom-150x72.png)![Deutsche Bahn Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_db-150x106.png)![AXA Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_axa-150x150.png)![ArcBest Customer](https://scanbot.io/wp-content/uploads/2023/06/company_arc-best-1-150x28.png)![Volvo Customer](https://scanbot.io/wp-content/uploads/2024/12/company-volvo.svg)![Shiseido Customer](https://scanbot.io/wp-content/uploads/2024/09/company-shiseido.svg)![](https://scanbot.io/wp-content/uploads/2024/06/coop_logo-150x39.png)![PwC Customer](https://scanbot.io/wp-content/uploads/2024/05/company_pwc.svg)![TitleMax Customer](https://scanbot.io/wp-content/uploads/2023/10/company_title-max.svg)![Procter & Gamble Customer](https://scanbot.io/wp-content/uploads/2023/09/company_procter-and-gamble.svg)![Generali Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_generali-150x121.png)![Deutsche Telekom Case Study](https://scanbot.io/wp-content/uploads/2023/06/company_deutsche-telekom-150x72.png)![Deutsche Bahn Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_db-150x106.png)![AXA Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_axa-150x150.png)![ArcBest Customer](https://scanbot.io/wp-content/uploads/2023/06/company_arc-best-1-150x28.png) deployed\_codeBarcode Scanning ## Barcode Scanner SDK The Scanbot Barcode Scanner SDK quickly and reliably reads all common barcode symbologies, improving your operational efficiency and the user experience. [Learn more](https://scanbot.io/barcode-scanner-sdk/) deployed\_codeDocument Scanning ## Document Scanner SDK The Scanbot Document Scanner SDK adds easy-to-use, high-quality document scanning to your mobile apps or website. Let users transform physical documents into flawless input for your backend. [Learn more](https://scanbot.io/document-scanner-sdk/) deployed\_codeData Extraction ## Data Capture Modules The Scanbot Data Capture Modules allow users to extract data from structured documents, including MRZs, driver's licenses, passports, and checks, as key-value pairs. Replace error-prone manual data entry. [Learn more](https://scanbot.io/data-capture-software/) Made for real-world conditions Scan barcodes reliably even in challenging conditions: - Damaged barcodes - Low-light environments - Tiny or distant barcodes ![Phone showing AR Overlay](https://scanbot.io/wp-content/themes/scanbot/public/build/assets/bento-real-world-light-DIuhI1LP.png)![Phone showing AR Overlay](https://scanbot.io/wp-content/themes/scanbot/public/build/assets/bento-real-world-dark-BfOzroT-.png) 096653869330034PDF 417 Fast. Very fast. Every scan happens in 0.04s or less [Scans all major barcode types\\ Code 39\\ \\ Code 93\\ \\ Code 32\\ \\ Code 25\\ \\ EAN-5\\ \\ PDF417\\ \\ GS1 DataBar\\ \\ Code 39\\ \\ Code 93\\ \\ Code 32\\ \\ Code 25\\ \\ EAN-5\\ \\ PDF417\\ \\ GS1 DataBar\\ \\ EAN-13\\ \\ MSI Plessey\\ \\ EAN-2\\ \\ Aztec Code\\ \\ rMQR Code\\ \\ Codabar\\ \\ UPC-A\\ \\ EAN-13\\ \\ MSI Plessey\\ \\ EAN-2\\ \\ Aztec Code\\ \\ rMQR Code\\ \\ Codabar\\ \\ UPC-A\\ \\ EAN-8\\ \\ ISBN\\ \\ GiroCode\\ \\ GS1-128\\ \\ Data Matrix\\ \\ IATA 2 of 5\\ \\ EAN-8\\ \\ ISBN\\ \\ GiroCode\\ \\ GS1-128\\ \\ Data Matrix\\ \\ IATA 2 of 5\\ \\ Code 128\\ \\ Code 11\\ \\ QR Code\\ \\ UPC-E\\ \\ Micro QR Code\\ \\ MaxiCode\\ \\ Code 128\\ \\ Code 11\\ \\ QR Code\\ \\ UPC-E\\ \\ Micro QR Code\\ \\ MaxiCode](https://scanbot.io/supported-barcodes/) Simple to use for anyone Allow even non-tech-savvy users to easily create crisp document scans thanks to user guidance, automatic capture, auto-cropping, and other features. Ready to capture Capturing... Captured! 0 Add Retake Crop Rotate Delete High-quality scans Let your users generate high-quality scans suitable for automated processing. On-device intelligence 100% offline – no servers, no tracking, complete data security. MRZ, IDs, checks, driver’s licenses & more Extract data from a broad range of structured documents. Fast, accurate, and easy-to-use Automatically extract data and replace error-prone manual data entry. first\_name Erika last\_name Mustermann age 61 street\_name Neustraße city Berlin document\_id Z021AB42F94 first\_name Erika last\_name Mustermann age 61 street\_name Neustraße city Berlin document\_id Z021AB42F94 Key-value pair extraction The Scanbot SDK returns key-value pairs. This makes it easy to process the captured information in your app. ## Integrate this evening with your framework diamondValue ## Why Scanbot SDK? ### Fixed pricing Unpredictable costs are frustrating. The Scanbot SDK comes with a flat annual fee that includes everything, without limits on users or scans. ### On-device intelligence Our SDK works entirely offline, without any server connections or usage tracking. This ensures complete data security. ### Enterprise support Directly connect with your dedicated Customer Success Manager and our support engineers via Slack or Teams. person\_celebrateSuccess Stories ## See what our customers say about Scanbot SDK [See all success stories](https://scanbot.io/success-stories) [arrow\_outward\\ ![HUK-COBURG logo](https://scanbot.io/wp-content/uploads/2024/10/huk-coburg-logo.svg)](https://scanbot.io/success-stories/huk-coburg/) ![Procter & Gamble Customer](https://scanbot.io/wp-content/uploads/2023/09/company_procter-and-gamble.svg) [arrow\_outward\\ ![RIMI Baltic Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_rimi-150x52.png)\\ How Rimi Baltic reduced its Scan & Go costs by 90% using Scanbot SDK](https://scanbot.io/success-stories/rimi-baltic/) [arrow\_outward\\ ![VakifBank Success Stories](https://scanbot.io/wp-content/uploads/2023/06/company_vakifbank-150x18.png)](https://scanbot.io/success-stories/vakifbank/) [arrow\_outward\\ ![image](https://scanbot.io/wp-content/uploads/2024/06/coop_logo-150x39.png)](https://scanbot.io/success-stories/coop-estonia/) [arrow\_outward\\ ![ArcBest Customer](https://scanbot.io/wp-content/uploads/2023/06/company_arc-best-1-150x28.png)](https://scanbot.io/success-stories/arcbest/) ![AXA Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_axa-150x150.png) [arrow\_outward\\ ![Deutsche Telekom Case Study](https://scanbot.io/wp-content/uploads/2023/06/company_deutsche-telekom-150x72.png)\\ \\ “We rely heavily on this solution, and the Scanbot SDK team has been a trusted partner since day one.”\\ \\ ![image](https://scanbot.io/wp-content/uploads/2023/06/avatar_patrick-kramer-telekom.png)\\ \\ Patrick Krämer\\ \\ Product Owner MitarbeiterApp](https://scanbot.io/success-stories/telekom/) [arrow\_outward\\ ![Swica Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_swica-150x51.png)](https://scanbot.io/success-stories/swica/) ![Shiseido Customer](https://scanbot.io/wp-content/uploads/2024/09/company-shiseido.svg) [arrow\_outward\\ ![Flaschenpost logo](https://scanbot.io/wp-content/uploads/2024/07/company-flaschenpost.svg)](https://scanbot.io/success-stories/flaschenpost/) ![Deutsche Bahn Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_db-150x106.png) [arrow\_outward\\ ![Kronan Customer](https://scanbot.io/wp-content/uploads/2024/07/company-kronan.svg)\\ Krónan fixed their Scan & Go issues by switching from Google ML Kit to Scanbot SDK](https://scanbot.io/success-stories/kronan/) [arrow\_outward\\ ![Red Cross Flanders Customer](https://scanbot.io/wp-content/uploads/2023/09/company_red-cross-belgium.svg)](https://scanbot.io/success-stories/red-cross-flanders/) ![Volvo Customer](https://scanbot.io/wp-content/uploads/2024/12/company-volvo.svg) [arrow\_outward\\ ![HUK-COBURG logo](https://scanbot.io/wp-content/uploads/2024/10/huk-coburg-logo.svg)](https://scanbot.io/success-stories/huk-coburg/) ![Procter & Gamble Customer](https://scanbot.io/wp-content/uploads/2023/09/company_procter-and-gamble.svg) [arrow\_outward\\ ![RIMI Baltic Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_rimi-150x52.png)\\ How Rimi Baltic reduced its Scan & Go costs by 90% using Scanbot SDK](https://scanbot.io/success-stories/rimi-baltic/) [arrow\_outward\\ ![VakifBank Success Stories](https://scanbot.io/wp-content/uploads/2023/06/company_vakifbank-150x18.png)](https://scanbot.io/success-stories/vakifbank/) [arrow\_outward\\ ![image](https://scanbot.io/wp-content/uploads/2024/06/coop_logo-150x39.png)](https://scanbot.io/success-stories/coop-estonia/) [arrow\_outward\\ ![ArcBest Customer](https://scanbot.io/wp-content/uploads/2023/06/company_arc-best-1-150x28.png)](https://scanbot.io/success-stories/arcbest/) ![AXA Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_axa-150x150.png) [arrow\_outward\\ ![Deutsche Telekom Case Study](https://scanbot.io/wp-content/uploads/2023/06/company_deutsche-telekom-150x72.png)\\ \\ “We rely heavily on this solution, and the Scanbot SDK team has been a trusted partner since day one.”\\ \\ ![image](https://scanbot.io/wp-content/uploads/2023/06/avatar_patrick-kramer-telekom.png)\\ \\ Patrick Krämer\\ \\ Product Owner MitarbeiterApp](https://scanbot.io/success-stories/telekom/) [arrow\_outward\\ ![Swica Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_swica-150x51.png)](https://scanbot.io/success-stories/swica/) ![Shiseido Customer](https://scanbot.io/wp-content/uploads/2024/09/company-shiseido.svg) [arrow\_outward\\ ![Flaschenpost logo](https://scanbot.io/wp-content/uploads/2024/07/company-flaschenpost.svg)](https://scanbot.io/success-stories/flaschenpost/) ![Deutsche Bahn Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_db-150x106.png) [arrow\_outward\\ ![Kronan Customer](https://scanbot.io/wp-content/uploads/2024/07/company-kronan.svg)\\ Krónan fixed their Scan & Go issues by switching from Google ML Kit to Scanbot SDK](https://scanbot.io/success-stories/kronan/) [arrow\_outward\\ ![Red Cross Flanders Customer](https://scanbot.io/wp-content/uploads/2023/09/company_red-cross-belgium.svg)](https://scanbot.io/success-stories/red-cross-flanders/) ![Volvo Customer](https://scanbot.io/wp-content/uploads/2024/12/company-volvo.svg) ## Ready to get started? Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away. [Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/) + ## Barcode Scanning Solutions https://scanbot.io/blog/cold-chain-logistics-management-barcode-scanner/2025-07-18T09:38:29+00:00https://scanbot.io/blog/white-label-scanning-solutions/2025-07-18T06:52:22+00:00https://docs.scanbot.io/assets/images/rtu\_main-4c2bf9829c60c9c781518d20812ca304.pnghttps://scanbot.io/wp-content/uploads/2018/08/documentscanner-rtuUI.pnghttps://scanbot.io/wp-content/uploads/2018/08/MRZ-rtu-UI.pnghttps://scanbot.io/wp-content/uploads/2018/08/Creditcard-scanner-rtuUI.pnghttps://scanbot.io/wp-content/uploads/2018/08/text-pattern-scanner-rtuUI.pnghttps://scanbot.io/blog/mobile-data-capture-for-shelf-space-optimization/2025-07-18T06:44:03+00:00https://scanbot.io/wp-content/uploads/2025/06/mobile-devices-advantages.pnghttps://scanbot.io/blog/drivers-license-barcode-parser/2025-07-18T06:43:18+00:00https://scanbot.io/wp-content/uploads/2022/07/pdf417-pattern-inline.pnghttps://scanbot.io/wp-content/uploads/2025/03/Drivers-License-Scanner.pnghttps://scanbot.io/wp-content/uploads/2025/03/aamva-barcode-parser-tutorial-gif-3.gifhttps://scanbot.io/blog/barcode-scanning-for-supply-chain-management/2025-07-18T06:42:01+00:00https://scanbot.io/wp-content/uploads/2025/06/core-areas-SCM.pnghttps://scanbot.io/blog/mobile-ocr-for-legal-documents/2025-07-18T06:40:37+00:00https://scanbot.io/wp-content/uploads/2024/12/rtu-ui-v1-to-v2-migration-guide-screenshot-02-new.pnghttps://scanbot.io/blog/what-is-an-mrz/2025-07-17T14:12:33+00:00https://scanbot.io/wp-content/uploads/2023/01/what-is-mrz-example-image-1024x463-1.webphttps://scanbot.io/wp-content/uploads/2023/01/MRZ-scanner1.pnghttps://scanbot.io/wp-content/uploads/2023/01/MRZ-scanner2.pnghttps://scanbot.io/blog/accurate-lab-specimen-labels-with-barcodes/2025-07-15T12:43:50+00:00https://scanbot.io/wp-content/uploads/2022/10/code-128-example.pnghttps://scanbot.io/wp-content/uploads/2024/12/qr-code-example-edited.pnghttps://scanbot.io/wp-content/uploads/2024/12/data-matrix.pnghttps://scanbot.io/blog/scanning-financial-documents-with-ocr/2025-07-11T13:37:30+00:00https://scanbot.io/wp-content/uploads/2025/07/CreditCardScanner-1.pnghttps://scanbot.io/blog/finance-mobile-app-development-best-practices-to-enhance-your-digital-workflows/2025-07-11T12:45:01+00:00https://scanbot.io/wp-content/uploads/2022/12/taxfix\_cs\_short\_en-1024x762-1.webphttps://scanbot.io/blog/manufacturing-how-to-implement-an-efficient-barcode-system/2025-07-08T14:56:13+00:00https://scanbot.io/wp-content/uploads/2022/03/Find-Pick.pnghttps://scanbot.io/blog/mobile-pallet-barcode-scanner-for-traceability/2025-07-03T12:15:51+00:00https://scanbot.io/blog/mobile-sscc-scanner-extract-data-from-gs1-128/2025-07-03T08:32:25+00:00https://scanbot.io/wp-content/uploads/2025/07/sscc18-1.jpghttps://scanbot.io/wp-content/uploads/2025/07/sscc-scanner-app.gifhttps://scanbot.io/wp-content/uploads/2025/07/sscc18-1.jpghttps://scanbot.io/wp-content/uploads/2025/07/sscc-scanner-app.gifhttps://scanbot.io/blog/mobile-vin-scanner-solution-for-vehicle-scanning/2025-07-02T12:13:41+00:00https://scanbot.io/wp-content/uploads/2025/03/vin\_image.pnghttps://scanbot.io/wp-content/uploads/2025/03/vinbarcode.pnghttps://scanbot.io/wp-content/uploads/2025/03/VIN-scanning.pnghttps://scanbot.io/blog/data-capture-modules-for-digital-fleet-management/2025-07-01T08:04:45+00:00https://scanbot.io/wp-content/uploads/2025/03/VIN-scanning.pnghttps://scanbot.io/wp-content/uploads/2025/05/BOL-scanning-1.pnghttps://scanbot.io/blog/barcode-reader-pros-cons/2025-07-01T07:42:11+00:00https://scanbot.io/wp-content/uploads/2024/07/javascript-barcode-scanner-tutorial-new-gif-single-scanning.gifhttps://scanbot.io/wp-content/uploads/2024/07/javascript-barcode-scanner-tutorial-new-gif-multi-scanning-1.gifhttps://scanbot.io/wp-content/uploads/2024/07/javascript-barcode-scanner-tutorial-screenshot-01.pnghttps://scanbot.io/wp-content/uploads/2024/07/javascript-barcode-scanner-tutorial-screenshot-02-e1734518571134.pnghttps://scanbot.io/wp-content/uploads/2024/07/javascript-barcode-scanner-tutorial-screenshot-03.pnghttps://scanbot.io/wp-content/uploads/2024/07/javascript-barcode-scanner-tutorial-screenshot-04-e1734518674262.pnghttps://scanbot.io/wp-content/uploads/2024/07/javascript-barcode-scanner-tutorial-screenshot-05-e1734518698445.pnghttps://scanbot.io/wp-content/uploads/2024/07/javascript-barcode-scanner-tutorial-screenshot-06-e1721131838208.jpghttps://scanbot.io/blog/enhancing-supply-chain-transparency-with-barcodes/2025-07-01T07:39:32+00:00https://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-find-and-pick.jpghttps://scanbot.io/blog/insurance-app-development/2025-06-24T07:13:01+00:00https://scanbot.io/blog/6-top-barcode-scanner-features/2025-06-24T07:11:11+00:00https://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-batch-scanning.jpghttps://scanbot.io/blog/types-of-barcodes/2025-06-23T11:27:28+00:00https://scanbot.io/wp-content/uploads/2022/10/1d-barcodes-inline.pnghttps://scanbot.io/wp-content/uploads/2022/10/code-39-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/vin-code-example.pnghttps://scanbot.io/wp-content/uploads/2024/07/pzn-barcode-example.pnghttps://scanbot.io/wp-content/uploads/2024/07/code-32-150x95.pnghttps://scanbot.io/wp-content/uploads/2022/10/code-93-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/code-128-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/gs1-128-example.pnghttps://scanbot.io/wp-content/uploads/2024/07/code-11-example-new-transparent-150x82.pnghttps://scanbot.io/wp-content/uploads/2022/10/ean-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/upc-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/codabar-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/itf-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/industrial-2-of-5-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/standard-2-of-5-example.pnghttps://scanbot.io/wp-content/uploads/2024/03/barcode\_gs1-databar-new-150x78.pnghttps://scanbot.io/wp-content/uploads/2023/11/rss-expanded-barcode-example-150x105.pnghttps://scanbot.io/wp-content/uploads/2022/10/msi-plessey-example.pnghttps://scanbot.io/wp-content/uploads/2024/07/pharmacode-one-track-barcode-example.pnghttps://scanbot.io/wp-content/uploads/2024/07/pharmacode-two-track-barcode-example.pnghttps://scanbot.io/wp-content/uploads/2023/09/intelligent-mail-barcode-example.pnghttps://scanbot.io/wp-content/uploads/2023/12/RM4SCCcode-1.pnghttps://scanbot.io/wp-content/uploads/2023/12/DutchKIXcode-1.pnghttps://scanbot.io/wp-content/uploads/2023/12/australian-post-4-state-customer-code.pnghttps://scanbot.io/wp-content/uploads/2023/12/Japanese-Postal.pnghttps://scanbot.io/wp-content/uploads/2022/10/2d-barcodes-inline.pnghttps://scanbot.io/wp-content/uploads/2024/12/pdf417-example-edited.pnghttps://scanbot.io/wp-content/uploads/2024/04/micropdf417-barcode-example.pnghttps://scanbot.io/wp-content/uploads/2024/12/data-matrix.pnghttps://scanbot.io/wp-content/uploads/2023/08/barcode\_gs1-data-matrix-150x150.pnghttps://scanbot.io/wp-content/uploads/2024/07/maxicode-150x143.pnghttps://scanbot.io/wp-content/uploads/2022/10/ntin-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/ppn-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/royal-mail-mailmark-example.pnghttps://scanbot.io/wp-content/uploads/2024/12/aztec-code-example-edited.pnghttps://scanbot.io/wp-content/uploads/2024/12/qr-code-example-edited.pnghttps://scanbot.io/wp-content/uploads/2023/08/barcode\_micro-qr-code-150x150.pnghttps://scanbot.io/wp-content/uploads/2024/07/rmqr-code-150x18.pnghttps://scanbot.io/wp-content/uploads/2022/10/girocode-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/swiss-qr-code-example.pnghttps://scanbot.io/wp-content/uploads/2023/08/barcode\_udi-150x150.pnghttps://scanbot.io/blog/browser-based-web-barcode-scanner-demo/2025-06-23T10:04:02+00:00https://scanbot.io/wp-content/uploads/2023/06/DemoApp\_Biz\_Barcode\_Web.jpghttps://scanbot.io/wp-content/uploads/2024/06/web-barcode-img-desktop-01.jpghttps://scanbot.io/wp-content/uploads/2024/06/web-barcode-img-desktop-02.jpghttps://scanbot.io/wp-content/uploads/2024/06/web-barcode-img-desktop-03.jpghttps://scanbot.io/blog/how-to-fight-load-board-fraud-with-a-cdl-scanner/2025-06-13T08:16:10+00:00https://scanbot.io/blog/mobile-wristband-barcode-scanner-software/2025-06-06T14:47:59+00:00https://scanbot.io/wp-content/uploads/2022/10/code-39-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/code-128-example.pnghttps://scanbot.io/wp-content/uploads/2024/12/data-matrix.pnghttps://scanbot.io/wp-content/uploads/2024/12/qr-code-example-edited.pnghttps://scanbot.io/wp-content/uploads/2024/12/aztec-1.pnghttps://scanbot.io/wp-content/uploads/2025/06/barcode-wristband-scanner-benefits.pnghttps://scanbot.io/blog/top-barcodes-in-post-parcel-delivery/2025-06-06T09:37:17+00:00https://scanbot.io/blog/streamlining-check-ins-with-mobile-data-capture/2025-06-06T09:36:05+00:00https://scanbot.io/wp-content/uploads/2024/08/example-pdf417-code.pnghttps://scanbot.io/wp-content/uploads/2023/08/MRZ-Reader.pnghttps://scanbot.io/blog/automated-data-capture-methods/2025-06-06T09:12:37+00:00https://scanbot.io/wp-content/uploads/2025/06/Single-Scanning.pnghttps://scanbot.io/wp-content/uploads/2025/05/BOL-scanning-1.pnghttps://scanbot.io/blog/medication-scanners-in-health-care/2025-06-05T07:21:38+00:00https://scanbot.io/blog/barcode-scanner-patient-identification-system/2025-06-05T07:19:28+00:00https://scanbot.io/blog/ticket-barcode-scanner-for-event-entry/2025-06-03T15:26:53+00:00https://scanbot.io/wp-content/uploads/2025/04/Batch-scanning.pnghttps://scanbot.io/wp-content/uploads/2024/12/qr-code-example-edited.pnghttps://scanbot.io/wp-content/uploads/2024/12/pdf417-example-edited.pnghttps://scanbot.io/wp-content/uploads/2022/10/code-128-example.pnghttps://scanbot.io/blog/returns-management-solution-mobile-barcode-scanner/2025-06-02T10:19:09+00:00https://scanbot.io/wp-content/uploads/2025/05/benefits-barcode-scanner-1.pnghttps://scanbot.io/wp-content/uploads/2025/04/Batch-scanning.pnghttps://scanbot.io/wp-content/uploads/2025/04/Multi-Scanning-1.pnghttps://scanbot.io/wp-content/uploads/2022/03/Find-Pick.pnghttps://scanbot.io/wp-content/uploads/2025/05/scan-and-count.pnghttps://scanbot.io/blog/maximizing-customer-retention-with-loyalty-apps/2025-05-30T12:43:48+00:00https://scanbot.io/wp-content/uploads/2024/05/document-scanner-usp-4.pnghttps://scanbot.io/blog/improve-medical-device-tracking-with-a-udi-scanner/2025-05-30T09:32:03+00:00https://scanbot.io/wp-content/uploads/2023/08/barcode\_udi.pnghttps://scanbot.io/blog/barcode-scanning-retail-stores/2025-05-28T07:53:13+00:00https://scanbot.io/blog/data-capture-for-retail-return-fraud-prevention/2025-05-28T07:51:41+00:00https://scanbot.io/wp-content/uploads/2024/12/data-capture-id-scanner.pnghttps://scanbot.io/blog/pick-to-light-system/2025-05-28T07:50:24+00:00https://scanbot.io/blog/construction-management-apps/2025-05-27T08:16:50+00:00https://scanbot.io/blog/trucking-apps-feature-analysis/2025-05-27T08:15:10+00:00https://scanbot.io/wp-content/uploads/2024/05/Driver-operations.pnghttps://scanbot.io/wp-content/uploads/2024/05/On-route-convenience-features.pnghttps://scanbot.io/wp-content/uploads/2024/05/Communication-and-internal-resources-1.pnghttps://scanbot.io/blog/developing-a-fleet-management-strategy/2025-05-27T08:11:31+00:00https://scanbot.io/blog/document-data-extraction/2025-05-26T16:18:22+00:00https://scanbot.io/blog/ml-kit-vs-zxing/2025-05-26T09:26:04+00:00https://scanbot.io/wp-content/uploads/2024/11/supported-barcodes.pnghttps://scanbot.io/blog/gs1-2d-barcodes-will-transform-the-retail-industry/2025-05-23T13:18:44+00:00https://scanbot.io/blog/lot-traceability-in-manufacturing/2025-05-23T07:26:49+00:00https://scanbot.io/blog/easy-price-checks-with-a-price-tag-scanning-sdk/2025-05-21T07:17:05+00:00https://scanbot.io/wp-content/uploads/2025/05/text-pattern-scanner.pnghttps://scanbot.io/blog/mobile-pick-by-scan-system/2025-05-20T09:46:28+00:00https://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-find-and-pick.jpghttps://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-batch-scanning.jpghttps://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-multi-scanning.jpghttps://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-scan-and-count.jpghttps://scanbot.io/blog/grocery-list-scanner-smartphones-are-turning-into-smart-shopping-sidekicks/2025-05-20T09:09:35+00:00https://scanbot.io/blog/barcode-traceability-system-for-supply-chain-visibility/2025-05-19T15:19:48+00:00https://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-batch-scanning.jpghttps://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-multi-scanning.jpghttps://scanbot.io/blog/erp-barcode-scanner-system/2025-05-19T13:06:03+00:00https://scanbot.io/wp-content/uploads/2025/04/Batch-scanning.pnghttps://scanbot.io/wp-content/uploads/2025/04/Multi-Scanning-1.pnghttps://scanbot.io/blog/leverage-a-barcode-system-for-inventory-management/2025-05-19T13:04:14+00:00https://scanbot.io/wp-content/uploads/2025/04/Batch-scanning.pnghttps://scanbot.io/wp-content/uploads/2025/04/Multi-Scanning-1.pnghttps://scanbot.io/blog/who-invented-the-barcode-a-dive-into-the-history-of-the-first-product-code/2025-05-19T08:21:03+00:00https://scanbot.io/wp-content/uploads/2023/03/bubblegum-shopping-cart.jpeghttps://scanbot.io/blog/bearing-counterfeits/2025-05-19T08:19:08+00:00https://scanbot.io/wp-content/uploads/2023/07/image.pnghttps://scanbot.io/wp-content/uploads/2023/07/image-1.pnghttps://scanbot.io/wp-content/uploads/2023/07/image-3.pnghttps://scanbot.io/wp-content/uploads/2023/07/image-4.pnghttps://scanbot.io/wp-content/uploads/2023/07/image-5.pnghttps://scanbot.io/blog/us-trucking-apps-under-the-microscope/2025-05-15T10:43:18+00:00https://scanbot.io/wp-content/uploads/2023/08/sb\_sdk\_favicon.pnghttps://scanbot.io/blog/trucking-apps-survey/2025-05-15T10:41:11+00:00https://scanbot.io/wp-content/uploads/2024/09/truck-driver-survey-graph-1.pnghttps://scanbot.io/wp-content/uploads/2024/09/truck-driver-survey-graph-2.pnghttps://scanbot.io/blog/mobile-document-scanner-for-truckers-top-features/2025-05-15T07:15:06+00:00https://scanbot.io/wp-content/uploads/2025/05/BOL-scanning.pnghttps://scanbot.io/blog/gs1-barcodes-what-they-are-and-how-to-scan-them/2025-05-12T11:02:35+00:00https://scanbot.io/wp-content/uploads/2023/02/barcode-parser-gs1-128-example-1024x220-1.pnghttps://scanbot.io/wp-content/uploads/2023/08/barcode\_upc-a.pnghttps://scanbot.io/wp-content/uploads/2023/08/barcode\_ean-13.pnghttps://scanbot.io/wp-content/uploads/2023/08/barcode\_gs1-128.pnghttps://scanbot.io/wp-content/uploads/2024/02/gs1-itf.pnghttps://scanbot.io/wp-content/uploads/2023/08/barcode\_gs1-databar.pnghttps://scanbot.io/wp-content/uploads/2023/08/barcode\_gs1-data-matrix.pnghttps://scanbot.io/wp-content/uploads/2024/02/gs1-qr-code.pnghttps://scanbot.io/wp-content/uploads/2025/03/gs1-barcode-scanner-parser-gif-02.gifhttps://scanbot.io/blog/scan-documents-from-your-browser-with-a-web-document-scanner/2025-05-06T14:02:18+00:00https://scanbot.io/wp-content/uploads/2024/03/DemoApp-Biz-Document-Web.svghttps://scanbot.io/wp-content/uploads/2025/03/web-document-sdk-accordion1-new.pnghttps://scanbot.io/wp-content/uploads/2025/03/web-document-sdk-accordion2-new.pnghttps://scanbot.io/wp-content/uploads/2025/01/web-document-sdk-accordion5.pnghttps://scanbot.io/wp-content/uploads/2025/03/web-document-sdk-accordion6-new.pnghttps://scanbot.io/blog/drone-barcode-scanner/2025-04-30T13:12:30+00:00https://scanbot.io/blog/scan-documents-to-png-with-a-png-scanner-app/2025-04-29T11:27:46+00:00https://scanbot.io/blog/turn-any-smartphone-into-a-package-scanner/2025-04-28T15:12:38+00:00https://scanbot.io/wp-content/uploads/2025/04/Multi-Scanning.pnghttps://scanbot.io/wp-content/uploads/2025/04/parcel-package-scanner-find-pick-gif.gifhttps://scanbot.io/blog/enhancing-operations-with-multi-barcode-scanners/2025-04-28T15:11:01+00:00https://scanbot.io/wp-content/uploads/2024/06/ios-barcode-scanner-sdk-integration-tutorial-gif.gifhttps://scanbot.io/blog/new-rtu-ui-v-2-0/2025-04-28T10:59:44+00:00https://scanbot.io/blog/scan-go-how-smartphones-as-grocery-scanners-create-a-first-class-in-store-experience/2025-04-28T08:23:44+00:00https://scanbot.io/blog/document-scan-quality-control-system/2025-04-24T08:29:33+00:00https://scanbot.io/wp-content/uploads/2024/05/document-scanner-usp-1.pnghttps://scanbot.io/wp-content/uploads/2024/05/document-scanner-usp-2.pnghttps://scanbot.io/wp-content/uploads/2024/05/document-scanner-usp-3.pnghttps://scanbot.io/wp-content/uploads/2024/05/document-scanner-usp-5.pnghttps://scanbot.io/wp-content/uploads/2024/05/document-scanner-usp-6.pnghttps://scanbot.io/wp-content/uploads/2024/05/document-scanner-usp-4.pnghttps://scanbot.io/blog/document-scanner-rtu-ui-v2-release/2025-04-24T08:27:03+00:00https://scanbot.io/wp-content/uploads/2024/10/document-scanner-rtu-ui-v2-mock-ups-2.pnghttps://scanbot.io/blog/the-new-document-scanner-demo-app-for-ios-and-android-has-arrived/2025-04-24T08:26:01+00:00https://scanbot.io/blog/how-does-deep-learning-benefit-barcode-scanning/2025-04-23T12:10:51+00:00https://scanbot.io/wp-content/uploads/2023/07/ar-scanner-mockup.pnghttps://scanbot.io/blog/ocr-automation-in-document-processing/2025-04-17T09:03:02+00:00https://scanbot.io/wp-content/uploads/2022/08/ocr-automation-binarization.pnghttps://scanbot.io/wp-content/uploads/2023/08/License-plate-1.pnghttps://scanbot.io/blog/what-is-ocr-software/2025-04-17T09:02:26+00:00https://scanbot.io/wp-content/uploads/2022/08/what-is-ocr-illustration-1024x819-1.pnghttps://scanbot.io/blog/barcodes-in-healthcare-2024/2025-04-16T07:38:06+00:00https://scanbot.io/blog/smartphones-as-barcode-scanners-for-manufacturing/2025-04-16T07:36:31+00:00https://scanbot.io/blog/agribusiness-technology/2025-04-16T07:32:37+00:00https://scanbot.io/blog/how-to-implement-barcode-asset-tracking-software/2025-04-16T07:28:25+00:00https://scanbot.io/wp-content/uploads/2022/10/code-128-example.pnghttps://scanbot.io/wp-content/uploads/2024/12/qr-code-example-edited.pnghttps://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-batch-scanning.jpghttps://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-multi-scanning.jpghttps://scanbot.io/blog/barcode-v3-next-gen-barcode-reader/2025-04-15T09:21:07+00:00https://scanbot.io/blog/fr-self-scanning-dans-le-commerce-de-detail/2025-04-15T08:21:32+00:00https://scanbot.io/wp-content/uploads/2023/08/self-scanning-fr-inline-1024x683-1.jpghttps://scanbot.io/wp-content/uploads/2023/08/self-scanning-fr-inline-2-1024x683-1.jpeghttps://scanbot.io/blog/android-handheld-barcode-scanner/2025-04-14T09:45:57+00:00https://scanbot.io/blog/de-ausweisscanner-fur-unternehmen/2025-04-14T09:29:34+00:00https://scanbot.io/wp-content/uploads/2024/11/blog-post-de-id-scanner-1.pnghttps://scanbot.io/blog/de-gesundheitskarte-auslesen/2025-04-14T09:29:05+00:00https://scanbot.io/wp-content/uploads/2024/11/Gesundheitskarte.pnghttps://scanbot.io/blog/mobile-self-scanning-apps-vs-self-checkout-lanes/2025-04-14T09:27:57+00:00https://scanbot.io/blog/scan-shipping-labels/2025-04-14T09:26:34+00:00https://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-multi-scanning.jpghttps://scanbot.io/wp-content/uploads/2025/04/parcel-package-scanner-find-pick-gif.gifhttps://scanbot.io/blog/tipos-de-codigos-de-barras-1d-y-2d-comparacion-detallada/2025-04-14T09:23:35+00:00https://scanbot.io/wp-content/uploads/2022/10/1d-barcodes-inline.pnghttps://scanbot.io/wp-content/uploads/2022/10/code-39-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/vin-code-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/code-93-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/code-128-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/gs1-128-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/ean-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/upc-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/codabar-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/itf-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/industrial-2-of-5-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/standard-2-of-5-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/msi-plessey-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/2d-barcodes-inline.pnghttps://scanbot.io/wp-content/uploads/2022/10/pdf417-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/data-matrix-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/ntin-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/ppn-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/royal-mail-mailmark-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/aztec-code-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/qr-code-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/girocode-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/swiss-qr-code-example.pnghttps://scanbot.io/blog/postal-barcodes-and-how-to-read-them/2025-04-14T09:22:14+00:00https://scanbot.io/wp-content/uploads/2023/12/postnet-barcode-example.pnghttps://scanbot.io/wp-content/uploads/2023/12/planet-barcode-example.pnghttps://scanbot.io/wp-content/uploads/2023/10/intelligent-mail-barcode-example.pnghttps://scanbot.io/wp-content/uploads/2023/08/barcode\_royalmail-trademark.pnghttps://scanbot.io/blog/how-do-barcodes-work/2025-04-14T09:19:17+00:00https://scanbot.io/wp-content/uploads/2023/03/how-barcodes-work-upc-a.pnghttps://scanbot.io/wp-content/uploads/2023/03/how-barcodes-work-zoomed-in.pnghttps://scanbot.io/wp-content/uploads/2023/03/how-barcodes-work-quiet-zones.pnghttps://scanbot.io/wp-content/uploads/2023/03/how-barcodes-work-upc-a-long.pnghttps://scanbot.io/wp-content/uploads/2023/03/how-barcodes-work-qr-code.pnghttps://scanbot.io/wp-content/uploads/2023/03/how-barcodes-work-qr-decoding-pattern-777x1024-1.pnghttps://scanbot.io/blog/how-to-read-damaged-or-blurry-barcodes/2025-04-14T09:18:37+00:00https://scanbot.io/wp-content/uploads/2024/01/ripped-barcode-example.pnghttps://scanbot.io/wp-content/uploads/2024/01/worn-barcode-example.pnghttps://scanbot.io/wp-content/uploads/2024/01/blurry-barcode-example.pnghttps://scanbot.io/wp-content/uploads/2024/01/tiny-barcode-example.pnghttps://scanbot.io/wp-content/uploads/2024/01/angled-barcode-example-1.pnghttps://scanbot.io/wp-content/uploads/2024/01/angled-barcode-example-2.pnghttps://scanbot.io/wp-content/uploads/2024/01/angled-barcode-example-3.pnghttps://scanbot.io/wp-content/uploads/2024/01/poorly-lit-barcode-example.pnghttps://scanbot.io/blog/barcode-scanner-types/2025-04-14T09:17:37+00:00https://scanbot.io/blog/how-to-use-ocr-in-banking-with-mobile-scanners/2025-04-11T13:36:37+00:00https://scanbot.io/wp-content/uploads/2025/01/document-sdk-accordion4.pnghttps://scanbot.io/blog/create-a-reliable-track-and-trace-system-with-mobile-barcode-scanning/2025-04-10T07:33:16+00:00https://scanbot.io/wp-content/uploads/2022/10/track-and-trace-systems-blog-image-1-1024x482-1.jpeghttps://scanbot.io/blog/cycle-counting-in-inventory-management/2025-04-09T15:31:44+00:00https://scanbot.io/wp-content/uploads/2024/03/cypher-robotics-collaboration-header.jpghttps://scanbot.io/blog/how-a-mobile-luggage-tag-scanner-streamlines-airport-operations/2025-04-09T14:06:12+00:00https://scanbot.io/blog/prevent-barcode-scanner-misreads/2025-04-09T14:05:04+00:00https://scanbot.io/wp-content/uploads/2024/01/ripped-barcode-example.pnghttps://scanbot.io/wp-content/uploads/2024/01/poorly-lit-barcode-example.pnghttps://scanbot.io/wp-content/uploads/2024/01/angled-barcode-example-2.pnghttps://scanbot.io/blog/ticket-validation-scanbot-barcode-scanner-sdk/2025-04-09T13:58:17+00:00https://scanbot.io/blog/how-to-use-our-barcode-scanner-ar-overlay/2025-04-08T15:14:53+00:00https://scanbot.io/wp-content/uploads/2025/04/ar-overlay-gif.gifhttps://scanbot.io/wp-content/uploads/2025/01/barcode-sdk-accordion4.pnghttps://scanbot.io/wp-content/uploads/2025/01/barcode-sdk-accordion2.pnghttps://scanbot.io/wp-content/uploads/2025/01/barcode-sdk-accordion3.pnghttps://scanbot.io/blog/fintech-scanning-solutions/2025-04-04T09:56:05+00:00https://scanbot.io/blog/ceo-christoph-wagner-on-scanbot-sdks-core-objectives-business-model/2025-04-03T16:12:50+00:00https://scanbot.io/wp-content/uploads/2023/06/find\_and\_pick\_cw\_blog.pnghttps://scanbot.io/wp-content/uploads/2023/06/scan\_and\_count\_cw\_blog.pnghttps://scanbot.io/blog/gs1-digital-link-what-retailers-need-to-know/2025-04-03T15:14:53+00:00https://scanbot.io/wp-content/uploads/2025/03/example-gs1-digital-link.pnghttps://scanbot.io/wp-content/uploads/2024/12/qr-code-example-edited.pnghttps://scanbot.io/wp-content/uploads/2024/12/data-matrix.pnghttps://scanbot.io/blog/artificial-intelligence-in-retail-how-new-technology-is-transforming-the-industry/2025-04-01T13:47:58+00:00https://scanbot.io/wp-content/uploads/2023/04/ai-in-retail.jpeghttps://scanbot.io/blog/how-eu-digital-product-passport-affects-businesses/2025-04-01T07:41:05+00:00https://scanbot.io/blog/rfid-vs-barcode-scanning/2025-04-01T07:38:21+00:00https://scanbot.io/blog/gs1-sunrise-2027/2025-04-01T07:37:23+00:00https://scanbot.io/blog/barcode-parser-how-to-parse-gs1-pdf417/2025-03-28T15:08:51+00:00https://scanbot.io/wp-content/uploads/2023/02/barcode-parser-gs1-128-example-1024x220-1.pnghttps://scanbot.io/wp-content/uploads/2023/02/barcode-parser-giro-code-example.pnghttps://scanbot.io/wp-content/uploads/2025/03/aamva-barcode-parser-tutorial-gif-3.gifhttps://scanbot.io/wp-content/uploads/2025/03/gs1-barcode-scanner-parser-gif-02.gifhttps://scanbot.io/blog/document-to-tiff-scanner-mobile-document-capture/2025-03-28T14:53:23+00:00https://scanbot.io/wp-content/uploads/2024/05/document-scanner-usp-6.pnghttps://scanbot.io/wp-content/uploads/2025/03/tiff-scanner-web-app-gif.gifhttps://scanbot.io/blog/fake-id-scanners/2025-03-19T14:33:12+00:00https://scanbot.io/wp-content/uploads/2024/12/Group-2-4.pnghttps://scanbot.io/blog/best-barcode-scanner-sdk/2025-03-10T10:11:27+00:00https://scanbot.io/wp-content/uploads/2022/10/upc-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/ean-example.pnghttps://scanbot.io/wp-content/uploads/2024/12/qr-code-example-edited.pnghttps://scanbot.io/wp-content/uploads/2025/01/barcode-scanner-subpage-GS1DataMatrix-3.pnghttps://scanbot.io/wp-content/uploads/2024/12/pdf417-example-edited.pnghttps://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-scan-and-count.jpghttps://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-batch-scanning.jpghttps://scanbot.io/blog/how-to-build-a-retail-app-a-step-by-step-guide/2025-03-10T10:09:39+00:00https://scanbot.io/blog/1d-vs-2d-barcodes/2025-03-10T10:07:54+00:00https://scanbot.io/wp-content/uploads/2023/08/barcode\_code-39.pnghttps://scanbot.io/wp-content/uploads/2023/08/barcode\_code-93.pnghttps://scanbot.io/wp-content/uploads/2023/08/barcode\_code-128.pnghttps://scanbot.io/wp-content/uploads/2023/08/barcode\_qrcode.pnghttps://scanbot.io/wp-content/uploads/2023/08/barcode\_datamatrix.pnghttps://scanbot.io/wp-content/uploads/2023/08/barcode\_aztec.pnghttps://scanbot.io/wp-content/uploads/2023/08/barcode\_qrcode.pnghttps://scanbot.io/wp-content/uploads/2023/08/barcode\_datamatrix.pnghttps://scanbot.io/wp-content/uploads/2023/08/barcode\_aztec.pnghttps://scanbot.io/blog/how-to-scan-an-inverted-barcode/2025-03-10T10:05:02+00:00https://scanbot.io/wp-content/uploads/2024/07/uninverted-code-128.pnghttps://scanbot.io/wp-content/uploads/2024/07/inverted-code-128.pnghttps://scanbot.io/wp-content/uploads/2024/07/uninverted-code-128-start-stop.pnghttps://scanbot.io/wp-content/uploads/2024/07/inverted-code-128-quiet-zone.pnghttps://scanbot.io/wp-content/uploads/2024/07/qr-code-uninverted.pnghttps://scanbot.io/wp-content/uploads/2024/07/qr-code-inverted.pnghttps://scanbot.io/blog/container-ocr-for-iso-6346-codes/2025-03-10T09:59:18+00:00https://scanbot.io/wp-content/uploads/2023/07/container-code-example.pnghttps://scanbot.io/blog/how-to-use-a-check-scanner/2025-03-10T09:49:06+00:00https://scanbot.io/wp-content/uploads/2022/06/check-information-inline.pnghttps://scanbot.io/blog/input-management-via-smartphones/2025-03-07T16:07:41+00:00https://scanbot.io/blog/digitize-medical-data-with-mobile-document-scanner/2025-03-07T16:02:11+00:00https://scanbot.io/wp-content/uploads/2025/01/document-sdk-accordion3.pnghttps://scanbot.io/blog/vin-cloning-identify-vehicle-fraud/2025-03-05T08:47:34+00:00https://scanbot.io/blog/new-web-data-capture-demo/2025-03-05T08:46:40+00:00https://scanbot.io/wp-content/uploads/2024/06/DemoApp-Biz-DataCapture-Web.svghttps://scanbot.io/blog/mobile-ocr-receipt-scanner-for-businesses/2025-02-27T11:41:48+00:00https://scanbot.io/wp-content/uploads/2025/01/document-sdk-accordion2.pnghttps://scanbot.io/wp-content/uploads/2025/01/document-sdk-accordion4.pnghttps://scanbot.io/blog/ocr-for-cloud-storage-making-data-searchable/2025-02-27T11:35:39+00:00https://scanbot.io/blog/digital-document-management/2025-02-27T11:34:44+00:00https://scanbot.io/blog/credit-card-scanner-sdk-mobile-apps/2025-02-26T13:27:39+00:00https://scanbot.io/wp-content/uploads/2024/12/Group-1-1.pnghttps://scanbot.io/wp-content/uploads/2024/12/credit-card-scanner-inline-image.jpghttps://scanbot.io/blog/how-does-a-laser-barcode-scanner-work/2025-02-26T13:22:00+00:00https://scanbot.io/wp-content/uploads/2024/07/uninverted-code-128.pnghttps://scanbot.io/wp-content/uploads/2024/07/qr-code-uninverted.pnghttps://scanbot.io/wp-content/uploads/2024/10/Laser-barcode-Scanner.pnghttps://scanbot.io/blog/improve-ocr-accuracy-with-image-processing/2025-02-26T12:50:31+00:00https://scanbot.io/blog/customer-driven-excellence/2025-02-25T15:34:17+00:00https://scanbot.io/blog/barcode-scanner-sdk-retail-warehousing/2025-02-24T16:34:05+00:00https://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-batch-scanning.jpghttps://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-scan-and-count.jpghttps://scanbot.io/blog/top-barcodes-in-retail/2025-02-24T13:15:30+00:00https://scanbot.io/blog/how-does-a-camera-based-barcode-scanner-work/2025-02-24T09:15:40+00:00https://scanbot.io/wp-content/uploads/2025/01/barcode-sdk-accordion4.pnghttps://scanbot.io/blog/direct-part-marking-barcodes/2025-02-20T13:26:43+00:00https://scanbot.io/wp-content/uploads/2024/10/AdobeStock\_615844728-scaled.jpeghttps://scanbot.io/blog/smartphone-id-verification-for-hotel-check-ins/2025-02-19T08:22:48+00:00https://scanbot.io/wp-content/uploads/2024/12/data-capture-id-scanner.pnghttps://scanbot.io/blog/improving-barcode-scanner-performance/2025-02-17T15:40:01+00:00https://scanbot.io/wp-content/uploads/2025/01/barcode-sdk-accordion4.pnghttps://scanbot.io/wp-content/uploads/2024/01/blurry-barcode-example.pnghttps://scanbot.io/blog/smartphones-as-wireless-barcode-scanners-streamline-your-operations-now/2025-02-17T14:52:06+00:00https://scanbot.io/wp-content/uploads/2023/08/industry-subpage-img-06.pnghttps://scanbot.io/blog/using-smartphones-as-id-scanners-boosts-your-efficiency/2025-02-17T11:40:39+00:00https://scanbot.io/blog/turn-smartphones-into-boarding-pass-scanners-streamline-internal-workflows/2025-02-17T11:39:35+00:00https://scanbot.io/wp-content/uploads/2023/01/boarding\_pass\_scanner\_workflow-1024x895-1.webphttps://scanbot.io/blog/unify-above-and-below-the-wing-operations/2025-02-17T11:38:37+00:00https://scanbot.io/blog/instore-operations-retail-barcode-scanning/2025-02-17T09:55:59+00:00https://scanbot.io/blog/how-on-device-processing-impacts-mobile-intelligence/2025-02-14T07:51:32+00:00https://scanbot.io/wp-content/uploads/2025/01/movie-ticket-validation-mock-up.pnghttps://scanbot.io/blog/samsung-xcover6-pro-rugged-device-barcode-scanner/2025-02-12T08:10:44+00:00https://scanbot.io/blog/delivery-barcode-scanner-for-3pl/2025-01-21T14:17:48+00:00https://scanbot.io/wp-content/uploads/2025/01/delivery-barcode-scanner-mockup-01-new.pnghttps://scanbot.io/wp-content/uploads/2025/01/delivery-barcode-scanner-mockup-02.pnghttps://scanbot.io/blog/mobile-pos-barcode-scanner/2025-01-21T09:22:59+00:00https://scanbot.io/wp-content/uploads/2025/01/mpos-example.pnghttps://scanbot.io/blog/luggage-recovery-and-reconciliation-with-barcodes/2025-01-15T15:07:51+00:00https://scanbot.io/wp-content/uploads/2025/01/luggage-recovery-and-reconciliation-with-barcodes-mockup.pnghttps://scanbot.io/blog/2023-recap-scanbot-sdks-year-in-review/2024-12-19T08:03:11+00:00https://scanbot.io/wp-content/uploads/2023/09/scanbot-sdk-logo-with-gradient.pnghttps://scanbot.io/wp-content/uploads/2023/12/linux-sdk-icon.pnghttps://scanbot.io/wp-content/uploads/2023/12/net-maui-sdk-icon.pnghttps://scanbot.io/wp-content/uploads/2023/12/capacitor-sdk-icon.pnghttps://scanbot.io/wp-content/uploads/2023/10/company\_ete-reman.pnghttps://scanbot.io/wp-content/uploads/2023/06/company\_thelukecommission.pnghttps://scanbot.io/wp-content/uploads/2023/06/company\_weisser-ring.pnghttps://scanbot.io/wp-content/uploads/2023/07/ebook\_state\_retail\_2023\_hero.jpghttps://scanbot.io/wp-content/uploads/2023/09/air-travel-brochure-mockup.pnghttps://scanbot.io/wp-content/uploads/2023/07/brochure\_what\_is\_new\_retail\_hero.jpghttps://scanbot.io/wp-content/uploads/2023/08/Scanning-SDK-Header.jpghttps://scanbot.io/wp-content/uploads/2023/08/Net-Maui-Vs-Xamarin-Header.jpghttps://scanbot.io/wp-content/uploads/2023/11/compose-multiplatform-tutorial-header.jpghttps://scanbot.io/blog/fixed-vs-volume-based-pricing/2024-12-18T14:51:47+00:00https://scanbot.io/blog/introducing-the-new-barcode-scanner-demo-app/2024-12-18T14:51:17+00:00https://scanbot.io/blog/check-out-our-new-data-capture-demo-app/2024-12-18T14:49:17+00:00https://scanbot.io/blog/scanbot-sdk-new-design-and-logo/2024-12-18T14:47:29+00:00https://scanbot.io/wp-content/uploads/2023/09/color-system-inline.pnghttps://scanbot.io/wp-content/uploads/2023/09/font-comparison-inline.pnghttps://scanbot.io/wp-content/uploads/2023/09/scanbot-sdk-logo-with-gradient.pnghttps://scanbot.io/blog/behind-the-scan-amazon-shopping/2024-12-18T12:25:54+00:00https://scanbot.io/wp-content/uploads/2024/04/behind-the-scan-amazon-shopping-mock-ups.pnghttps://scanbot.io/blog/qr-code-authentication/2024-12-18T11:32:32+00:00https://scanbot.io/blog/mobile-pos-scanner-software/2024-12-09T06:00:00+00:00https://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-batch-scanning.jpghttps://scanbot.io/wp-content/uploads/2024/09/bento\_new.pnghttps://scanbot.io/blog/fr-types-de-codes-barres/2024-12-05T13:09:35+00:00https://scanbot.io/wp-content/uploads/2022/10/1d-barcodes-inline.pnghttps://scanbot.io/wp-content/uploads/2022/10/code-39-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/vin-code-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/code-93-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/code-128-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/gs1-128-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/ean-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/upc-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/codabar-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/itf-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/industrial-2-of-5-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/standard-2-of-5-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/msi-plessey-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/2d-barcodes-inline.pnghttps://scanbot.io/wp-content/uploads/2022/10/pdf417-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/data-matrix-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/ntin-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/ppn-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/royal-mail-mailmark-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/aztec-code-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/qr-code-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/girocode-example.pnghttps://scanbot.io/wp-content/uploads/2022/10/swiss-qr-code-example.pnghttps://scanbot.io/blog/mobile-id-scanning/2024-12-03T08:54:57+00:00https://scanbot.io/blog/document-scanner-rtu-ui-migration-guide/2024-12-02T09:36:41+00:00https://scanbot.io/wp-content/uploads/2024/12/rtu-ui-v1-to-v2-migration-guide-screenshot-01-new.pnghttps://scanbot.io/wp-content/uploads/2024/12/rtu-ui-v1-to-v2-migration-guide-screenshot-02-new.pnghttps://scanbot.io/wp-content/uploads/2024/12/rtu-ui-v1-to-v2-migration-guide-screenshot-03-new.pnghttps://scanbot.io/wp-content/uploads/2024/12/rtu-ui-v1-to-v2-migration-guide-screenshot-04-new.pnghttps://scanbot.io/wp-content/uploads/2024/12/rtu-ui-v1-to-v2-migration-guide-screenshot-05-new.pnghttps://scanbot.io/wp-content/uploads/2024/12/rtu-ui-v1-to-v2-migration-guide-screenshot-06-new.pnghttps://scanbot.io/blog/smart-devices-as-proof-of-delivery-scanners/2024-11-26T09:07:51+00:00https://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-find-and-pick.jpghttps://scanbot.io/blog/de-fuhrerschein-scanner/2024-11-22T06:00:00+00:00https://scanbot.io/wp-content/uploads/2024/11/Fuhrerschein.pnghttps://scanbot.io/blog/es-mejorando-la-gestion-de-inventario-con-lector-de-codigo-de-barras/2024-11-12T13:48:05+00:00https://scanbot.io/blog/improving-airlines-online-check-in-rates-with-document-scanning/2024-11-07T06:00:00+00:00https://scanbot.io/wp-content/uploads/2024/05/Img\_MRZ.pnghttps://scanbot.io/wp-content/uploads/2024/06/web-document-img-desktop-02.jpghttps://scanbot.io/wp-content/uploads/2023/05/industry-subpage-img-25-updated.pnghttps://scanbot.io/wp-content/uploads/2024/06/document-simple-phone.pnghttps://scanbot.io/blog/maximizing-retail-store-productivity-through-smart-solutions/2024-11-05T08:18:16+00:00https://scanbot.io/wp-content/uploads/2024/11/Group-727.pnghttps://scanbot.io/blog/logistics-management-software/2024-10-22T08:52:44+00:00https://scanbot.io/blog/european-accessibility-act-2025/2024-10-03T05:00:00+00:00https://scanbot.io/wp-content/uploads/2024/10/Dark-mode.pnghttps://scanbot.io/wp-content/uploads/2024/10/Large-text.pnghttps://scanbot.io/wp-content/uploads/2024/10/Hint-message.pnghttps://scanbot.io/wp-content/uploads/2024/10/vibration-and-beep.pnghttps://scanbot.io/blog/retail-u-s-consumer-survey/2024-10-02T09:59:37+00:00https://scanbot.io/wp-content/uploads/2024/10/Graph-06.pnghttps://scanbot.io/wp-content/uploads/2024/10/Graph-05.pnghttps://scanbot.io/wp-content/uploads/2024/10/Graph-04.pnghttps://scanbot.io/wp-content/uploads/2024/10/Graph-03.pnghttps://scanbot.io/wp-content/uploads/2024/10/Graph-02.pnghttps://scanbot.io/wp-content/uploads/2024/10/Graph-01.pnghttps://scanbot.io/blog/freight-logistics-document-scanner-sdk/2024-09-13T06:00:00+00:00https://scanbot.io/wp-content/uploads/2024/05/document-scanner-usp-5.pnghttps://scanbot.io/blog/try-our-new-document-filters-right-in-your-browser/2024-09-03T11:01:19+00:00https://scanbot.io/wp-content/uploads/2024/06/document-filter-demo\_720.pnghttps://scanbot.io/blog/document-scanner-sdk-new-image-filters/2024-09-03T11:01:03+00:00https://scanbot.io/wp-content/uploads/2024/03/new-image-filters-example-image.pnghttps://scanbot.io/blog/enhanced-document-quality-analyzer/2024-09-03T11:00:46+00:00https://scanbot.io/wp-content/uploads/2024/01/document-quality-analyzer-1-scaled.jpghttps://scanbot.io/wp-content/uploads/2024/01/document-quality-analyzer-2-scaled.jpghttps://scanbot.io/wp-content/uploads/2024/01/document-quality-analyzer-3.jpghttps://scanbot.io/blog/scanning-twenty-six-barcodes-per-second/2024-08-27T05:00:00+00:00https://scanbot.io/blog/how-barcode-scanners-take-sustainability-to-the-next-level/2024-08-20T06:00:00+00:00https://scanbot.io/blog/enhancing-insurance-customer-satisfaction/2024-08-19T12:55:35+00:00https://scanbot.io/wp-content/uploads/2023/11/insurance-customer-reviews.pnghttps://scanbot.io/blog/sdk-and-api/2024-08-19T12:54:15+00:00https://scanbot.io/blog/instore-shopping-experience-bopis-boss/2024-08-19T12:53:13+00:00https://scanbot.io/blog/barcode-scanning-on-smart-devices/2024-08-19T12:50:42+00:00https://scanbot.io/blog/how-to-build-an-air-travel-app/2024-08-19T12:48:38+00:00https://scanbot.io/blog/machine-learning-in-business-processes-explained-simply/2024-08-19T12:48:12+00:00https://scanbot.io/blog/insurance-agent-app-document-scanning/2024-08-19T12:45:02+00:00https://scanbot.io/wp-content/uploads/2023/08/passport-details-en.pnghttps://scanbot.io/blog/digital-document-management-benefits/2024-08-19T12:42:25+00:00https://scanbot.io/blog/scan-medical-documents/2024-08-19T12:16:13+00:00https://scanbot.io/blog/legal-document-management/2024-08-12T13:07:14+00:00https://scanbot.io/blog/preventing-incorrect-data-entry-with-the-ehic-scanner-sdk/2024-08-12T13:03:19+00:00https://scanbot.io/wp-content/uploads/2023/04/health-cards-detect-scan-extract-data.pnghttps://scanbot.io/blog/telecommunications-field-services-barcode-scanning/2024-08-12T13:02:32+00:00https://scanbot.io/blog/windows-tablets-barcode-scanners/2024-08-12T13:02:06+00:00https://scanbot.io/wp-content/uploads/2023/07/ebook\_windows\_device\_guide.jpghttps://scanbot.io/blog/order-and-pay-made-easy-qr-code-scanning-for-your-mobile-app/2024-08-12T13:01:51+00:00https://scanbot.io/blog/supermarkets-of-the-future/2024-08-12T13:01:12+00:00https://scanbot.io/wp-content/uploads/2023/07/brochure\_what\_is\_new\_retail\_hero.jpghttps://scanbot.io/blog/scanbot-sdk-vs-ml-kit-vs-zxing/2024-08-12T12:52:41+00:00https://scanbot.io/wp-content/uploads/2023/07/ebook\_barcode\_libraries\_hero.jpghttps://scanbot.io/blog/iban-ocr/2024-08-12T12:51:48+00:00https://scanbot.io/blog/pet-insurance-submit-your-vet-bills/2024-08-12T12:49:54+00:00https://scanbot.io/blog/kyc-know-your-customer-verification/2024-08-12T12:48:32+00:00https://scanbot.io/blog/scanbot-sdk-change-of-legal-names/2024-08-08T12:00:07+00:00https://scanbot.io/blog/dag-jessel-cfo/2024-08-08T11:59:59+00:00https://scanbot.io/blog/meet-our-windows-barcode-scanner/2024-08-08T11:59:48+00:00https://scanbot.io/blog/our-barcode-scanner-demo-app-is-now-available-on-windows/2024-08-08T11:58:44+00:00https://scanbot.io/blog/meet-our-new-net-maui-sdk/2024-08-08T11:58:35+00:00https://scanbot.io/blog/cypher-robotics-scanbot-sdk-collaboration/2024-08-08T11:57:25+00:00https://scanbot.io/blog/online-document-submissions-using-a-web-sdk/2024-08-08T11:44:51+00:00https://scanbot.io/wp-content/uploads/2023/10/web-sdk-document-upload-inline.pnghttps://scanbot.io/blog/5-things-to-look-out-for-in-an-sdk/2024-08-08T11:43:53+00:00https://scanbot.io/blog/multichannel-retail-survey/2024-08-08T11:43:43+00:00https://scanbot.io/wp-content/uploads/2023/04/retail-survey-q1-2-1024x587-1.webphttps://scanbot.io/wp-content/uploads/2023/04/retail-survey-q2-2-1024x503-1.webphttps://scanbot.io/wp-content/uploads/2023/04/retail-survey-q3-2-1024x495-1.webphttps://scanbot.io/wp-content/uploads/2023/04/retail-survey-q4-2-1024x495-1.webphttps://scanbot.io/wp-content/uploads/2023/04/retail-survey-q5-2-1024x578-1.webphttps://scanbot.io/wp-content/uploads/2023/04/retail-survey-q7-2-1024x578-1.webphttps://scanbot.io/wp-content/uploads/2023/04/retail-survey-q8-2-1024x675-1.webphttps://scanbot.io/wp-content/uploads/2023/04/retail-survey-q9-2-1024x578-1.webphttps://scanbot.io/wp-content/uploads/2023/04/retail-survey-q10-2-1024x578-1.webphttps://scanbot.io/wp-content/uploads/2023/04/retail-survey-q11-2-1024x578-1.webphttps://scanbot.io/wp-content/uploads/2023/04/retail-survey-q12-2-1024x578-1.webphttps://scanbot.io/wp-content/uploads/2023/04/retail-survey-q13-2-1024x531-1.webphttps://scanbot.io/wp-content/uploads/2023/04/retail-survey-q14-2-1024x531-1.webphttps://scanbot.io/wp-content/uploads/2023/04/retail-survey-q15-2-1024x531-1.webphttps://scanbot.io/blog/smartphones-as-data-capture-devices-transform-the-future-of-mobile-data-collection/2024-08-08T11:39:12+00:00https://scanbot.io/wp-content/uploads/2023/06/Blog-cost\_efficiency.pnghttps://scanbot.io/wp-content/uploads/2023/06/Blog-flexibility.pnghttps://scanbot.io/wp-content/uploads/2023/06/Blog-integration\_and\_connectivity.pnghttps://scanbot.io/wp-content/uploads/2023/06/Blog-limited\_battery\_life.pnghttps://scanbot.io/wp-content/uploads/2023/06/Blog-performance.pnghttps://scanbot.io/blog/essential-document-scanner-features/2024-08-08T08:40:25+00:00https://scanbot.io/wp-content/uploads/2023/08/documentscannersdk-section-2.pnghttps://scanbot.io/blog/2022-recap/2024-08-08T08:38:48+00:00https://scanbot.io/blog/key-technologies-in-modern-logistics/2024-08-08T08:18:30+00:00https://scanbot.io/blog/5-reasons-to-build-an-in-house-driver-app/2024-08-08T08:16:57+00:00https://scanbot.io/wp-content/uploads/2023/08/sb\_sdk\_favicon.pnghttps://scanbot.io/blog/enhancing-retail-apps-with-a-barcode-search-feature/2024-08-08T08:11:08+00:00https://scanbot.io/wp-content/uploads/2024/07/blog-post-retail-search-bar-0.pnghttps://scanbot.io/wp-content/uploads/2024/07/blog-post-retail-search-bar-2.pnghttps://scanbot.io/wp-content/uploads/2024/07/blog-post-retail-search-bar.pnghttps://scanbot.io/blog/behind-the-scan-walmart/2024-08-08T08:10:03+00:00https://scanbot.io/wp-content/uploads/2024/08/Walmart-Screenshot.pnghttps://scanbot.io/blog/insurance-customer-satisfaction/2024-07-30T14:53:09+00:00https://scanbot.io/blog/mitigating-self-checkout-theft-a-comprehensive-guide-for-retailers/2024-07-24T12:46:56+00:00https://scanbot.io/blog/data-protection-compliance/2024-07-24T12:46:00+00:00https://scanbot.io/blog/5-interesting-barcode-use-cases/2024-07-24T12:45:51+00:00https://scanbot.io/blog/qr-code-use-cases/2024-07-24T12:44:54+00:00https://scanbot.io/blog/byod-versus-cyod/2024-07-24T12:39:09+00:00https://scanbot.io/blog/insurance-mobile-app-development-3-factors-for-a-high-automated-processing-rate/2024-07-24T12:38:11+00:00https://scanbot.io/blog/business-process-optimization-low-costs-high-efficiency/2024-07-24T12:35:42+00:00https://scanbot.io/wp-content/uploads/2024/01/business\_process\_optimitation\_workflow\_bp.pnghttps://scanbot.io/blog/industrial-scanner-for-mobile-devices/2024-07-24T12:34:52+00:00https://scanbot.io/blog/try-our-new-web-document-scanner-demo/2024-06-26T12:29:25+00:00https://scanbot.io/wp-content/uploads/2024/03/DemoApp-Biz-Document-Web.svghttps://scanbot.io/blog/make-or-buy-decision/2024-06-04T20:37:03+00:00https://scanbot.io/blog/saas-benefits-and-drawbacks/2024-06-04T20:30:36+00:00https://scanbot.io/wp-content/uploads/2022/09/saas-benefits-drawbacks-statistic-en.pnghttps://scanbot.io/blog/leveraging-the-power-of-modern-technology-6-key-benefits-of-mobile-apps/2024-06-04T14:33:34+00:00https://scanbot.io/wp-content/uploads/2023/06/benefits-of-mobile-apps-blog-2-460x311-1.jpeghttps://scanbot.io/blog/digital-insurance-trends/2024-06-04T14:32:15+00:00https://scanbot.io/wp-content/uploads/2022/09/insurance-technology-trends-inline-image-1024x382-1.jpeghttps://scanbot.io/blog/employee-app-features/2024-06-04T14:22:33+00:00https://scanbot.io/blog/assisted-reality-wearable-tablet/2024-06-04T13:20:19+00:00https://scanbot.io/blog/hospitality-solutions-with-mobile-scanning-elevate-your-guest-experience-now/2024-06-04T13:00:53+00:00https://scanbot.io/blog/fr-scan-and-go-pour-une-experience-premium-en-magasin/2024-06-04T12:42:41+00:00https://scanbot.io/wp-content/uploads/2023/08/grocery\_scanner\_fr-1024x512-1.pnghttps://scanbot.io/blog/electronic-prescription-software/2024-06-04T12:32:36+00:00https://scanbot.io/blog/is-self-checkout-a-failed-experiment/2024-06-04T11:53:13+00:00https://scanbot.io/wp-content/uploads/2023/04/retail-survey-q8-2-1024x675-1.webphttps://scanbot.io/wp-content/uploads/2023/04/retail-survey-q10-2-1024x578-1.webphttps://scanbot.io/blog/machine-learning-in-manufacturing-unlocking-efficiency-and-innovation/2024-06-03T13:16:29+00:00https://scanbot.io/wp-content/uploads/2023/05/machine-learning-manufacturing-1-1024x479-1.jpeghttps://scanbot.io/blog/increasing-customer-satisfaction-step-by-step/2024-06-03T13:02:28+00:00https://scanbot.io/wp-content/uploads/2024/01/customer\_satisfaction\_blog\_section\_1.pnghttps://scanbot.io/wp-content/uploads/2024/01/customer\_satisfaction\_blog\_section\_2.pnghttps://scanbot.io/blog/evolution-of-document-scanning/2024-06-03T12:10:01+00:00https://scanbot.io/wp-content/uploads/2023/11/document-scanning-timeline-1.pnghttps://scanbot.io/wp-content/uploads/2023/11/document-scanning-timeline-2.pnghttps://scanbot.io/wp-content/uploads/2023/11/document-scanning-timeline-3.pnghttps://scanbot.io/blog/retail-automation-technology/2024-05-02T07:10:14+00:00https://scanbot.io/blog/improving-the-ticket-scanning-process-in-public-transport-with-mobile-barcode-scanning/2024-02-22T12:55:49+00:00https://scanbot.io/blog/barcode-scanning-in-education/2024-02-12T12:29:03+00:00https://scanbot.io/blog/open-source-scanner-vs-scanner-sdk/2024-02-08T10:38:41+00:00https://scanbot.io/blog/government-digitization/2023-08-31T20:12:49+00:00https://scanbot.io/blog/4-reasons-why-you-should-use-mobile-passport-scanning/2023-08-28T14:55:53+00:00https://scanbot.io/blog/how-deep-learning-shaped-machine-learning-technology/2023-08-28T14:44:57+00:00https://scanbot.io/blog/the-future-of-payment-innovation-an-overview-of-the-most-important-trends/2023-08-28T12:14:33+00:00https://scanbot.io/wp-content/uploads/2023/04/contactless-payment.jpeg ## Barcode Glossary https://scanbot.io/glossary/pharmacode/2025-06-24T23:50:19+00:00https://scanbot.io/wp-content/uploads/2024/10/pharmacode-02.pnghttps://scanbot.io/wp-content/uploads/2025/03/one-track-pharmacode.pnghttps://scanbot.io/wp-content/uploads/2025/03/two-track-pharmacode.pnghttps://scanbot.io/glossary/pzn-barcode/2025-06-23T11:28:25+00:00https://scanbot.io/glossary/1d-barcode/2025-04-14T09:40:29+00:00https://scanbot.io/wp-content/uploads/2023/09/1d-barcode-1.pnghttps://scanbot.io/glossary/2d-barcode/2025-04-14T09:39:42+00:00https://scanbot.io/wp-content/uploads/2023/09/2d-barcode-grey-bg.pnghttps://scanbot.io/glossary/barcode-symbology/2025-04-14T09:20:50+00:00https://scanbot.io/wp-content/uploads/2022/10/2d-barcodes-inline.pnghttps://scanbot.io/glossary/check-digit/2025-04-14T09:20:28+00:00https://scanbot.io/glossary/giro-code/2025-03-28T08:25:06+00:00https://scanbot.io/glossary/hibc-barcode/2025-03-28T08:24:47+00:00https://scanbot.io/wp-content/uploads/2024/10/2d-hibcbarcode-grey-bg.pnghttps://scanbot.io/glossary/imei/2025-02-24T11:11:29+00:00https://scanbot.io/wp-content/uploads/2024/05/imei-barcode-grey-bg.pnghttps://scanbot.io/glossary/gtin/2025-02-24T11:11:07+00:00https://scanbot.io/wp-content/uploads/2023/09/ean-grey-bg.pnghttps://scanbot.io/glossary/qr-code/2024-12-17T18:23:03+00:00https://scanbot.io/wp-content/uploads/2023/09/2d-barcode-grey-bg-146x150.pnghttps://scanbot.io/glossary/ppn/2024-12-17T18:21:56+00:00https://scanbot.io/wp-content/uploads/2023/09/ppn-code-grey-bg.pnghttps://scanbot.io/glossary/isbn/2024-12-17T18:18:49+00:00https://scanbot.io/wp-content/uploads/2023/09/isbn-barcode-grey-bg.pnghttps://scanbot.io/glossary/iata-number/2024-12-17T18:13:25+00:00https://scanbot.io/wp-content/uploads/2023/09/iata-barcode-grey-bg.pnghttps://scanbot.io/glossary/epc/2024-12-17T18:07:43+00:00https://scanbot.io/wp-content/uploads/2023/09/epc-code-grey-bg.pnghttps://scanbot.io/glossary/barcode-term/2024-12-17T18:01:36+00:00https://scanbot.io/wp-content/uploads/2023/09/barcode-term-grey-bg.pnghttps://scanbot.io/wp-content/uploads/2023/09/upc-grey-bg.pnghttps://scanbot.io/glossary/react-native/2024-06-11T10:50:48+00:00https://scanbot.io/wp-content/uploads/2024/06/react-native-logo-150x147.pnghttps://scanbot.io/glossary/flutter/2024-06-11T09:40:47+00:00https://scanbot.io/wp-content/uploads/2024/06/flutter-logo-150x150.pnghttps://scanbot.io/glossary/cordova/2024-06-05T11:14:29+00:00https://scanbot.io/wp-content/uploads/2024/06/cordova-logo-150x147.pnghttps://scanbot.io/glossary/ionic/2024-06-05T11:14:29+00:00https://scanbot.io/wp-content/uploads/2024/06/ionic-logo-150x147.pnghttps://scanbot.io/glossary/net-maui/2024-06-05T11:14:24+00:00https://scanbot.io/wp-content/uploads/2024/06/net-maui-logo-150x150.pnghttps://scanbot.io/glossary/vin-number/2024-06-03T14:28:54+00:00https://scanbot.io/wp-content/uploads/2023/09/vin-number-explanation.pnghttps://scanbot.io/glossary/data-density/2024-06-03T14:27:56+00:00https://scanbot.io/glossary/imager-scanner/2024-04-22T09:32:56+00:00https://scanbot.io/wp-content/uploads/2023/09/imager-scanner-hero.jpeghttps://scanbot.io/glossary/barcode-quite-zone/2023-09-29T14:07:16+00:00https://scanbot.io/wp-content/uploads/2023/09/barcode-glossary-quiet-zone-example.pnghttps://scanbot.io/glossary/handheld-scanner/2023-09-29T14:06:29+00:00https://scanbot.io/wp-content/uploads/2023/09/handheld-scanner-hero.jpeghttps://scanbot.io/glossary/checksum/2023-09-29T13:24:59+00:00https://scanbot.io/glossary/pen-scanner/2023-09-29T08:54:44+00:00https://scanbot.io/wp-content/uploads/2023/09/pen-scanner-hero.jpeghttps://scanbot.io/glossary/sdk-term/2023-09-29T08:10:34+00:00https://scanbot.io/glossary/ascii/2023-09-29T07:49:51+00:00https://scanbot.io/glossary/pdf-term/2023-09-29T07:48:25+00:00https://scanbot.io/glossary/ccd/2023-09-28T13:51:46+00:00https://scanbot.io/glossary/data-capture-term/2023-09-28T13:50:57+00:00https://scanbot.io/glossary/iso-iec/2023-09-28T13:48:19+00:00https://scanbot.io/glossary/reed-solomon-error-correction/2023-09-28T12:58:52+00:00 ## Cordova Barcode Scanner Scanbot SDK has been acquired by Apryse! [Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft) [Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft) close [Skip to content](https://scanbot.io/developer/cordova-barcode-scanner-plugin/#main) # Cordova Barcode Scanner Plugin Seamlessly add fast, reliable barcode scanning to your Cordova-based hybrid apps. The Scanbot Cordova Barcode Scanner ensures real-time data capture across iOS and Android platforms. [Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/) Trusted by 300+ global industry leaders ![Volvo Customer](https://scanbot.io/wp-content/uploads/2024/12/company-volvo.svg)![Shiseido Customer](https://scanbot.io/wp-content/uploads/2024/09/company-shiseido.svg)![](https://scanbot.io/wp-content/uploads/2024/06/coop_logo-150x39.png)![PwC Customer](https://scanbot.io/wp-content/uploads/2024/05/company_pwc.svg)![TitleMax Customer](https://scanbot.io/wp-content/uploads/2023/10/company_title-max.svg)![Procter & Gamble Customer](https://scanbot.io/wp-content/uploads/2023/09/company_procter-and-gamble.svg)![Generali Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_generali-150x121.png)![Deutsche Telekom Case Study](https://scanbot.io/wp-content/uploads/2023/06/company_deutsche-telekom-150x72.png)![Deutsche Bahn Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_db-150x106.png)![AXA Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_axa-150x150.png)![ArcBest Customer](https://scanbot.io/wp-content/uploads/2023/06/company_arc-best-1-150x28.png)![Volvo Customer](https://scanbot.io/wp-content/uploads/2024/12/company-volvo.svg)![Shiseido Customer](https://scanbot.io/wp-content/uploads/2024/09/company-shiseido.svg)![](https://scanbot.io/wp-content/uploads/2024/06/coop_logo-150x39.png)![PwC Customer](https://scanbot.io/wp-content/uploads/2024/05/company_pwc.svg)![TitleMax Customer](https://scanbot.io/wp-content/uploads/2023/10/company_title-max.svg)![Procter & Gamble Customer](https://scanbot.io/wp-content/uploads/2023/09/company_procter-and-gamble.svg)![Generali Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_generali-150x121.png)![Deutsche Telekom Case Study](https://scanbot.io/wp-content/uploads/2023/06/company_deutsche-telekom-150x72.png)![Deutsche Bahn Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_db-150x106.png)![AXA Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_axa-150x150.png)![ArcBest Customer](https://scanbot.io/wp-content/uploads/2023/06/company_arc-best-1-150x28.png) ![image](https://scanbot.io/wp-content/uploads/2023/07/bento-img-updated.png) Real-time AR feedback Enhance your app’s user experience with real-time AR feedback during barcode scanning in your Cordova app. Visual cues help guide users to improve accuracy and efficiency in barcode scanning. ![image](https://scanbot.io/wp-content/uploads/2023/07/bento_Img_native-1.png) Barcode scanning in challenging conditions The Scanbot Cordova Barcode Scanner is optimized for scanning barcodes in difficult real-world environments, such as: - Damaged barcodes - Low-light environments - Tiny or distant barcodes [Customizable UI components\\ \\ Our Ready-To-Use UI components cover all barcode scanning scenarios and are highly customizable.](https://scanbot.io/rtu-ui/) Fast. Very fast. Every scan happens in 0.04s or less Scans all major barcode types Code 39 Code 93 Code 32 Code 25 EAN-5 PDF417 GS1 DataBar Code 39 Code 93 Code 32 Code 25 EAN-5 PDF417 GS1 DataBar EAN-13 MSI Plessey EAN-2 Aztec Code rMQR Code Codabar UPC-A EAN-13 MSI Plessey EAN-2 Aztec Code rMQR Code Codabar UPC-A EAN-8 ISBN GiroCode GS1-128 Data Matrix IATA 2 of 5 EAN-8 ISBN GiroCode GS1-128 Data Matrix IATA 2 of 5 Code 128 Code 11 QR Code UPC-E Micro QR Code MaxiCode Code 128 Code 11 QR Code UPC-E Micro QR Code MaxiCode ## Add fast and reliable Barcode Scanning to your Cordova app Integrate the Scanbot Cordova [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) seamlessly into your hybrid applications. Our SDK provides APIs for scanning and parsing 1D and 2D barcodes, ensuring fast, accurate barcode recognition in real time. The Scanbot Cordova Barcode Scanner Plugin supports a wide range of barcode formats, including QR codes, PDF417, and EAN, making it ideal for applications that require precise barcode scanning. Whether you’re developing solutions for warehouse management, supply chain logistics, or industrial asset tracking, the plugin ensures accurate and efficient scanning. Its flexibility also suits document digitization tasks, where the reliable capture of barcode data is critical for maintaining workflow accuracy and speed. With our Ready-To-Use UI (RTU UI) components, you can quickly implement a fully functional barcode scanner without extensive coding. The SDK is designed for low-light environments and can handle damaged barcodes, providing reliability in various real-world scenarios. Additionally, the SDK supports image-based barcode scanning, enabling users to scan barcodes from uploaded images. This feature adds flexibility for use cases like document management and inventory control. ### Technical requirements The Scanbot Cordova Barcode Scanner Plugin requires the following: - **Cordova CLI**: 9.x+ - **Cordova Platforms:** Android 10+, iOS 5.1+ - **Operating System**: Android: 5.0 (API Level 21) and higher, iOS: 13.0 and higher - **Architectures**: - Android: armeabi-v7, arm64-v8a, x86, x86\_64 - iOS: arm64 for physical devices and x86\_64 for simulators ## Integrate this evening with your framework categoryFeatures ## Discover common Cordova Barcode Scanning use cases See how the scan modes of the Scanbot Cordova Barcode Scanner Plugin can improve your workflows. - ### Single Scanning Perfect for scanning individual barcodes in inventory management or product lookups. The Scanbot Cordova Barcode Scanner ensures high accuracy for quick, single barcode scans. - ### Batch Scanning Allow users to scan multiple barcodes in succession without closing the scanner, making the Cordova Barcode Scanner Plugin ideal for logistics operations and order picking. - ### Multi Scanning Capture several barcodes simultaneously. This feature is perfect for warehouse management where multiple items need to be scanned in one go, improving workflow efficiency. - ### Find & Pick Given one or more barcode values, the Cordova Barcode Scanner Plugin will highlight and scan the correct items, simplifying warehouse picking and product identification. - ### Scan & Count Easily count multiple items with a single scan. This feature, supported by the Cordova Barcode Scanner Plugin, is useful for inventory checks, enabling fast and accurate processing of large numbers of items. ![Single Scanning](https://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-single-scanning-1-768x790.jpg)![Batch barcode scanning example image](https://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-batch-scanning-768x790.jpg)![multi scanning example image](https://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-multi-scanning-768x790.jpg)![Find & Pick](https://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-find-and-pick-768x790.jpg)![Scan and Count](https://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-scan-and-count-768x790.jpg) ## How to integrate the Scanbot Cordova Barcode Scanner **Installation​** The Scanbot Barcode Scanner SDK Cordova Plugin is available as an npm package `cordova-plugin-scanbot-barcode-scanner`. You can simply install and add it to your Cordova project with the following command: ```hljs csharp $ cordova plugin add cordova-plugin-scanbot-barcode-scanner ``` Or in an [Ionic](https://ionicframework.com/) based project: ```hljs csharp $ ionic cordova plugin add cordova-plugin-scanbot-barcode-scanner ``` **Permissions​** During the installation, this plugin will try to add all required permissions to your projects automatically. Here is a listing of those permissions to verify: - **Android** (will be added in your `AndroidManifest.xml` file): `` – This permission is used for the camera views. - **iOS** (will be added in your `Info.plist` file): `NSCameraUsageDescription` – “Privacy – Camera Usage Description”. Describe why your app wants to access the camera. By default, an empty string value will be added. You can change this value in the `config.xml` file of your Cordova project – see `CAMERA_USAGE_DESCRIPTION`. [Read the full Cordova Barcode Scanner SDK documentation](https://docs.scanbot.io/barcode-scanner-sdk/cordova/getting-started/) ## Ready to get started? Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away. [Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/) ## Frequently Asked Questions ### **What are the key requirements for the Scanbot Cordova Barcode Scanner SDK?** The Scanbot Cordova Barcode Scanner SDK requires: **Operating System:**\- Android: 5.0 (API Level 21) and higher \- iOS: 13.0 and higher **Cordova CLI:** Version 9.x or higher **Hardware:** Devices must have a rear-facing camera with autofocus **Supported Architectures:**\- Android: armeabi-v7, arm64-v8a, x86, x86\_64 \- iOS: arm64 (physical devices) and x86\_64 (simulators) ### **Can I use the Cordova Barcode Scanner SDK offline?** Yes, the Scanbot Cordova Barcode Scanner SDK works fully offline, ensuring that barcode data is processed directly on the device without needing an internet connection. This is particularly useful for field operations, remote locations, and situations where data privacy is crucial. ### **Does the Cordova Barcode Scanner SDK work with all types of barcodes?** Yes, the SDK supports a wide range of 1D and 2D barcodes, including: **1D Barcodes:** UPC, EAN, Code 128, Code 39, ITF, and more **2D Barcodes:** QR codes, [PDF417](https://scanbot.io/barcode-scanner-sdk/pdf417/), [DataMatrix](https://scanbot.io/barcode-scanner-sdk/data-matrix/), Aztec, and more This broad compatibility ensures the SDK can be used across various industries like logistics, healthcare, and retail. You can find a list of all supported barcodes [here](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/). ### **What platforms are supported besides Cordova?** Besides Cordova, the Scanbot SDK supports: 1\. [iOS](https://scanbot.io/developer/ios-barcode-scanner-sdk/) 2\. [Android](https://scanbot.io/developer/android-barcode-scanner/) 3\. [JavaScript](https://scanbot.io/developer/javascript-barcode-scanner/) (Web) 4\. [Flutter](https://scanbot.io/developer/flutter-barcode-scanner/) 5\. [React Native](https://scanbot.io/developer/react-native-barcode-scanner/) 6\. [Capacitor](https://scanbot.io/developer/capacitor-barcode-scanner-sdk/) / [Ionic](https://scanbot.io/developer/ionic-barcode-scanner/) 7\. [Xamarin](https://scanbot.io/developer/xamarin-barcode-scanner/) 8\. [.NET MAUI](https://scanbot.io/developer/net-maui-barcode-scanner-sdk/) 9\. [UWP](https://scanbot.io/developer/uwp-barcode-scanner/) (Universal Windows Platform) 10\. [Linux](https://scanbot.io/developer/linux-barcode-scanner/) This flexibility allows developers to integrate barcode scanning into web, mobile, and desktop applications. ### **How can I integrate a Cordova Barcode Scanner Plugin into my app?** To integrate a Cordova Barcode Scanner Plugin into your app, you typically add a barcode scanning SDK to your project, configure supported barcode formats, and initialize the scanner in your app's workflow. These SDKs usually support formats like QR codes, PDF417, and Code 128. If you want the fastest and most reliable solution, you need to choose the Scanbot SDK – trusted by over 250 enterprises worldwide. You can find detailed installation instructions in the [Scanbot SDK Cordova Barcode Scanner Documentation](https://docs.scanbot.io/barcode-scanner-sdk/cordova/introduction/). ### **Is there a trial version available for the Cordova Barcode Scanner SDK?** Yes, you can obtain a 7-day free trial license for the Scanbot Cordova Barcode Scanner SDK. Visit the Scanbot SDK [trial page](https://scanbot.io/trial/) to request a trial license key. The trial version allows you to test the full SDK without any functional limitations. ### **What is the performance of the Cordova Barcode Scanner SDK in low-light conditions?** The Scanbot Cordova Barcode Scanner SDK is optimized to work in challenging environments, including low-light conditions. The SDK uses advanced image processing techniques to ensure accurate barcode detection even in suboptimal lighting, making it suitable for applications in warehouses, factories, and other industrial environments. ### **How can I customize the Scanbot Cordova Barcode Scanner UI?** The Scanbot Cordova Barcode Scanner SDK provides customizable UI components that allow you to adjust the look and feel of the barcode scanner interface. You can customize the colors, layout, and behavior of the scanner to match your app’s design and branding requirements. Customization can be done by passing UI configuration parameters when initializing the scanner component. ### **Is the Cordova Barcode Scanner SDK GDPR- and CCPA-compliant?** Yes, the Scanbot Cordova Barcode Scanner SDK is fully GDPR- and CCPA-compliant, since the SDK processes all barcode data locally on the device and does not require an internet connection. No data is transmitted to external servers, ensuring full compliance with data privacy regulations. + ## Android Barcode Scanner Integration Scanbot SDK has been acquired by Apryse! [Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft) [Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft) close [Skip to content](https://scanbot.io/techblog/integrate-android-barcode-scanner-library/?utm_source=chatgpt.com#main) In this tutorial, we’ll use Android Studio, Kotlin, and the Scanbot [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) to create a powerful scanning app for extracting data from barcodes and QR codes. ![Scanning a single barcode](https://scanbot.io/wp-content/uploads/2025/02/single-barcode-scanning-gif.gif)Scanning a single barcode ![Scanning multiple barcodes with the AR overlay](https://scanbot.io/wp-content/uploads/2025/02/multi-barcode-scanning-gif.gif)Scanning multiple barcodes with the AR overlay We’ll achieve this by following these steps: 1. Preparing the project 2. Initializing the SDK 3. Setting up the main screen 4. Implementing the barcode scanning feature All you need is the latest version of Android Studio and you’re good to go. Want to see the final code right away? Click here. **MainActivity.kt:** ```hljs kotlin package com.example.androidbarcodescanner import android.os.Bundle import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import android.widget.Button import android.widget.Toast import androidx.activity.result.ActivityResultLauncher import io.scanbot.sdk.ui_v2.barcode.BarcodeScannerActivity import io.scanbot.sdk.ui_v2.common.activity.registerForActivityResultOk import io.scanbot.sdk.ui_v2.barcode.configuration.* class MainActivity : AppCompatActivity() { private val barcodeResultLauncher: ActivityResultLauncher = registerForActivityResultOk(BarcodeScannerActivity.ResultContract()) { resultEntity -> // Barcode Scanner result callback: // Get the first scanned barcode from the result object... val barcodeItem = resultEntity.result?.items?.first() // ... and process the result as needed. For example, display as a Toast: Toast.makeText( this, "Scanned: ${barcodeItem?.barcode?.text} (${barcodeItem?.barcode?.format})", Toast.LENGTH_LONG ).show() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContentView(R.layout.activity_main) ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) insets } findViewById








```

The code block above:

- Adds the “Start scanning” button.
- Imports and initializes the Scanbot SDK.
- Executes the user interface from the Scanbot SDK when the user clicks the “Start scanning” button.
- If a barcode is identified, it will present the barcode type and its content to the user.

💡 Without a license key, our SDK only runs for 60 seconds per session. This is more than enough for the purposes of our tutorial, but if you like, you can [generate a license key](https://scanbot.io/trial/) on our website.

Feel free to run the app to see if everything is working so far.

![Scanning a single barcode with our JavaScript barcode scanner](https://scanbot.io/wp-content/uploads/2024/07/javascript-barcode-scanner-tutorial-new-gif-single-scanning.gif)

### Step 3: Enable the AR overlay

The Scanbot SDK lets you display an AR overlay on the screen so users can pick a specific barcode when the scanner recognizes multiple barcodes. All you need to do to enable this feature is to add the following code after defining the `config` object:

```hljs cpp
config.useCase.arOverlay.visible = true;
config.useCase.arOverlay.automaticSelectionEnabled = false;




```

Run your app again to see the AR overlay in action.

![Scanning multiple barcodes with an AR overlay with our JavaScript barcode scanner](https://scanbot.io/wp-content/uploads/2024/07/javascript-barcode-scanner-tutorial-new-gif-multi-scanning-1.gif)

### Conclusion

🎉 That’s it! You now have a fully functional barcode scanning web app using the Scanbot SDK’s RTU UI.

Are you interested in how the scanner implementation works in your favorite JavaScript framework?

We’ve got you covered:

- [React.js](https://scanbot.io/techblog/react-barcode-reader-tutorial/)
- [Vue](https://scanbot.io/techblog/vue-js-barcode-scanner-tutorial/)
- [Angular](https://scanbot.io/techblog/angular-barcode-scanner-tutorial/)
- [Svelte](https://scanbot.io/techblog/svelte-barcode-scanner-tutorial/)
- [Next.js](https://scanbot.io/techblog/next-js-barcode-scanner-tutorial/)

Should you have any questions, feel free to reach out to us [on Slack or MS Teams](https://docs.scanbot.io/support/) or send us an email via [sdksupport@scanbot.io](mailto:sdksupport@scanbot.io)

Happy scanning! 🤳

## Ready to get started?

Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.

[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)

## Related blog posts

[![HTML5 Barcode Scanner Tutorial](https://scanbot.io/wp-content/uploads/2025/04/web-document-scanner-sdk-header-new-300x229.png)](https://scanbot.io/techblog/how-to-build-a-javascript-document-scanner-web-app/)

### [How to build a JavaScript Document Scanner web app](https://scanbot.io/techblog/how-to-build-a-javascript-document-scanner-web-app/)

We'll show you how to build a document scanning web app in minutes using only HTML, JavaScript, and our Web Document Scanner SDK.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg)
Kevin February 21, 20257 mins read

[![HTML5 Barcode Scanner Tutorial](https://scanbot.io/wp-content/uploads/2024/11/compose-multiplatform-barcode-scanner-sdk-300x229.png)](https://scanbot.io/techblog/compose-multiplatform-barcode-scanning-ui-tutorial/)

### [How to create a Compose Multiplatform iOS & Android barcode scanning application using the Scanbot SDK](https://scanbot.io/techblog/compose-multiplatform-barcode-scanning-ui-tutorial/)

Compose Multiplatform enables developers to write UI code compatible with both Android and iOS. We’ll walk you through the integration process with the Scanbot Barcode Scanner SDK.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-7-1.svg)
Ildar July 30, 202411 mins read

[![HTML5 Barcode Scanner Tutorial](https://scanbot.io/wp-content/uploads/2025/04/web-barcode-scanner-sdk-header-new-300x229.png)](https://scanbot.io/techblog/progressive-web-app-barcode-scanner-tutorial/)

### [How to build a Progressive Web App (PWA) Barcode Scanner with React and TypeScript](https://scanbot.io/techblog/progressive-web-app-barcode-scanner-tutorial/)

Learn how to build an installable barcode scanning PWA using React and our Web SDK in this step-by-step guide.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg)
Kevin January 7, 202510 mins read

+

## React Native Barcode Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

close

[Skip to content](https://scanbot.io/developer/react-native-barcode-scanner/?utm_source=chatgpt.com#main)

# React Native Barcode Scanner

Add fast and accurate barcode scanning to your React Native apps with the Scanbot React Native Barcode Scanner SDK. Seamlessly integrate real-time barcode scanning across iOS and Android platforms using a single codebase.

[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)

Trusted by
300+
global


industry leaders


![Volvo Customer](https://scanbot.io/wp-content/uploads/2024/12/company-volvo.svg)![Shiseido Customer](https://scanbot.io/wp-content/uploads/2024/09/company-shiseido.svg)![](https://scanbot.io/wp-content/uploads/2024/06/coop_logo-150x39.png)![PwC Customer](https://scanbot.io/wp-content/uploads/2024/05/company_pwc.svg)![TitleMax Customer](https://scanbot.io/wp-content/uploads/2023/10/company_title-max.svg)![Procter & Gamble Customer](https://scanbot.io/wp-content/uploads/2023/09/company_procter-and-gamble.svg)![Generali Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_generali-150x121.png)![Deutsche Telekom Case Study](https://scanbot.io/wp-content/uploads/2023/06/company_deutsche-telekom-150x72.png)![Deutsche Bahn Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_db-150x106.png)![AXA Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_axa-150x150.png)![ArcBest Customer](https://scanbot.io/wp-content/uploads/2023/06/company_arc-best-1-150x28.png)![Volvo Customer](https://scanbot.io/wp-content/uploads/2024/12/company-volvo.svg)![Shiseido Customer](https://scanbot.io/wp-content/uploads/2024/09/company-shiseido.svg)![](https://scanbot.io/wp-content/uploads/2024/06/coop_logo-150x39.png)![PwC Customer](https://scanbot.io/wp-content/uploads/2024/05/company_pwc.svg)![TitleMax Customer](https://scanbot.io/wp-content/uploads/2023/10/company_title-max.svg)![Procter & Gamble Customer](https://scanbot.io/wp-content/uploads/2023/09/company_procter-and-gamble.svg)![Generali Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_generali-150x121.png)![Deutsche Telekom Case Study](https://scanbot.io/wp-content/uploads/2023/06/company_deutsche-telekom-150x72.png)![Deutsche Bahn Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_db-150x106.png)![AXA Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_axa-150x150.png)![ArcBest Customer](https://scanbot.io/wp-content/uploads/2023/06/company_arc-best-1-150x28.png)

![image](https://scanbot.io/wp-content/uploads/2023/07/bento-img-updated.png)

Real-time AR feedback

With the React Native Barcode Scanner SDK, you can display important product information directly in the camera view while scanning barcodes.

![image](https://scanbot.io/wp-content/uploads/2023/07/bento_Img_native-1.png)

Barcode scanning in challenging conditions

The Scanbot React Native Barcode Scanner SDK is optimized to handle difficult real-world scanning environments, such as:

- Damaged barcodes
- Low-light environments
- Tiny or distant barcodes

[Customizable UI components\\
\\
Our Ready-To-Use UI components cover all barcode scanning scenarios and are highly customizable.](https://scanbot.io/rtu-ui/)

Fast.


Very fast.

Every scan happens in
0.04s
or less


Scans all major barcode types
Code 39

Code 93

Code 32

Code 25

EAN-5

PDF417

GS1 DataBar

Code 39

Code 93

Code 32

Code 25

EAN-5

PDF417

GS1 DataBar

EAN-13

MSI Plessey

EAN-2

Aztec Code

rMQR Code

Codabar

UPC-A

EAN-13

MSI Plessey

EAN-2

Aztec Code

rMQR Code

Codabar

UPC-A

EAN-8

ISBN

GiroCode

GS1-128

Data Matrix

IATA 2 of 5

EAN-8

ISBN

GiroCode

GS1-128

Data Matrix

IATA 2 of 5

Code 128

Code 11

QR Code

UPC-E

Micro QR Code

MaxiCode

Code 128

Code 11

QR Code

UPC-E

Micro QR Code

MaxiCode


## Add a fast and reliable Barcode Scanner to your React Native app

The Scanbot React Native [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) provides an easy way to integrate powerful barcode scanning functionalities into your React Native applications. With React Native, developers can build apps for both iOS and Android using a single codebase, ensuring consistent performance and ease of development.

Supporting key barcode formats such as [Data Matrix](https://scanbot.io/barcode-scanner-sdk/data-matrix/), [QR codes](https://scanbot.io/glossary/qr-code/), [PDF417](https://scanbot.io/barcode-scanner-sdk/pdf417/), and [EAN](https://scanbot.io/barcode-scanner-sdk/ean/), the SDK is perfect for applications in industries like retail, logistics, healthcare, and manufacturing. With customizable UI components, developers can quickly implement barcode scanning features while ensuring a seamless user experience. The SDK also handles challenging environments like low-light conditions and damaged barcodes, ensuring reliable scanning performance in any situation.

Need help? Our [expert support](https://docs.scanbot.io/support/) team is available via Slack, Microsoft Teams, or email to guide you through the integration process and ensure that your React Native app takes full advantage of the Scanbot Barcode Scanner SDK.

### Technical requirements

The Scanbot React Native Barcode Scanner SDK requires:

- **React Native Version**: 0.73 or higher
- **Platforms**: iOS 13.0+ and Android 5.0+ (API Level 21+)
- **Hardware**: A rear-facing camera with autofocus
- **Architecture:**
  - Android: armeabi-v7, arm64-v8a, x86, x86\_64
  - iOS: arm64, x86\_64

## Integrate  this evening    with  your framework

categoryFeatures

## Discover common React Native Barcode Scanning use cases

See how the scan modes of the Scanbot React Native Barcode Scanner can improve your workflows.

- ### Single Scanning




The React Native Barcode Scanner is ideal for scanning single barcodes in retail or inventory management applications. Users can scan barcodes quickly and accurately, improving overall efficiency.

- ### Batch Scanning




Allow users to scan multiple barcodes in a single session without needing to close the scanner. This feature is particularly useful for logistics, warehouse management, and order fulfillment applications.

- ### Multi Scanning




Capture several barcodes simultaneously with the React Native Camera Barcode Scanner, perfect for applications that need to handle large volumes of items in inventory management or logistics.



Learn more [Multi Barcode Scanner](https://scanbot.io/blog/enhancing-operations-with-multi-barcode-scanners/)

- ### Find & Pick




Provide one or more barcode values, and the SDK will highlight and scan the correct items. This is essential for warehouse picking or product identification in supply chain management.

- ### Scan & Count




Allow users to count multiple items in a single scan, making this feature ideal for inventory checks and warehouse audits, where accuracy and speed are important.


![Single Barcode Scanning SDK](https://scanbot.io/wp-content/uploads/2025/01/barcode-sdk-accordion1-768x790.png)![Batch Barcode Scanning](https://scanbot.io/wp-content/uploads/2025/01/barcode-sdk-accordion4-768x790.png)![Multi Barcode Scanner](https://scanbot.io/wp-content/uploads/2025/01/barcode-sdk-accordion5-768x790.png)![Find & Pick Barcode Scanner](https://scanbot.io/wp-content/uploads/2025/01/barcode-sdk-accordion2-768x790.png)![Scan & Count](https://scanbot.io/wp-content/uploads/2025/01/barcode-sdk-accordion3-768x790.png)

## How to integrate the Scanbot React Native Barcode Scanner using Ready-To-Use UI

The **Ready-To-Use UI** (RTU UI) is an easy-to-integrate and highly customizable high-level UI component that can handle most barcode scanning use cases and tasks.

The design and behavior of this component are based on our many years of experience as well as the feedback from our SDK customers.

Although the main idea of the RTU UI is to provide simple-to-integrate and simple-to-configure components, its customization capabilities are numerous and should suit most of your needs. To achieve an even higher degree of customization, you can implement a custom UI and business-logic using our [Native Components](https://docs.scanbot.io/barcode-scanner-sdk/react-native/barcode-scanner/native-components/).

**Import**

[​](https://docs.scanbot.io/barcode-scanner-sdk/react-native/barcode-scanner/ui-components/#import)

To use the RTU UI component please import  `startBarcodeScanner`  function and all related configurations and results from `react-native-scanbot-barcode-scanner-sdk/ui_v2`.

**Example:** [​](https://docs.scanbot.io/barcode-scanner-sdk/react-native/barcode-scanner/ui-components/#example)

```hljs javascript
import { startBarcodeScanner, BarcodeScannerConfiguration } from 'react-native-scanbot-barcode-scanner-sdk/ui_v2';




```

RTU UI v2 Default Configuration

```hljs csharp
// Create the default configuration object.
const config = new BarcodeScannerConfiguration();

// See further customization configs...

const result = await startBarcodeScanner(config);




```

[See full example on GitHub](https://github.com/doo/scanbot-barcode-scanner-sdk-example-react-native/blob/v5.1.1/src/utils/CodeSnippets.ts#L83-L88)

**Returns**

[​](https://docs.scanbot.io/barcode-scanner-sdk/react-native/barcode-scanner/ui-components/#returns)

- `result.status` – `OK`  If the scanning is completed, `CANCELED` if the user has canceled the operation (tapped on the “cancel” button).
- `result.data?.items` – Optional List of recognized barcodes as items. See the barcode item structure below.

Barcode item structure:

- `type` – Recognized barcode symbology.
- `count` – Number of recognized barcodes of this symbology and value.
- `text` – Recognized value of the barcode.
- `textWithExtension` – Recognized barcode value with extension (if available).
- `rawBytes` – Representation of the raw data that is contained the recognized barcode.
- `parsedDocument` – The parsed known document format (if parsed successfully).

## React Native Barcode Scanner for Expo

The Scanbot Barcode Scanner SDK can be integrated into React Native applications using the Expo framework. This integration is only possible when using an Expo development build.

Combining Expo’s framework with Scanbot SDK allows you to implement powerful barcode scanning features with minimal setup. The entire integration process can be completed in less than an hour, with comprehensive documentation and dedicated integration support available. Check out our comprehensive, step-by-step [tutorial](https://scanbot.io/techblog/react-native-scanner-tutorial/) that guides you through the entire process of integrating the React Native Barcode Scanner SDK into your Expo project.

[Read the full React Native Barcode Scanner SDK documentation](https://docs.scanbot.io/barcode-scanner-sdk/react-native/barcode-scanner/ui-components/)

## Ready to get started?

Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.

[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)

## Frequently Asked Questions

### **What are the key requirements for the Scanbot React Native Barcode Scanner SDK?**

The Scanbot React Native Barcode Scanner SDK has the following technical requirements:

**React Native Version**: 0.68 or higher

**Operating System**:

\- Android: 5.0 (API Level 21) and higher

\- iOS: 13.0 and higher

**Hardware**: A device with a rear-facing camera with autofocus

**Supported Architectures**:

\- Android: armeabi-v7, arm64-v8a, x86, x86\_64

\- iOS: arm64 (physical devices) and x86\_64 (simulators)

These requirements ensure compatibility with both iOS and Android platforms, allowing for smooth barcode scanning in React Native applications.

### **Can I use the React Native Barcode Scanner SDK offline?**

Yes, the Scanbot React Native Barcode Scanner SDK works fully offline. All barcode data is processed directly on the device, without requiring an internet connection. This makes it suitable for use cases where data privacy is important, such as in healthcare, logistics, and retail, as well as in remote environments where internet access may be unreliable.

### **Is there a trial version available for the React Native Barcode Scanner SDK?**

Yes, you can request a 7-day free trial license for the Scanbot React Native Barcode Scanner SDK. Simply visit the Scanbot SDK [trial request page](https://scanbot.io/trial/), fill in the required details, and you will receive a trial license to test all features of the SDK.

### **Is the Scanbot React Native Barcode Scanner SDK compatible with different Android and iOS devices?**

Yes, the Scanbot React Native Barcode Scanner SDK is compatible with a wide range of devices across both Android and iOS. Supported devices include:

1\. **Android**: Devices running Android 5.0 (API Level 21) or higher

2\. **iOS**: Devices running iOS 13.0 or higher

The SDK is optimized to work efficiently on both lower-end and high-performance devices, ensuring reliable barcode scanning across diverse hardware configurations.

### **How do I customize the React Native Barcode Scanner UI?**

The Scanbot React Native Barcode Scanner SDK provides customizable UI components, enabling you to modify the scanner’s layout and appearance to suit your app’s design. Customization options include:

1\. Customizing the scanner overlay

2\. Adjusting button colors and styles

3\. Modifying user feedback sounds and messages

These options allow you to seamlessly integrate barcode scanning into your app while maintaining your desired branding and user experience.

If you need more customization options, you can also integrate the SDK using Classical Components – giving you complete freedom over the design of the Scanner UI.

### **What platforms are supported besides React Native?**

In addition to React Native, the Scanbot SDK supports a variety of other platforms, making it versatile for developers working on multiple technologies. Supported platforms include:

1\. [iOS](https://scanbot.io/developer/ios-barcode-scanner-sdk/)

2\. [Android](https://scanbot.io/developer/android-barcode-scanner/)

3\. [JavaScript](https://scanbot.io/developer/javascript-barcode-scanner/) (Web)

4\. [Flutter](https://scanbot.io/developer/flutter-barcode-scanner/)

5\. [Cordova](https://scanbot.io/developer/cordova-barcode-scanner-plugin/)

6\. [Capacitor](https://scanbot.io/developer/capacitor-barcode-scanner-sdk/) / [Ionic](https://scanbot.io/developer/ionic-barcode-scanner/)

7\. [Xamarin](https://scanbot.io/developer/xamarin-barcode-scanner/)

8\. [.NET MAUI](https://scanbot.io/developer/net-maui-barcode-scanner-sdk/)

9\. [UWP](https://scanbot.io/developer/uwp-barcode-scanner/) (Universal Windows Platform)

10\. [Linux](https://scanbot.io/developer/linux-barcode-scanner/)

This multi-platform support ensures that the SDK can be integrated across mobile, web, and desktop applications, providing consistent functionality and performance.

### Does the Scanbot React Native Barcode Scanner SDK support Expo?

Yes. Integration with Expo is possible when using a development build. Check out the [tutorial](https://scanbot.io/techblog/react-native-scanner-tutorial/) to learn how to integrate the Scanbot SDK in a React Native app using the Expo framework.

+

## Cordova Barcode Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

close

[Skip to content](https://scanbot.io/developer/cordova-barcode-scanner-plugin/#main)

# Cordova Barcode Scanner Plugin

Seamlessly add fast, reliable barcode scanning to your Cordova-based hybrid apps. The Scanbot Cordova Barcode Scanner ensures real-time data capture across iOS and Android platforms.

[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)

Trusted by
300+
global


industry leaders


![Volvo Customer](https://scanbot.io/wp-content/uploads/2024/12/company-volvo.svg)![Shiseido Customer](https://scanbot.io/wp-content/uploads/2024/09/company-shiseido.svg)![](https://scanbot.io/wp-content/uploads/2024/06/coop_logo-150x39.png)![PwC Customer](https://scanbot.io/wp-content/uploads/2024/05/company_pwc.svg)![TitleMax Customer](https://scanbot.io/wp-content/uploads/2023/10/company_title-max.svg)![Procter & Gamble Customer](https://scanbot.io/wp-content/uploads/2023/09/company_procter-and-gamble.svg)![Generali Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_generali-150x121.png)![Deutsche Telekom Case Study](https://scanbot.io/wp-content/uploads/2023/06/company_deutsche-telekom-150x72.png)![Deutsche Bahn Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_db-150x106.png)![AXA Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_axa-150x150.png)![ArcBest Customer](https://scanbot.io/wp-content/uploads/2023/06/company_arc-best-1-150x28.png)![Volvo Customer](https://scanbot.io/wp-content/uploads/2024/12/company-volvo.svg)![Shiseido Customer](https://scanbot.io/wp-content/uploads/2024/09/company-shiseido.svg)![](https://scanbot.io/wp-content/uploads/2024/06/coop_logo-150x39.png)![PwC Customer](https://scanbot.io/wp-content/uploads/2024/05/company_pwc.svg)![TitleMax Customer](https://scanbot.io/wp-content/uploads/2023/10/company_title-max.svg)![Procter & Gamble Customer](https://scanbot.io/wp-content/uploads/2023/09/company_procter-and-gamble.svg)![Generali Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_generali-150x121.png)![Deutsche Telekom Case Study](https://scanbot.io/wp-content/uploads/2023/06/company_deutsche-telekom-150x72.png)![Deutsche Bahn Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_db-150x106.png)![AXA Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_axa-150x150.png)![ArcBest Customer](https://scanbot.io/wp-content/uploads/2023/06/company_arc-best-1-150x28.png)

![image](https://scanbot.io/wp-content/uploads/2023/07/bento-img-updated.png)

Real-time AR feedback

Enhance your app’s user experience with real-time AR feedback during barcode scanning in your Cordova app. Visual cues help guide users to improve accuracy and efficiency in barcode scanning.

![image](https://scanbot.io/wp-content/uploads/2023/07/bento_Img_native-1.png)

Barcode scanning in challenging conditions

The Scanbot Cordova Barcode Scanner is optimized for scanning barcodes in difficult real-world environments, such as:

- Damaged barcodes
- Low-light environments
- Tiny or distant barcodes

[Customizable UI components\\
\\
Our Ready-To-Use UI components cover all barcode scanning scenarios and are highly customizable.](https://scanbot.io/rtu-ui/)

Fast.


Very fast.

Every scan happens in
0.04s
or less


Scans all major barcode types
Code 39

Code 93

Code 32

Code 25

EAN-5

PDF417

GS1 DataBar

Code 39

Code 93

Code 32

Code 25

EAN-5

PDF417

GS1 DataBar

EAN-13

MSI Plessey

EAN-2

Aztec Code

rMQR Code

Codabar

UPC-A

EAN-13

MSI Plessey

EAN-2

Aztec Code

rMQR Code

Codabar

UPC-A

EAN-8

ISBN

GiroCode

GS1-128

Data Matrix

IATA 2 of 5

EAN-8

ISBN

GiroCode

GS1-128

Data Matrix

IATA 2 of 5

Code 128

Code 11

QR Code

UPC-E

Micro QR Code

MaxiCode

Code 128

Code 11

QR Code

UPC-E

Micro QR Code

MaxiCode


## Add fast and reliable Barcode Scanning to your Cordova app

Integrate the Scanbot Cordova [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) seamlessly into your hybrid applications. Our SDK provides APIs for scanning and parsing 1D and 2D barcodes, ensuring fast, accurate barcode recognition in real time.

The Scanbot Cordova Barcode Scanner Plugin supports a wide range of barcode formats, including QR codes, PDF417, and EAN, making it ideal for applications that require precise barcode scanning. Whether you’re developing solutions for warehouse management, supply chain logistics, or industrial asset tracking, the plugin ensures accurate and efficient scanning. Its flexibility also suits document digitization tasks, where the reliable capture of barcode data is critical for maintaining workflow accuracy and speed.

With our Ready-To-Use UI (RTU UI) components, you can quickly implement a fully functional barcode scanner without extensive coding. The SDK is designed for low-light environments and can handle damaged barcodes, providing reliability in various real-world scenarios.

Additionally, the SDK supports image-based barcode scanning, enabling users to scan barcodes from uploaded images. This feature adds flexibility for use cases like document management and inventory control.

### Technical requirements

The Scanbot Cordova Barcode Scanner Plugin requires the following:

- **Cordova CLI**:


9.x+

- **Cordova Platforms:** Android 10+, iOS 5.1+

- **Operating System**:


Android: 5.0 (API Level 21) and higher, iOS: 13.0 and higher

- **Architectures**:

  - Android: armeabi-v7, arm64-v8a, x86, x86\_64
  - iOS: arm64 for physical devices and x86\_64 for simulators

## Integrate  this evening    with

categoryFeatures

## Discover common Cordova Barcode Scanning use cases

See how the scan modes of the Scanbot Cordova Barcode Scanner Plugin can improve your workflows.

- ### Single Scanning




Perfect for scanning individual barcodes in inventory management or product lookups. The Scanbot Cordova Barcode Scanner ensures high accuracy for quick, single barcode scans.

- ### Batch Scanning




Allow users to scan multiple barcodes in succession without closing the scanner, making the Cordova Barcode Scanner Plugin ideal for logistics operations and order picking.

- ### Multi Scanning




Capture several barcodes simultaneously. This feature is perfect for warehouse management where multiple items need to be scanned in one go, improving workflow efficiency.

- ### Find & Pick




Given one or more barcode values, the Cordova Barcode Scanner Plugin will highlight and scan the correct items, simplifying warehouse picking and product identification.

- ### Scan & Count




Easily count multiple items with a single scan. This feature, supported by the Cordova Barcode Scanner Plugin, is useful for inventory checks, enabling fast and accurate processing of large numbers of items.


![Single Scanning](https://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-single-scanning-1-768x790.jpg)![Batch barcode scanning example image](https://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-batch-scanning-768x790.jpg)![multi scanning example image](https://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-multi-scanning-768x790.jpg)![Find & Pick](https://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-find-and-pick-768x790.jpg)![Scan and Count](https://scanbot.io/wp-content/uploads/2024/05/products-barcode-scanner-sdk-use-cases-scan-and-count-768x790.jpg)

## How to integrate the Scanbot Cordova Barcode Scanner

**Installation​**

The Scanbot Barcode Scanner SDK Cordova Plugin is available as an npm package `cordova-plugin-scanbot-barcode-scanner`.

You can simply install and add it to your Cordova project with the following command:

```
$ cordova plugin add cordova-plugin-scanbot-barcode-scanner
```

Or in an [Ionic](https://ionicframework.com/) based project:

```
$ ionic cordova plugin add cordova-plugin-scanbot-barcode-scanner
```

**Permissions​**

During the installation, this plugin will try to add all required permissions to your projects automatically. Here is a listing of those permissions to verify:

- **Android** (will be added in your `AndroidManifest.xml` file): `` – This permission is used for the camera views.
- **iOS** (will be added in your `Info.plist` file): `NSCameraUsageDescription` – “Privacy – Camera Usage Description”. Describe why your app wants to access the camera. By default, an empty string value will be added. You can change this value in the `config.xml` file of your Cordova project – see `CAMERA_USAGE_DESCRIPTION`.

[Read the full Cordova Barcode Scanner SDK documentation](https://docs.scanbot.io/barcode-scanner-sdk/cordova/getting-started/)

## Ready to get started?

Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.

[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)

## Frequently Asked Questions

### **What are the key requirements for the Scanbot Cordova Barcode Scanner SDK?**

The Scanbot Cordova Barcode Scanner SDK requires:

**Operating System:**\- Android: 5.0 (API Level 21) and higher

\- iOS: 13.0 and higher

**Cordova CLI:** Version 9.x or higher

**Hardware:** Devices must have a rear-facing camera with autofocus

**Supported Architectures:**\- Android: armeabi-v7, arm64-v8a, x86, x86\_64

\- iOS: arm64 (physical devices) and x86\_64 (simulators)

### **Can I use the Cordova Barcode Scanner SDK offline?**

Yes, the Scanbot Cordova Barcode Scanner SDK works fully offline, ensuring that barcode data is processed directly on the device without needing an internet connection. This is particularly useful for field operations, remote locations, and situations where data privacy is crucial.

### **Does the Cordova Barcode Scanner SDK work with all types of barcodes?**

Yes, the SDK supports a wide range of 1D and 2D barcodes, including:

**1D Barcodes:** UPC, EAN, Code 128, Code 39, ITF, and more

**2D Barcodes:** QR codes, [PDF417](https://scanbot.io/barcode-scanner-sdk/pdf417/), [DataMatrix](https://scanbot.io/barcode-scanner-sdk/data-matrix/), Aztec, and more

This broad compatibility ensures the SDK can be used across various industries like logistics, healthcare, and retail. You can find a list of all supported barcodes [here](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/).

### **What platforms are supported besides Cordova?**

Besides Cordova, the Scanbot SDK supports:

1\. [iOS](https://scanbot.io/developer/ios-barcode-scanner-sdk/)

2\. [Android](https://scanbot.io/developer/android-barcode-scanner/)

3\. [JavaScript](https://scanbot.io/developer/javascript-barcode-scanner/) (Web)

4\. [Flutter](https://scanbot.io/developer/flutter-barcode-scanner/)

5\. [React Native](https://scanbot.io/developer/react-native-barcode-scanner/)

6\. [Capacitor](https://scanbot.io/developer/capacitor-barcode-scanner-sdk/) / [Ionic](https://scanbot.io/developer/ionic-barcode-scanner/)

7\. [Xamarin](https://scanbot.io/developer/xamarin-barcode-scanner/)

8\. [.NET MAUI](https://scanbot.io/developer/net-maui-barcode-scanner-sdk/)

9\. [UWP](https://scanbot.io/developer/uwp-barcode-scanner/) (Universal Windows Platform)

10\. [Linux](https://scanbot.io/developer/linux-barcode-scanner/)

This flexibility allows developers to integrate barcode scanning into web, mobile, and desktop applications.

### **How can I integrate a Cordova Barcode Scanner Plugin into my app?**

To integrate a Cordova Barcode Scanner Plugin into your app, you typically add a barcode scanning SDK to your project, configure supported barcode formats, and initialize the scanner in your app's workflow. These SDKs usually support formats like QR codes, PDF417, and Code 128. If you want the fastest and most reliable solution, you need to choose the Scanbot SDK – trusted by over 250 enterprises worldwide.

You can find detailed installation instructions in the [Scanbot SDK Cordova Barcode Scanner Documentation](https://docs.scanbot.io/barcode-scanner-sdk/cordova/introduction/).

### **Is there a trial version available for the Cordova Barcode Scanner SDK?**

Yes, you can obtain a 7-day free trial license for the Scanbot Cordova Barcode Scanner SDK. Visit the Scanbot SDK [trial page](https://scanbot.io/trial/) to request a trial license key. The trial version allows you to test the full SDK without any functional limitations.

### **What is the performance of the Cordova Barcode Scanner SDK in low-light conditions?**

The Scanbot Cordova Barcode Scanner SDK is optimized to work in challenging environments, including low-light conditions. The SDK uses advanced image processing techniques to ensure accurate barcode detection even in suboptimal lighting, making it suitable for applications in warehouses, factories, and other industrial environments.

### **How can I customize the Scanbot Cordova Barcode Scanner UI?**

The Scanbot Cordova Barcode Scanner SDK provides customizable UI components that allow you to adjust the look and feel of the barcode scanner interface. You can customize the colors, layout, and behavior of the scanner to match your app’s design and branding requirements.

Customization can be done by passing UI configuration parameters when initializing the scanner component.

### **Is the Cordova Barcode Scanner SDK GDPR- and CCPA-compliant?**

Yes, the Scanbot Cordova Barcode Scanner SDK is fully GDPR- and CCPA-compliant, since the SDK processes all barcode data locally on the device and does not require an internet connection. No data is transmitted to external servers, ensuring full compliance with data privacy regulations.

+

## Windows Tablets Barcode Scanners
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

close

[Skip to content](https://scanbot.io/blog/windows-tablets-barcode-scanners/?utm_source=chatgpt.com#main)

Windows tablets offer portability and ease-of-use while seamlessly integrating into an existing Windows IT infrastructure. This makes them ideal devices for implementing enterprise-wide barcode technology that seamlessly communicates with your backend solution.

The [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) equips your Windows tablets with a powerful barcode scanning solution. Not only is it lightning-fast, it is also highly accurate, even in less than ideal conditions. Thanks to batch scanning and similar features, even large amounts of barcodes can be captured in no time. Tailored modules for very small or distant codes cover all kinds of special use cases.

If you already use Windows tablets in your company, the Scanbot SDK can be integrated in a matter of days. If, on the other hand, you are still deciding which device is the best fit for your use case, this guide is for you. We will provide you with an overview of the hardware characteristics you should look out for and present you with suggestions for Windows tablets with various configurations.

Despite the technological advances in recent decades, many companies still rely heavily on manual data entry. In doing so, they accept the risk of introducing errors into their datasets and information processes. In the long run, this costs them countless hours and millions of dollars. According to a [report by IBM](https://www.ibm.com/downloads/cas/EDJANVZY), businesses lose almost $10 million annually on average due to poor data quality.

Even if they do not involve data entry, most manual workflows are inefficient and time-consuming. Automating them can thus boost productivity considerably. However, this often involves purchasing costly and complex software and deep changes to existing business processes, making automation an intimidating endeavor.

Barcodes, on the other hand, are a time-tested technology that not only eliminates human error, but also makes it easy to introduce automated workflows. Since their introduction in US supermarkets during the 1970s, [1D and 2D barcodes](https://scanbot.io/blog/types-of-barcodes/) have found their way into just about any industry, from [manufacturing](https://scanbot.io/resources/brochures/manufacturing-use-cases/) to air travel, from [insurance](https://scanbot.io/solutions/insurance/) to logistics.

To ensure an optimal performance of our Barcode Scanner SDK, your devices should fulfill certain hardware and software requirements:

|     |     |     |
| --- | --- | --- |
|  | **Minimum** | **Recommended** |
| **Architecture** | Intel x64 | Intel x64 |
| **Processor** | i3 | i5 or higher |
| **RAM** | 4 GB
(barcode scanning only) | 8 GB or more | | **Operating system** | Windows 10 or 11 | Windows 10 or 11 | | **Camera Resolution** | 5 MP | 8 MP or more | Devices with x86 64-bit architecture (x64 for short) provide the best software compatibility. These tablets use chips by Intel or, more rarely, AMD. The ARM architecture powering many mobile devices is currently not sufficiently supported by Microsoft, even though their Surface Pro X tablet and some Surface Pro 9 devices use it. As a result, a lot of Windows software will not run properly on ARM hardware, and this includes our Windows SDK. When it comes to the performance of the processor (CPU), Intel’s Core line will be necessary to ensure smooth operation. These currently range from Core i3 to Core i9. An i3 processor will work, but is not ideal, depending on how fast you want to scan and decode your barcodes. If you can, go for i5 or i7 instead. The i9 series of CPUs is very powerful, but also costly, and likely will not provide a huge performance boost to our SDK. Since Windows is first and foremost a desktop operating system, your device will need more RAM to run it smoothly than it would require for Android or iOS. This means that 4 GB are a must even for less resource-intensive applications, including our Barcode Scanner. If you plan to use more complex software, go with at least 8 GB of RAM. You can use Windows 10 or Windows 11 as an operating system. Windows 8 and earlier are unfortunately incompatible with our software. Windows OSes come in Home and Pro versions, which differ in the advanced features they include. Both work equally well with our SDK. However, you should make sure that your chosen version has the features your enterprise needs to integrate the devices into its IT infrastructure. Fortunately, upgrading from Home to Pro is always possible. **Would you like to discover more about what makes a good Windows-based mobile barcode scanner? Get full insight by downloading our [Windows Device Guide 2023](https://scanbot.io/resources/ebooks/windows-device-guide-2023/), which also includes an overview of current models in different price ranges**. [![Windows Device Guide 2023](https://scanbot.io/wp-content/uploads/2023/07/ebook_windows_device_guide-1024x702.jpg)](https://scanbot.io/resources/ebooks/windows-device-guide-2023/) ## Ready to get started? Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away. [Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/) ## Related blog posts [![Windows tablets into barcode scanners](https://scanbot.io/wp-content/uploads/2023/07/Windows-SDK-Header-768x362.jpg)](https://scanbot.io/blog/meet-our-windows-barcode-scanner/) ### [Meet our Barcode Scanner SDK for Windows](https://scanbot.io/blog/meet-our-windows-barcode-scanner/) Our Barcode Scanning solution is now available for the Universal Windows Platform (UWP). ![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg) Kevin November 10, 20222 mins read [![Windows tablets into barcode scanners](https://scanbot.io/wp-content/uploads/2023/08/Scanning-SDK-Header-768x362.jpg)](https://scanbot.io/techblog/developing-a-scanning-sdk-for-windows-a-first-hand-account/) ### [Developing a scanning SDK for Windows: A first-hand account](https://scanbot.io/techblog/developing-a-scanning-sdk-for-windows-a-first-hand-account/) One of our software engineers shares his experiences with developing our new Windows SDK. Trials and tribulations await. ![](https://scanbot.io/wp-content/uploads/2024/10/author-avatar-14.svg) Aare June 20, 202317 mins read [![Windows tablets into barcode scanners](https://scanbot.io/wp-content/uploads/2023/08/windows-barcode-demo-blog-hero-1-1-1.png)](https://scanbot.io/blog/our-barcode-scanner-demo-app-is-now-available-on-windows/) ### [Our Barcode Scanner Demo App is now available on Windows](https://scanbot.io/blog/our-barcode-scanner-demo-app-is-now-available-on-windows/) The "Scanbot SDK: Barcode Scanning" app is now available for free on the Microsoft Store. ![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg) Kevin June 26, 20232 mins read + ## Ionic Barcode Scanner Tutorial Scanbot SDK has been acquired by Apryse! [Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft) [Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft) close [Skip to content](https://scanbot.io/techblog/ionic-capacitor-barcode-scanner-tutorial/#main) Setting up an app in Ionic Capacitor capable of scanning any 1D or 2D barcode is very straightforward. All we need are the following steps: 1. Prepare the project 2. Install the SDK 3. Initialize the SDK 4. Implement the scanning modules 5. Scan some barcodes! Thanks to our SDK’s Ready-to-Use UI Components, you can even use an AR overlay to display multiple barcodes’ contents right in the viewfinder. ![Scanning a single barcode](https://scanbot.io/wp-content/uploads/2025/02/single-barcode-scanning-gif.gif)Scanning a single barcode ![Scanning multiple barcodes with the AR overlay](https://scanbot.io/wp-content/uploads/2025/02/multi-barcode-scanning-gif.gif)Scanning multiple barcodes with the AR overlay ## Requirements Before starting development with Capacitor, you need to [set up your environment](https://capacitorjs.com/docs/getting-started/environment-setup). The prerequisites for developing Ionic Capacitor apps are: **Core requirements:** - Node.js version 18 or higher **For iOS development:** - macOS - Xcode - Xcode Command Line Tools - Homebrew - Cocoapods **For Android development:** - Android Studio - Android SDK To get the full benefits and experience from using our SDK, we also recommend real devices for testing. Developing Capacitor applications can be done via CLI or using the [VS Code extension](https://capacitorjs.com/docs/getting-started/vscode-extension). In this tutorial we will use CLI commands. However, feel free to follow along using whatever option suits you best. Capacitor can be used with different frameworks. In this tutorial, we will use **Capacitor with Ionic and Angular**. Again, these choices depend on your needs and prior knowledge. Since we’ll use Ionic in this tutorial, you also need to [install the Ionic CLI](https://ionicframework.com/docs/intro/cli) if you haven’t already: ```hljs dart npm install -g @ionic/cli ``` ## 1\. Preparing the project To start creating your Capacitor app with Ionic using the CLI, run the following command in the terminal, which will create a blank project with some recommended Capacitor dependencies: ```hljs wasm ionic start CapacitorTutorial blank --capacitor --type angular-standalone --package-id io.scanbot.tutorial.capacitor ``` ⚠️ When using your own license, make sure that the `package-id` is the same as the application/bundle ID associated with it. ### Generate the native projects Now, let’s add the Android and iOS platforms to our project. Navigate into the project directory: ```hljs undefined cd CapacitorTutorial ``` Add Android and iOS as platforms: ```hljs dart npm i @capacitor/android @capacitor/ios ``` Run the following commands to create the native Android and iOS projects: ```hljs csharp npx cap add android npx cap add ios ``` ## 2\. Installing the SDK To install the Scanbot Capacitor Barcode Scanner SDK, run: ```hljs undefined npm i capacitor-plugin-scanbot-barcode-scanner-sdk ``` 💡 This will install the latest Scanbot SDK version. You can find more information about each version in our [changelog](https://docs.scanbot.io/barcode-scanner-sdk/capacitor/changelog/). Now that the npm package has been installed, we need to make some changes to the native projects. ### Android For Android, we need to add the camera permission and feature in **android/app/src/main/AndroidManifest.xml**: ```hljs html ``` ### iOS For iOS, we need to include a description for the camera permission in **ios/App/App/Info.plist** anywhere inside the `` element: ```hljs html NSCameraUsageDescription Camera permission is needed to scan barcodes ``` Now that the project is set up, we can start integrating the barcode scanning functionalities. ## 3\. Initializing the SDK Before using any feature of the Capacitor Barcode Scanner SDK, we need to initialize it. Ideally, initialization should be done once, as soon as the app is fully launched. In this tutorial, we’re going to initialize the SDK inside the `ngOnInit` callback in the **src/app/app.component.ts** file and make sure that we import the `ScanbotBarcodeSDK`. Your **app.component.ts** should then look like this: ```hljs typescript import { Component, OnInit } from '@angular/core'; import { IonApp, IonRouterOutlet } from '@ionic/angular/standalone'; import { ScanbotBarcodeSDK } from 'capacitor-plugin-scanbot-barcode-scanner-sdk'; @Component({ selector: 'app-root', templateUrl: 'app.component.html', standalone: true, imports: [IonApp, IonRouterOutlet], }) export class AppComponent implements OnInit { constructor() { } ngOnInit(): void { ScanbotBarcodeSDK.initializeSdk({ licenseKey: "" }).then(result => console.log(result)) .catch(err => console.log(err)); } } ``` 💡 Without a license key, our SDK only runs for 60 seconds per session. This is more than enough for the purposes of our tutorial, but if you like, you can [generate a license key](https://scanbot.io/trial/) using the application/bundle ID. ## 4\. Implementing the scanning modes Our [RTU UI components](https://docs.scanbot.io/barcode-scanner-sdk/capacitor/barcode-scanner/ui-components/) make it easy to deploy our Barcode Scanner SDK’s different scanning modes in your app. Let’s start with the simplest use case: single-barcode scanning. In your project folder, go to **scr/app/home/home.page.ts**, add the necessary imports, and create a method that will start the single-barcode scanning use case. The result should look something like this: ```hljs typescript import { Component } from '@angular/core'; import { IonHeader, IonToolbar, IonTitle, IonContent, IonButton } from '@ionic/angular/standalone'; import { ScanbotBarcodeSDK } from 'capacitor-plugin-scanbot-barcode-scanner-sdk'; import { startBarcodeScanner, BarcodeScannerConfiguration, SingleScanningMode } from 'capacitor-plugin-scanbot-barcode-scanner-sdk/ui_v2'; @Component({ selector: 'app-home', templateUrl: 'home.page.html', styleUrls: ['home.page.scss'], standalone: true, imports: [IonHeader, IonToolbar, IonTitle, IonContent, IonButton], }) export class HomePage { constructor() {} async startSingleBarcodeScan() { try { /** Check license status and return early if the license is not valid */ if (!(await ScanbotBarcodeSDK.getLicenseInfo()).data?.isLicenseValid) { return; } /** * Instantiate a configuration object of BarcodeScannerConfiguration and * start the barcode scanner with the configuration */ const config = new BarcodeScannerConfiguration(); /** Initialize the use case for single scanning */ config.useCase = new SingleScanningMode(); /** Start the BarcodeScanner */ const result = await startBarcodeScanner(config); /** Handle the result if there are scanned barcodes */ if (result.data && result.data?.items.length > 0) { alert( 'Barcode Scanning successfully! \n' + `Value: ${result.data.items[0].text} \n` + `Type: ${result.data.items[0].type}` ); } } catch (e: any) { console.error("An error has occurred while running Barcode Scanner", e.message); } } } ``` Next, go to **scr/app/home/home.page.html** and add a button that calls our `startSingleBarcodeScan` method when clicked. Your **home.page.html** should look something like this: ```hljs html Capacitor Tutorial Capacitor Tutorial
Start single barcode scanning
``` We can add our multi-scanning and AR overlay use cases in a similar manner. Just add `MultipleScanningMode` to the import: ```hljs javascript import { startBarcodeScanner, BarcodeScannerConfiguration, SingleScanningMode, MultipleScanningMode } from 'capacitor-plugin-scanbot-barcode-scanner-sdk/ui_v2'; ``` And create two more methods: ```hljs typescript async startMultiBarcodeScan() { try { /** Check license status and return early if the license is not valid */ if (!(await ScanbotBarcodeSDK.getLicenseInfo()).data?.isLicenseValid) { return; } /** * Instantiate a configuration object of BarcodeScannerConfiguration and * start the barcode scanner with the configuration */ const config = new BarcodeScannerConfiguration(); /** Initialize the use case for multi-scanning */ config.useCase = new MultipleScanningMode(); /** Start the BarcodeScanner */ const result = await startBarcodeScanner(config); /** Handle the result */ if (result.data && result.data?.items.length > 0) { alert( 'Barcode Scanning successfully! \n' + `${result.data.items.map(barcode => `Barcode value: ${barcode.text} and type: ${barcode.type}` ).join("\n")}`); } } catch (e: any) { console.error("An error has occurred while running Barcode Scanner", e.message); } } async startAROverlayBarcodeScan() { try { /** Check license status and return early if the license is not valid */ if (!(await ScanbotBarcodeSDK.getLicenseInfo()).data?.isLicenseValid) { return; } /** * Instantiate a configuration object of BarcodeScannerConfiguration and * start the barcode scanner with the configuration */ const config = new BarcodeScannerConfiguration(); /** Initialize the use case for multi-scanning */ config.useCase = new MultipleScanningMode(); /** Configure AR Overlay. */ config.useCase.arOverlay.visible = true; config.useCase.arOverlay.automaticSelectionEnabled = false; /** Start the BarcodeScanner */ const result = await startBarcodeScanner(config); /** Handle the result */ if (result.data && result.data?.items.length > 0) { alert( 'Barcode Scanning successfully! \n' + `${result.data.items.map(barcode => `Barcode value: ${barcode.text} and type: ${barcode.type}` ).join("\n")}`); } } catch (e: any) { console.error("An error has occurred while running Barcode Scanner", e.message); } } ``` Next, go back to **scr/app/home/home.page.html** and add buttons for the multi-scanning and AR overlay use cases: ```hljs html Start multi-barcode scanning Start AR Overlay barcode scanning ``` We’re now ready to build and run the app! ## 5\. Build the app and scan some barcodes! In the terminal, run these commands to build and sync the native projects: ```hljs dart npm run build npx cap sync ``` To run the app on Android and iOS, use the following commands: **For Android:** ```hljs undefined npx cap run android ``` **For iOS:** To run the app on a real iOS device, you need to adjust the _Provisioning_ and _Signing_ settings. Open **ios/App/App.xcworkspace** with Xcode, manage the signing and provisioning settings, and run the project from Xcode or with this command: ```hljs undefined npx cap run ios ``` Now you can go ahead and scan 1D and 2D barcodes – one after the other, many at the same time, and even with an AR overlay that lets you preview their values! ![Scanning multiple barcodes with the AR overlay](https://scanbot.io/wp-content/uploads/2025/02/multi-barcode-scanning-gif.gif) And if you’re in need of some sample barcodes for testing purposes, we’ve got you covered: ![Various barcodes for testing](https://scanbot.io/wp-content/uploads/2024/06/ios-barcode-scanner-sdk-integration-tutorial-test-barcodes.png) ## Choosing the best barcode scanner solution for your Ionic Capacitor app When integrating an Ionic Barcode Scanner into your application, it’s essential to ensure speed, accuracy, and seamless user experience. The right barcode scanner plugin should not only support a variety of QR codes and supported barcodes but also integrate easily within the Ionic Framework. Here are key considerations to keep in mind: ### Speed and accuracy An effective barcode scanner should prioritize fast and accurate scanning, even in challenging conditions such as poor lighting or awkward angles. The ability to recognize multiple formats quickly enhances usability, reducing the need for rescans. To optimize performance: - Test how well the scanner detects supported barcodes in different orientations and lighting conditions. - Ensure default settings provide a smooth experience but allow users to modify configurations if needed. - Consider enabling features such as flash toggling for better visibility. ### Easy integration and customization A high-quality barcode scanner plugin should be easy to integrate and flexible enough for customization. The Scanbot SDK, for example, provides [Ready-to-Use UI Components](https://docs.scanbot.io/barcode-scanner-sdk/capacitor/barcode-scanner/ui-components/) that streamline development. For customization: - You should be able to modify the scanner’s appearance and functionality to match your app’s branding. - The plugin should [work across multiple platforms](https://scanbot.io/techblog/how-to-build-a-cross-platform-barcode-scanner/), including web. - If using an enterprise-grade solution is not an option, support for advanced features like ML Kit integration can further enhance scanning capabilities. ### Security and offline capabilities Data security is critical in barcode scanning applications. A reliable scanner should function entirely offline, ensuring that sensitive information is not sent to external servers. The Scanbot SDK guarantees that all scanned data remains secure on the device. ### Cross-device Support Your barcode scanner should work seamlessly across various device models and operating systems. Ensuring compatibility with different camera types enhances usability, whether the user is on a high-end smartphone or a more basic device. ### Example and repository resources For developers looking to dive deeper, reviewing a [GitHub repository with an example project](https://github.com/doo/scanbot-barcode-scanner-sdk-example-capacitor-ionic) can be highly beneficial. Sample projects help understand implementation details and how to enable different scanner features effectively. By following these best practices, you can ensure your Ionic Barcode Scanner application provides a robust, user-friendly experience while maintaining flexibility and high performance. ## Conclusion If this tutorial has piqued your interest in integrating barcode scanning functionalities into your Ionic Capacitor app, make sure to take a look at our SDK’s other neat features in our [documentation](https://docs.scanbot.io/barcode-scanner-sdk/capacitor/introduction/). Furthermore, you can take a look at and run our [public example project](https://github.com/doo/scanbot-barcode-scanner-sdk-example-capacitor-ionic). Should you have questions about this tutorial or ran into any issues, we’re happy to help! Just shoot us an email via [tutorial-support@scanbot.io](mailto:tutorial-support@scanbot.io). Happy coding! ## Ready to get started? Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away. [Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/) ## Related blog posts [![Ionic Capacitor Barcode Scanner SDK](https://scanbot.io/wp-content/uploads/2024/09/react-native-barcode-scanner-sdk-header-300x229.png)](https://scanbot.io/techblog/react-native-scanner-tutorial/) ### [React Native Barcode Scanner tutorial – Expo integration guide](https://scanbot.io/techblog/react-native-scanner-tutorial/) Learn how to use Expo to easily integrate powerful barcode scanning functionalities into your React Native app. ![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-7-1.svg) Stefan September 17, 202413 mins read [![Ionic Capacitor Barcode Scanner SDK](https://scanbot.io/wp-content/uploads/2025/03/net-maui-barcode-scanner-sdk-header-300x229.png)](https://scanbot.io/techblog/net-maui-barcode-scanner-sdk-integration-tutorial/) ### [Building a .NET MAUI Barcode Scanner with C\#](https://scanbot.io/techblog/net-maui-barcode-scanner-sdk-integration-tutorial/) Create a cross-platform Android and iOS app for scanning barcodes and QR codes using .NET MAUI and C#. ![](https://scanbot.io/wp-content/uploads/2024/10/author-avatar-12.svg) Matthew July 7, 20257 mins read [![Ionic Capacitor Barcode Scanner SDK](https://scanbot.io/wp-content/uploads/2025/04/web-barcode-scanner-sdk-header-new-300x229.png)](https://scanbot.io/techblog/progressive-web-app-barcode-scanner-tutorial/) ### [How to build a Progressive Web App (PWA) Barcode Scanner with React and TypeScript](https://scanbot.io/techblog/progressive-web-app-barcode-scanner-tutorial/) Learn how to build an installable barcode scanning PWA using React and our Web SDK in this step-by-step guide. ![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg) Kevin January 7, 202510 mins read + ## iOS Document Scanner SDK Scanbot SDK has been acquired by Apryse! [Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft) [Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft) close [Skip to content](https://scanbot.io/developer/ios-document-scanner/?utm_source=chatgpt.com#main) # iOS Document Scanner SDK Add high-quality document scanning to your native iOS app [Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/) Trusted by 300+ global industry leaders ![Volvo Customer](https://scanbot.io/wp-content/uploads/2024/12/company-volvo.svg)![Shiseido Customer](https://scanbot.io/wp-content/uploads/2024/09/company-shiseido.svg)![](https://scanbot.io/wp-content/uploads/2024/06/coop_logo-150x39.png)![PwC Customer](https://scanbot.io/wp-content/uploads/2024/05/company_pwc.svg)![TitleMax Customer](https://scanbot.io/wp-content/uploads/2023/10/company_title-max.svg)![Procter & Gamble Customer](https://scanbot.io/wp-content/uploads/2023/09/company_procter-and-gamble.svg)![Generali Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_generali-150x121.png)![Deutsche Telekom Case Study](https://scanbot.io/wp-content/uploads/2023/06/company_deutsche-telekom-150x72.png)![Deutsche Bahn Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_db-150x106.png)![AXA Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_axa-150x150.png)![ArcBest Customer](https://scanbot.io/wp-content/uploads/2023/06/company_arc-best-1-150x28.png)![Volvo Customer](https://scanbot.io/wp-content/uploads/2024/12/company-volvo.svg)![Shiseido Customer](https://scanbot.io/wp-content/uploads/2024/09/company-shiseido.svg)![](https://scanbot.io/wp-content/uploads/2024/06/coop_logo-150x39.png)![PwC Customer](https://scanbot.io/wp-content/uploads/2024/05/company_pwc.svg)![TitleMax Customer](https://scanbot.io/wp-content/uploads/2023/10/company_title-max.svg)![Procter & Gamble Customer](https://scanbot.io/wp-content/uploads/2023/09/company_procter-and-gamble.svg)![Generali Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_generali-150x121.png)![Deutsche Telekom Case Study](https://scanbot.io/wp-content/uploads/2023/06/company_deutsche-telekom-150x72.png)![Deutsche Bahn Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_db-150x106.png)![AXA Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_axa-150x150.png)![ArcBest Customer](https://scanbot.io/wp-content/uploads/2023/06/company_arc-best-1-150x28.png) Simple to use for anyone Allow even non-tech-savvy users to easily create crisp document scans with user guidance, automatic capture, auto-cropping, and more. ![image](https://scanbot.io/wp-content/uploads/2024/05/document-simple-phone.png) On-device intelligence 100% offline – no servers, no tracking, complete data security. [Customizable UI components\\ \\ Our Ready-To-Use UI components cover all document scanning scenarios and are highly customizable.](https://scanbot.io/rtu-ui/) High-quality scans Let your users generate high-quality scans suitable for automated processing. Available for App & Web The SDK supports iOS, Android, Web, Windows, Linux, and all common cross-platform frameworks, including Flutter, React Native, and .NET MAUI. ## Turn mobile devices into easy-to-use, high-quality document scanners The Scanbot [Document Scanner SDK](https://scanbot.io/document-scanner-sdk/) for iOS provides everything you need to integrate swift document scanning into your app. It operates entirely offline, ensuring secure data processing and full compliance with privacy regulations like GDPR and CCPA/CPRA. Whether scanning documents with the device’s camera or processing imported images, the SDK applies image optimization features to ensure top-quality results. It also comes with Ready-To-Use UI (RTU UI) components, allowing integration in under an hour. These components can be customized to match your app’s workflow and branding, making the iOS Document Scanner SDK easy to implement and use. Dedicated chat support is available for customers via Slack, Microsoft Teams, or email. Non-customers can also get [integration assistance](https://docs.scanbot.io/support/) from our support engineers. ### Technical requirements The Scanbot iOS Document Scanner SDK has the following technical requirements: - Operating System: iOS 13 or higher - IDE: Xcode 14.0 or higher - Language: Fully compatible with Swift & Objective-C for seamless integration ## Integrate this evening with categoryFeatures ## Learn more about our document scanning features The iOS Document Scanner SDK offers a comprehensive set of features designed to enhance the scanning experience and improve output quality. - ### User Guidance Ease of use is crucial for any app’s design, especially with a large user base. Our on-screen user guidance helps even non-tech-savvy users create the perfect scan. - ### Automatic Capture The SDK automatically triggers the scan when the device is ideally positioned over the document. This minimizes submissions of blurry or incomplete scans. - ### Automatic Cropping Our SDK automatically straightens and crops documents, producing high-quality scans every time. - ### Document Quality Analyzer This feature automatically rates the scan quality from “very poor” to “excellent.” If it is low, it can prompt the user to rescan. This allows you to build quality checks into your workflow. - ### Custom Filters Every use case has specific image requirements. The SDK’s custom filters allow you to transform document images into optimal input for your backend systems. They include grayscale, several binarization options, and more. - ### Multiple Export Formats The Scanbot Document Scanner SDK supports several output formats for compatibility with all standard backend systems: JPG, PDF, TIFF, and PNG. ![User Guidance](https://scanbot.io/wp-content/uploads/2025/01/document-sdk-accordion1-768x790.png)![Automatic Capture](https://scanbot.io/wp-content/uploads/2025/01/document-sdk-accordion2-768x790.png)![Automatic Cropping](https://scanbot.io/wp-content/uploads/2025/01/document-sdk-accordion3-768x790.png)![Document Quality Analyzer](https://scanbot.io/wp-content/uploads/2025/01/document-sdk-accordion4-768x790.png)![Custom Filters](https://scanbot.io/wp-content/uploads/2025/01/document-sdk-accordion5-768x790.png)![Multiple Export Formats](https://scanbot.io/wp-content/uploads/2025/01/document-sdk-accordion6-768x790.png) ## How to integrate the Scanbot iOS Document Scanner SDK using Ready-to-Use UI Our revamped Ready-To-Use UI Components for iOS and Android Document Scanner SDKs offer a refined and enhanced document scanning experience with built-in review capabilities. This version not only simplifies the integration process but also introduces a comprehensive document management interface. Users can now review scanned documents, rotate, crop, reorder, retake specific pages, and delete one or all pages directly within the scanner. Additionally, the scanning process is enriched with engaging animation feedback and document acknowledgment features, ensuring high-quality scans by allowing users to verify and decide whether to keep or retake the scanned image. Although the main idea of the RTU UI is to provide simple-to-integrate and simple-to-configure components, its customization capabilities are numerous and should suit most of your needs. To achieve an even higher degree of customization, you can implement a custom UI and business-logic using our Classic UI Components. **Launching the scanner** In this section, we’ll show you how to start the Document Scanner with minimal code. We’ll also describe how to configure it extensively later on. ``` import ScanbotSDK class DocumentLaunchingUI2SwiftViewController: UIViewController { override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) self.startScanning() } func startScanning() { // Create the default configuration object. let configuration = SBSDKUI2DocumentScanningFlow() // Present the recognizer view controller modally on this view controller. SBSDKUI2DocumentScannerController.present(on: self, configuration: configuration) { document in // Completion handler to process the result. if let document { // Handle the document. } else { // Indicates that the cancel button was tapped. } } } } ``` [Read the full iOS Document Scanner SDK documentation](https://docs.scanbot.io/document-scanner-sdk/ios/features/document-scanner/ready-to-use-ui/) ## Ready to get started? Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away. [Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/) ## Frequently Asked Questions ### What is an iOS Document Scanner SDK? An iOS Document Scanner SDK allows developers to integrate document scanning capabilities into their iOS apps. It includes tools for capturing, processing, and exporting scanned documents, with features such as automatic cropping, edge detection, and image quality analysis. ### How can I ensure high-quality document scans in my iOS app? To guarantee high-quality scans, use an SDK with features like automatic cropping, edge detection, and document quality analysis. The Scanbot iOS Document Scanner SDK offers these tools, ensuring clear, perfectly aligned scans. Its Document Quality Analyzer also prompts users to rescan low-quality images. ### How do I integrate document scanning functionality into my iOS app? The Scanbot iOS Document Scanner SDK includes Ready-To-Use UI (RTU UI) components that allow developers to add scanning capabilities in less than an hour. The SDK comes with extensive documentation, and integration support is available through Slack, Microsoft Teams, or email. ### Is there a free iOS document scanner SDK? Apple’s Vision Kit provides a free solution for basic document scanning on iOS. However, it typically lacks advanced features such as custom UI components, user guidance, and comprehensive image quality checks. For developers looking for more control and a better user experience, commercial SDKs like the Scanbot SDK offer ready-to-use screens, automatic capture, and image optimization, making integration quicker and more efficient. Plus, customers can access a dedicated team of support engineers who can help resolve issues, even during integration for non-customers. Check out integration support [here](https://docs.scanbot.io/support/). ### Which iOS-based Document Scanner SDKs comply with GDPR and other privacy regulations? The Scanbot iOS Document Scanner SDK operates entirely offline, ensuring that sensitive data is never sent to external servers. This helps meet the strict requirements of GDPR, CCPA, and CPRA, protecting user data and ensuring compliance with global privacy standards. ### What platforms does the Scanbot Document Scanner SDK support besides iOS? In addition to iOS, the Scanbot Document Scanner SDK also supports [Android](https://scanbot.io/developer/android-document-scanner-sdk/) and web apps. It can be integrated into cross-platform frameworks like [Flutter](https://scanbot.io/developer/flutter-document-scanner/), [Xamarin](https://scanbot.io/developer/xamarin-document-scanner/), [.NET MAUI](https://scanbot.io/developer/net-maui-document-scanner-sdk/), [Cordova](https://scanbot.io/developer/cordova-document-scanner/), [Capacitor](https://scanbot.io/developer/capacitor-document-scanner-sdk/), and [React Native](https://scanbot.io/developer/react-native-document-scanner/), ensuring consistent functionality across all devices. + ## Barcode Scanner Comparison Scanbot SDK has been acquired by Apryse! [Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft) [Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft) close [Skip to content](https://scanbot.io/blog/scanbot-sdk-vs-ml-kit-vs-zxing/?utm_source=chatgpt.com#main) It took almost twenty years after the invention of the first “bar code” for the technology to become commercially successful. Nowadays, we are used to seeing those symbologies in virtually every aspect of our everyday lives. And as usage expanded, of course, different types of barcode detectors have emerged over the past decades. A recent technology trend replaces laser scanners with smartphones for both commercial and private use. This shift has driven the development of a variety of high-performing open-source Software and SDK options designed for enterprise use cases. In this article, we will compare popular barcode reader libraries and Scanbot’s advanced [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) in terms of supported platforms and their capabilities to scan various types of barcodes. Finally, we will consider ease of integration and customer support. But before we make this comparison and draw our conclusions, let’s talk about the barcode scanner market, issues, and possible enterprise-grade solutions out there. ## Covering countless use cases: Why do we need so many barcode formats? There are plenty of different barcode symbologies. Roughly, those can be divided into one-dimensional (1D) and two-dimensional (2D) standards. 1D barcodes, like the EAN code, can only hold a minimal amount of data encoded by varying the widths of lines and the spaces between them – hence the name “linear” barcodes. In contrast, 2D barcodes, like the QR Code, consist of a grid of pixels that can have either an on (black) or off (white) state. They can store thousands of characters each. But why do we need so many different kinds of barcodes? Why are we still using one-dimensional barcodes at all, if two-dimensional codes can encode so much more data? The answer is that 2D codes can only be read with dedicated imager scanners or smartphones.  One-dimensional symbologies, however, need just a simple, low-cost laser scanner. Those are still in widespread use, reflecting the continuing popularity of 1D barcodes. Different barcodes are also more or less suited for certain applications. If you are curious about this, please check out our detailed blog post on the most common [barcode types and their uses](https://scanbot.io/blog/types-of-barcodes/). ## Can you read all types of barcodes with a single device? Each dedicated barcode reader device, too, has its own benefits and disadvantages. Let’s have a quick look at the most common barcode scanners and their characteristics to get an overview of the available hardware scanning options on the market. Pen-type barcode readers are the cheapest available option, but also the least practical. They require direct contact with the barcode, are limited to 1D barcodes, and perform poorly with damaged barcodes. CCD barcode scanners are fast in recognition, but they are also limited to 1D barcodes and have a short reading distance. Laser scanners are fast, easy to use, and work well in low light conditions. But they too are limited to 1D barcodes, and their moving mechanical components make them prone to malfunctions. In contrast, imager barcode scanners work like cameras. Thus, they are able to read 2D barcodes, and work reliably even on damaged barcodes. Unfortunately, they are expensive and less suitable for 1D barcode recognition. Lastly, smartphones (applause and confetti): Apps turn mobile devices into a modern barcode scanning tool that efficiently covers both 1D and 2D symbologies. Smartphones are considerably cheaper than imager scanners and allow users to scan all barcode types with just one device. With a BYOD strategy, there is no hardware cost at all. Enterprises don’t have to dedicate a mobile device to just one barcode scanning job, but instead get high versatility at the lowest TCO. Additionally, users don’t need any special training to use smartphones as scanners, since apps provide them with direct visual feedback. With simple mobile application updates, the apps themselves can evolve constantly. Apps or websites with integrated scanning capabilities for barcodes can cover just about all barcode symbologies and turn smartphones into mobile barcode readers within just days. Mobile scanners, too, have their differences. Now, it is about choosing the right kind of solution for your project: Open-source software, free barcode libraries or a proprietary Scanner SDK? ## Properties of outstanding barcode scanner libraries for mobile apps Let’s assume your mobile or web-based project requires barcode scanning for a use case such as inventory barcode scanner, process automation, or parcel tracking. Now, you’ll have to decide which barcode reading solution on the market suits your enterprise’s requirements best. There are a couple of signs of a good third-party barcode library that you should look for while comparing your potential candidates. First of all, you need to make sure that the performance of the scanner meets your requirements. Apart from raw speed, performance also includes properties like accuracy, response in rough conditions, and stability. Since there is a large variety of web and mobile platforms, compatibility is another key topic. Suppose you want to support all common mobile and web platforms. Then your barcode library should be compatible with Android and iOS (or the cross-platform framework you are developing your mobile app in), as well as with common browsers such as Safari, Chrome, or Firefox. The integration process itself is another crucial factor, as it decides how fast you can release your product to the market. Ease of integration also affects the quality of your product. A complicated integration increases the chances of developers making mistakes, while a straightforward integration phase makes it easier to arrive at an error-free software in the end. Additionally, there are various types of barcodes out there – even QR codes come in several flavors, for example. Your enterprise-grade barcode scanning library should support all necessary barcode types, both those that you are currently working with and those you might use in the future. Speaking of the future: Your requirements may evolve with your business. That means it’s also important to evaluate the continuity of the Barcode SDK development, the responsiveness of the software developers to your questions and bug reports, and customer support. **To get a full overview of the similarities and differences between ZXing, ML Kit, and the Scanbot SDK, download our [free eBook](https://page.scanbot.io/hubfs/content/ebook/scanbot-ebook-barcode-library-comparison-en-eb016.pdf)**: [![Scanbot SDK vs. ML Kit vs. ZXing](https://scanbot.io/wp-content/uploads/2023/07/ebook_barcode_libraries_hero-1024x702.jpg)](https://page.scanbot.io/hubfs/content/ebook/scanbot-ebook-barcode-library-comparison-en-eb016.pdf) ## Ready to get started? Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away. [Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/) ## Related blog posts [![Barcode scanner comparison](https://scanbot.io/wp-content/uploads/2025/07/header-cold-chain-300x229.png)](https://scanbot.io/blog/cold-chain-logistics-management-barcode-scanner/) ### [Overcoming challenges in cold chain logistics management with barcode technology](https://scanbot.io/blog/cold-chain-logistics-management-barcode-scanner/) Barcodes optimize cold chain logistics management, improving visibility and ensuring regulatory compliance for temperature-sensitive goods. ![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-2-1.svg) Johanna July 18, 20255 mins read [![Barcode scanner comparison](https://scanbot.io/wp-content/uploads/2023/08/What-is-mrz-hero-jpg.jpg-header-300x202.jpg)](https://scanbot.io/blog/what-is-an-mrz/) ### [How to scan MRZs with OCR: Considerations and first steps](https://scanbot.io/blog/what-is-an-mrz/) MRZs encode information on ID cards and passports in a machine-readable format. Find out how to automatically read MRZs with data capture software. ![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg) Kevin July 16, 20259 mins read [![Barcode scanner comparison](https://scanbot.io/wp-content/uploads/2025/07/OCR-legal-documents-300x229.jpg)](https://scanbot.io/blog/mobile-ocr-for-legal-documents/) ### [OCR for legal documents: Unlock efficiency with mobile data capture](https://scanbot.io/blog/mobile-ocr-for-legal-documents/) OCR creates digital, searchable versions of legal documents that can be retrieved instantly. Learn how to set up an OCR scanner app in minutes. ![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-2-1.svg) Johanna July 11, 20257 mins read + ## QuaggaJS Barcode Scanner Scanbot SDK has been acquired by Apryse! [Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft) [Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft) close [Skip to content](https://scanbot.io/techblog/quagga-js-tutorial/?utm_source=chatgpt.com#main) QuaggaJS is a popular open-source barcode scanning library written in JavaScript that locates and decodes various 1D barcode symbologies in the user’s camera stream. While the [original project](https://github.com/serratus/quaggaJS) is no longer maintained, it lives on as [Quagga2](https://github.com/ericblade/quagga2), which is what we’ll be using in our tutorial. Since Quagga is a JavaScript-only library, it is easy to integrate into any website or web app. In this tutorial, we’ll show you how to set up the barcode scanner in a single HTML file. 📺 You can also [watch this tutorial on YouTube](https://youtu.be/AQR5TQb8ATI). ## Step 1: Setting up the HTML file Let’s start by creating the basic structure of the HTML document: ```hljs html QuaggaJS ``` 💡 The line `` ensures that the page fits the device’s resolution and that users cannot zoom into it. The first thing we’ll put into the body is a `div` into which we’ll later render the camera stream: ```hljs html
``` ## Step 2: Configuring Quagga Next, we’ll add Quagga itself. We’re including the `quagga.min.js` script from jsDelivr, but you can of course also host the script on your own web server. ```hljs html
// new ``` Now, we need to configure QuaggaJS. First, we have to specify the DOM element where the video stream will be displayed. Next, we also need to specify the barcode decoders we want to use. To accomplish the first part, we create a config object, which we will call `quaggaConf`. We use [document.querySelector](https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector) to select the `div` we created above as the target where the video stream will be displayed. ```hljs html ``` Now we specify which barcode symbologies our QuaggaJS app will read (to optimize performance, it’s recommended to only include those you expect to scan). In this tutorial, we’ll be sticking to the common barcode type Code 128. You can find a list of all supported symbologies in the [Quagga2 GitHub repository](https://github.com/ericblade/quagga2?tab=readme-ov-file#decoder). ```hljs html ``` 💡 QuaggaJS cannot read QR codes or other 2D barcode symbologies. To enable QR code scanning, Quagga2’s README recommends [using external reader modules](https://github.com/ericblade/quagga2?tab=readme-ov-file#using-with-external-readers). The next step is to prepare the initialization function. We provide our Quagga configuration and an error handler. If the initialization is successful, `Quagga.start()` will begin the barcode scanning process. We have also added a function to display an alert with the barcode result when a barcode is detected and read. ```hljs html ``` ## Step 3: Configuring the video stream Now we’ll add `LiveStream` as the input stream type, since we want to process and display the live video as captured by the user’s camera. Other possible values for the stream type are described in the [Quagga docs](https://github.com/ericblade/quagga2?tab=readme-ov-file#inputstream). We’ll also have to define the constraints for the video stream. To do that, we need to specify the width, height, aspect ratio, and camera for the input stream. 💡 A lower resolution will result in faster scanning speeds at the cost of accuracy. ```hljs html ``` Next, we add some styling to display the video in the resolution we requested from the camera to ensure it fits the screen. ```hljs html QuaggaJS // new ``` Lastly, we’re going to apply a `style` attribute to our camera `div` to make it take up the entire width of the body. ```hljs html
``` And we’re done! 🎉 The final result looks like this: ```hljs html QuaggaJS
``` Try scanning a Code 128 to see if everything works as intended. ![Code 128 barcode example](https://scanbot.io/wp-content/uploads/2024/03/quaggajs-code128-example.png) ## Drawbacks of using QuaggaJS As impressive as this JavaScript-based barcode scanner implementation is, QuaggaJS does have its disadvantages. The biggest drawback is that it only supports 1D barcodes. Two-dimensional symbologies like QR Code, Data Matrix, and Aztec encode much more data while taking up less space, which makes them a valuable alternative to their one-dimensional counterparts. As useful as it is to have a barcode scanner written in JavaScript, the performance of the detection algorithm would also benefit from an implementation in WebAssembly. Especially on low-end devices, this could result in increased scanning speeds. Quagga’s feature set is also not on par with that of [professional solutions](https://docs.scanbot.io/barcode-scanner-sdk/web/barcode-scanner/use-cases/). Enterprise-grade barcode scanner software often includes dedicated modules for scanning many barcodes simultaneously or in rapid succession, as well as UI elements, all of which this open-source solution lacks. If you plan to use Quagga in production, you should also keep in mind that you will depend entirely on the open-source community for its maintenance and for support. If you run into a problem, you might have to find a solution on your own. For companies that heavily rely on barcode scanning in their business processes, we recommend using an enterprise-grade solution instead. ## Building a JavaScript Barcode Scanner with the Scanbot SDK We developed the Scanbot [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) to help enterprises overcome the hurdles presented by free barcode scanning software. Our goal was to have a developer-friendly solution available for a wide range of platforms that consistently delivers high-quality results – even in challenging circumstances. ![](https://scanbot.io/wp-content/uploads/2023/06/DemoApp_Biz_Barcode_Web.jpg) Scan the QR code or [follow this link](https://websdk-barcode.scanbot.io/) to try the Web Barcode Scanner Demo! In the following section, we’ll show you how easy it is to integrate our Web Barcode Scanner SDK into your JavaScript app. Thanks to our SDK’s **Ready-to-Use UI Components**, you can even use an AR overlay to display multiple barcodes’ contents right in the viewfinder. ![The JavaScript barcode scanner in action](https://scanbot.io/wp-content/uploads/2024/07/javascript-barcode-scanner-tutorial-gif-01-1.gif) To accomplish that, we’ll need to follow the steps below: 1. Download the SDK files 2. Create the HTML page and configure the Web SDK 3. Start a local HTTP server 4. Start scanning 5. Configure styling and scanning behavior 6. Deploy to a server (optional) Let’s dive into more details for each step. ### Step 1: Download the SDK First, create a new empty directory for your app and name it **my-scanner-app**. Then, download the Scanbot SDK **npm package** directly from [here](https://registry.npmjs.org/scanbot-web-sdk/-/scanbot-web-sdk-5.1.0.tgz). 💡 As [specified in our documentation](https://docs.scanbot.io/barcode-scanner-sdk/web/quick-start/), you can also use npm install to download and install the package, but for this tutorial, we suggest manually downloading it and installing it from the link provided. Unzip the downloaded files into **my-scanner-app**. Your folder structure should look like this: ```bash my-scanner-app/   |- scanbot-web-sdk/     |- webpack/     |- bundle/     |- @types/     |- index.js     |- ui.js     ... (and some other files) ``` ⚠️ Make sure the folder containing the package files is called **scanbot-web-sdk**, not “package” or similar. ### Step 2: Create the HTML page and configure the Web SDK To create the HTML with the Scanbot SDK, first create an **index.html** file in the **my-scanner-app/** folder. Then, add the following code to the file. ```typescript hljs My Scanner App








```

The code block above:

- Adds the “Start scanning” button.
- Imports and initializes the Scanbot SDK.
- Executes the user interface from the Scanbot SDK when the user clicks the “Start scanning” button.
- If a barcode is identified, it will present the barcode type and its content to the user.

### Step 3: Start local HTTP server

The Scanbot SDKuses advanced browser features that are unavailable when opening our site via a file URL. Therefore, a local HTTP server is required to view the site.

There are two main ways to run the index.js file in a localhost server: using **Python** or **Node.js**.

#### Python

If you have **Python** installed, you can use it to start a local HTTP server. To do so, follow the steps below:

1. Open a terminal in the **my-scanner-app/** folder.
2. Use the command  `python3 -m http.server` to start a local test server.
3. Now, you can access it on your browser at `http://localhost:8000`.

To stop running the localhost server, press **Ctrl+C** on the terminal.

#### Node.js

If **Node.js** isinstalled, you can use the npmserve package to start a local HTTP server. To do so, follow the steps below:

1. Open a terminal in the **my-scanner-app/** folder.
2. Run the command `npx serve`.
3. Once it finishes loading, you can access the page using the URL provided in your terminal, which usually is `http://localhost:3000`.

To stop running the localhost server, press **Ctrl+C** on the terminal.

### Step 4: Start scanning

Once you access the site on your browser, follow the steps below to test the Scanbot SDK:

Click the “Start scanning” button.

![](https://scanbot.io/wp-content/uploads/2024/07/javascript-barcode-scanner-tutorial-screenshot-01.png)Our simple start screen

The scanning UI will open, allowing you to scan a barcode using your camera. Point your camera to a barcode, as in the example below.

![](https://scanbot.io/wp-content/uploads/2024/07/javascript-barcode-scanner-tutorial-screenshot-02-e1734518571134.png)The default scanning screen

After scanning, the UI closes, displaying the scanned code and its type right below the “Start scanning” button.

![](https://scanbot.io/wp-content/uploads/2024/07/javascript-barcode-scanner-tutorial-screenshot-03.png)A straightforward way of displaying a barcode’s type and content

### Step 5: Configure the style and scanning behavior

The app code provided in Step 2 has the UI fully configured. To change the app’s appearance, you can customize the config object. You can, for example, change the viewfinder size and color.

To do so, you can change the `aspectRatio` and `strokeColor` after defining the `config` object, as displayed in the following code block:

```typescript hljs
const config = new ScanbotSDK.UI.Config.BarcodeScannerConfiguration();
config.viewFinder.aspectRatio.height = 1;
config.viewFinder.aspectRatio.width = 5;
config.viewFinder.style.strokeColor = "#FF000050";




```

The above configurations will result in the following styling:

![](https://scanbot.io/wp-content/uploads/2024/07/javascript-barcode-scanner-tutorial-screenshot-04-e1734518674262.png)A more horizontal version of the viewfinder with red corners

You can find more configuration options by accessing the [SDK](https://docs.scanbot.io/barcode-scanner-sdk/web/barcode-scanner/ready-to-use-ui/) or [API documentation](https://scanbotsdk.github.io/documentation/web/classes/UIConfig.BarcodeScannerConfiguration.html).

As another configuration example, you can display an **AR overlay** and let the user pick a specific barcode when the app identifies multiple barcodes on the camera. To add this feature, add the following code after defining the `config` object:

```typescript hljs
config.useCase.arOverlay.visible = true;
config.useCase.arOverlay.automaticSelectionEnabled = false;




```

If you open your app again, it will look like this:

![](https://scanbot.io/wp-content/uploads/2024/07/javascript-barcode-scanner-tutorial-screenshot-05-e1734518698445.png)The AR overlay displays the barcodes’ contents right in the viewfinder

💡 The AR labels can also be [fully configured](https://docs.scanbot.io/barcode-scanner-sdk/web/barcode-scanner/ready-to-use-ui/#ar-overlay).

### Step 6: Deploy to a server (optional)

To test your new app on your phone, you need to deploy it to a server. If you don’t have a web server ready, you can prototype your site using services like [Static.app](https://static.app/) by executing the following steps:

1. Zip the content from **my-scanner-app.**
2. Access [Static.app](https://static.app/) and click **Upload for free**.
3. Find and select the **my-scanner-app.zip** file.
4. After the upload, your site will run within minutes. You will then be presented with a **URL**. Use it to access the app from any device, including your mobile phone.

The Scanbot SDK UI is optimized for mobile devices. It allows users to choose the camera and toggle the flashlight by default. Use the URL to test the app interface on your mobile device, as displayed below.

![](https://scanbot.io/wp-content/uploads/2024/07/javascript-barcode-scanner-tutorial-screenshot-06-e1721131838208-604x1024.jpg)Our JavaScript barcode scanner running on a phone

### Conclusion

That’s it! You now have a fully functional barcode-scanning web app using the Scanbot SDK’s RTU UI.

You can also take a look at our integration guides for [React](https://scanbot.io/techblog/react-barcode-reader-tutorial/) and [Vue.js](https://scanbot.io/techblog/vue-js-barcode-scanner-tutorial/) for implementations similar to this one. Should you have any questions, feel free to reach out to us [on Slack or MS Teams](https://docs.scanbot.io/support/) or send us an email via [sdksupport@scanbot.io](mailto:sdksupport@scanbot.io)

## How to improve barcode scanning performance in real-world conditions

Now that you’ve developed a working barcode scanner app, it’s time to consider how your app performs in real-world conditions—where lighting varies, barcode quality isn’t guaranteed, and users might be scanning everything from glossy product labels to crumpled shipping labels. In this section, we’ll dive deeper into advanced optimization strategies and the challenges your app might encounter. Mastering these techniques not only strengthens your app’s robustness but also prepares it for deployment in production environments.

### Scanning in low-light environments

One of the most common issues users face is scanning barcodes in poorly lit environments. Whether it’s a dimly lit stockroom, a late-night delivery, or simply indoor lighting that’s not quite sufficient, low light can drastically affect image clarity and contrast, making it harder for algorithms to detect and decode barcodes. One effective way to mitigate this is to programmatically enable the device’s flashlight when low light is detected. Many mobile platforms provide APIs for controlling the torch feature, and using it intelligently—such as activating it only when ambient light falls below a certain threshold—can significantly improve scan success rates.

In addition to enabling the flash, consider applying image preprocessing techniques like brightness normalization or histogram equalization. These approaches enhance visibility by boosting contrast and clarity before the barcode is passed to the decoder.

### Scanning damaged or worn-out barcodes

Barcodes in the wild are rarely perfect, so being able to [read damaged or blurry barcodes](https://scanbot.io/blog/how-to-read-damaged-or-blurry-barcodes/) is essential. They may be scratched, faded, crumpled, partially torn, or covered in dust. In such cases, conventional decoding methods may fail to read them accurately. The key to handling this challenge lies in preprocessing the image to repair or reconstruct the barcode as much as possible.

Basic image enhancement algorithms like Gaussian blur, morphological closing, and thresholding can help clean up the barcode region by eliminating noise or filling in broken bars. For more advanced applications, you might consider using machine learning-based restoration models trained to “fill in the blanks” of damaged codes. Additionally, some libraries offer confidence scoring on barcode reads—if the confidence is low, your app could attempt to reprocess the image using a different set of filters or prompt the user to try scanning again at a different angle or distance.

### Scanning multiple barcodes in one image

In warehouse or retail environments, it’s not uncommon for a single frame to contain several barcodes—think of a shipping label with a QR code, a UPC, and maybe even a custom format code all printed together. To deal with this, your app should be capable of [detecting and decoding multiple barcodes in a single frame](https://scanbot.io/blog/enhancing-operations-with-multi-barcode-scanners/).

This requires more than just running a barcode detector on the full image. You’ll want to implement barcode localization algorithms that scan the image for rectangular or barcode-like patterns, isolate each candidate region, and run individual decoding passes. Modern approaches include using deep learning models to first detect the [barcodes’ bounding boxes](https://scanbot.io/blog/how-to-use-our-barcode-scanner-ar-overlay/) before passing them off to traditional decoders. This separation of detection and decoding not only improves accuracy but also allows you to prioritize certain barcode types if your app is domain-specific.

### Scanning barcodes at different orientations

Barcodes aren’t always perfectly aligned. Users might scan at an angle, or the barcode might be printed sideways, upside-down, or rotated at an arbitrary degree. If your app can only decode horizontally aligned codes, you’re limiting its real-world utility. To address this, your scanning logic should incorporate rotation-invariant algorithms.

Many modern barcode libraries already support this feature by internally rotating the image during processing, but it’s worth verifying how well your chosen library performs with rotated inputs. You can also pre-process the image using computer vision techniques to estimate and normalize the orientation of the barcode before attempting a decode. For 2D barcodes like QR or Data Matrix codes, rotation doesn’t typically affect readability, but with 1D barcodes, alignment matters a lot more, so orientation handling becomes crucial.

A related challenge is [scanning inverted barcodes](https://scanbot.io/blog/how-to-scan-an-inverted-barcode/), which requires different approaches depending on whether a barcode is one- or two-dimensional. Some scanning software offers an “inverted mode” to speed up scans of inverted barcodes, which simply inverts the camera input, creating a non-inverted version of the barcode for the software to process. However, this approach depends on users selecting the correct mode, who may not even be aware that they are scanning an inverted barcode. Having the software automatically detect inversion is usually better.

### Scanning barcodes of different sizes

Barcodes come in a wide range of sizes—from tiny stickers on product packaging to large labels on warehouse pallets. Your scanner needs to gracefully handle both extremes. If a barcode is too small in the frame, it may not be resolvable; if it’s too large, the scanner might only capture part of it, leading to failed reads.

To adapt dynamically, consider implementing a system that uses autofocus and auto-zoom features provided by the device’s camera API. On mobile devices, you can measure the size of the detected barcode in the frame and adjust the zoom accordingly, ensuring that the code fills the optimal portion of the screen. Also, make sure your app supports a sufficiently high resolution for scanning small codes—downscaling might save processing time but at the cost of scan accuracy.

### Supporting multiple barcode types

Real-world applications often require scanning a [variety of barcode formats](https://scanbot.io/blog/types-of-barcodes/). These may include linear (1D) codes like UPC-A or Code 128, and matrix (2D) codes like QR, PDF417, or Data Matrix – some of them using international standards like [GS1](https://scanbot.io/blog/gs1-barcodes-what-they-are-and-how-to-scan-them/), which require specific [data parsers](https://scanbot.io/blog/barcode-parser-how-to-parse-gs1-pdf417/). Not every library supports every type, and some libraries perform better with specific formats.

If your app serves a general-purpose audience or multiple industries, it’s worth supporting as many formats as feasible. Some barcode scanning frameworks allow you to specify which formats to scan for, improving performance by skipping irrelevant types. You can also add custom logic to prioritize or validate certain barcode types based on context—like expecting a [QR code for login](https://scanbot.io/blog/qr-code-authentication/), but a [UPC code in a grocery store](https://scanbot.io/blog/grocery-list-scanner-smartphones-are-turning-into-smart-shopping-sidekicks/). Consider offering visual cues or configuration settings for users to choose their expected format.

### Optimizing for different devices

Performance and accuracy can vary widely depending on the device used. On mobile phones, leveraging native camera features such as tap-to-focus, manual exposure adjustment, or even real-time edge enhancement filters can significantly improve the user experience. If you’re targeting lower-end phones, be sure to optimize your processing pipeline to run efficiently without lag.

For desktop environments using webcams, there’s less flexibility with camera control, but you can still improve performance by accessing resolution settings via browser APIs or device drivers. Encouraging users to use external cameras with better focus capabilities can also help when scanning detailed or small codes.

### Leveraging machine learning for accuracy

One of the most significant performance boosters is [applying deep learning algorithms to barcode scanning](https://scanbot.io/blog/how-does-deep-learning-benefit-barcode-scanning/). Whereas traditional methods rely on strict image patterns and simple heuristics, machine learning models can adapt to far more variability in lighting, orientation, damage, and noise.

You can train custom object detection models to locate barcodes in complex scenes, or even use CNNs to directly interpret damaged barcodes that would otherwise be unreadable. Some open-source models already exist for this purpose, and integrating them with your app’s scanning logic can lead to a dramatic improvement in robustness. However, keep in mind that ML models often require more computational power, so consider providing a fallback to traditional decoding methods for low-power devices.

## Ready to get started?

Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.

[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)

## Related blog posts

[![How to build a React.js Barcode Scanner web app with TypeScript and Vite](https://scanbot.io/wp-content/uploads/2025/04/web-barcode-scanner-sdk-header-new-300x229.png)](https://scanbot.io/techblog/react-barcode-reader-tutorial/)

### [How to build a React.js Barcode Scanner web app with TypeScript and Vite](https://scanbot.io/techblog/react-barcode-reader-tutorial/)

This tutorial will demonstrate how to integrate our Web Barcode Scanner SDK using React.js and Vite.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-8-1.svg)
Alex January 3, 20259 mins read

[![How to build a Progressive Web App (PWA) Barcode Scanner with React and TypeScript](https://scanbot.io/wp-content/uploads/2025/04/web-barcode-scanner-sdk-header-new-300x229.png)](https://scanbot.io/techblog/progressive-web-app-barcode-scanner-tutorial/)

### [How to build a Progressive Web App (PWA) Barcode Scanner with React and TypeScript](https://scanbot.io/techblog/progressive-web-app-barcode-scanner-tutorial/)

Learn how to build an installable barcode scanning PWA using React and our Web SDK in this step-by-step guide.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg)
Kevin January 7, 202510 mins read

[![How to build a Vue.js Barcode Scanner web app with TypeScript and Vite](https://scanbot.io/wp-content/uploads/2025/04/web-barcode-scanner-sdk-header-new-300x229.png)](https://scanbot.io/techblog/vue-js-barcode-scanner-tutorial/)

### [How to build a Vue.js Barcode Scanner web app with TypeScript and Vite](https://scanbot.io/techblog/vue-js-barcode-scanner-tutorial/)

This tutorial will demonstrate how to integrate our Web Barcode Scanner SDK using Vue.js and Vite.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg)
Kevin January 9, 20259 mins read

+

## Direct Part Marking Barcodes
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

close

[Skip to content](https://scanbot.io/blog/direct-part-marking-barcodes/#main)

While traditional barcode labels are an effective way to track products, they often wear down, becoming unreadable over time. Robust product traceability, however, is critical for compliance.

What if a product needs to be identified or traced throughout its entire life span? What if the conditions will be harsh? Think of medical and military equipment, or airplane components.

The solution is to engrave the barcode directly into the material. In this blog post, we’ll explore Direct Part Marking (DPM) technology, its applications, and how to maximize readability.

## What is direct part marking (DPM)?

The idea of direct part marking is to permanently apply a code onto the surface of an item. This makes DPM barcodes far more robust than labels, ensuring that parts and products can be identified and traced throughout their entire lifecycle.

There are several common DPM technologies manufacturers can use to this end. The DPM barcodes themselves are typically QR codes or Data Matrix codes, owing to their small footprint.

## QR codes vs. Data Matrix codes for DPM

In industrial part marking, [Data Matrix codes](https://scanbot.io/barcode-scanner-sdk/data-matrix/) are generally preferred over QR codes. For one, they can store more data in the same space, making them ideal for marking small components. For another, their encoding makes them less prone to be misread, especially in challenging conditions such as poor lighting.

However, QR codes also have their advantages: Consumers readily recognize them and associate them with quick access to online information. Moreover, they can easily scan QR codes, using nothing but the default camera app on most modern smartphones. QR codes are therefore commonly used for web links, especially when the goal is consumer interaction.

## Choosing the right marking method

Depending on the material and other factors, some direct part marking methods work better than others.

The three most common DPM methods are laser marking, dot peen marking, and chemical etching. Here is how they work – and when to use which:

- **Laser marking** uses a focused beam of light to create permanent marks on various materials. It can be used with most metals, plastics, glass, and ceramics. Laser marking is the most precise and fastest marking method. Furthermore, it is also the preferred choice for clean room applications, because the contamination risk is minimal.

- **Dot peen marking** uses an electromechanical engraving machine, usually a stylus or a pen, to rapidly engrave small dots. Dot peen marking is ideal for engraving on curved surfaces, soft metals, or when deep marking is required. Because the marked data can be changed easily and rapidly, it is also the preferred method for handling a lot of variety within products.

- **Chemical etching** selectively removes material from a surface to create specific patterns or shapes. This technique is specifically used on stainless steel and to produce high contrast.

Generally, laser marking is the go-to method for many DPM applications, especially in cases where precision, code durability and cleanliness are key. However, it does have some limitations such as a higher initial equipment cost.

![](https://scanbot.io/wp-content/uploads/2024/10/AdobeStock_615844728-1024x683.jpeg)

## DPM technology: Benefits and challenges

DPM barcodes are highly durable and have a long life span. They can endure high temperatures, moisture, and corrosive environments, making them ideal for manufacturing in the military, medical, and aerospace industry. Barcodes engraved directly onto the object also minimize the risk of tampering, as they cannot be easily removed, altered or replaced – unlike traditional adhesive labels.

For these reasons, DPM technology ensures reliable identification of components and traceability throughout a product’s entire lifecycle.

However, the implementation and ongoing use of DPM barcodes does present challenges. To begin with, buying the marking equipment and training personnel to create and manage DPM codes can be capital-intensive. At the scanning end, the variety in component materials, including texture and color, can influence the accuracy of the DPM scanning results.

Lastly, there are industry standards and regulations to comply with. Different sectors have specific standards for barcode encoding. For example, the U.S. Department of Defense typically requires Item Unique Identification (IUID) as part of the compliance process for military applications. This ensures that all components in military vehicles such as tanks and fighter jets can be identified and traced easily throughout their lifecycle.

## Industry applications

Direct part marking is used across various industries where identification and long-term traceability of components are essential. The technique became established in the automotive and aerospace industries first, but is now also found in healthcare, construction, electronics manufacturing, the food and beverage industry, and the energy sector.

NASA, for instance, has been using Data Matrix identification on their aerospace parts, and thereby exemplifies effective use of direct part marking in high-stakes environments. Some of our Scanbot SDK clients, such as SKF and Breww, have also implemented DPM to identify and trace parts across their supply chain – or their customers’.

## Accurately scanning DPM barcodes

Direct part marking’s durability and reliability in harsh environments make it invaluable for product identification and traceability in sectors like aerospace, automotive, and healthcare.

However, certain factors should be considered when implementing DPM. The crucial concern is barcode readability, which can be affected by the materials’ textures and colors. Additionally, even DPM barcodes can become dirty or damaged. As a result, it’s advisable to invest in a scanning solution that can effectively address these challenges.

Our [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) delivers reliable and fast scanning of both QR and Data Matrix codes, regardless of the surface material. Its powerful barcode scanning capabilities can be integrated into any mobile app or website, enabling fast and reliable scanning for all common 1D and 2D barcode symbologies, even under challenging conditions such as low light or damaged barcodes.

The SDK is available for all common platforms, including iOS, Android, Web, Windows, Linux, and cross-platform frameworks like Flutter, React Native, and .NET MAUI. One of its standout features is its ability to operate entirely offline, ensuring compliance with data protection regulations like GDPR and CCPA/CPRA.

In addition to basic scanning functionality, the SDK includes advanced features such as AR overlays for intuitive scanning, batch and multi-scanning capabilities, and customizable UI components. It is used by enterprises in a wide range of industries, including retail, logistics, healthcare, aviation, and manufacturing.

Interested to learn more? Try the Scanbot Barcode Scanner SDK yourself with the [free demo app](https://scanbot.io/demo-apps/#barcode-scanner-sdk).

## Ready to get started?

Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.

[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)

## Related blog posts

[![Industrial scanner – Cost-effective alternatives](https://scanbot.io/wp-content/uploads/2020/07/industrial-scanner-header-768x362.jpg)](https://scanbot.io/blog/industrial-scanner-for-mobile-devices/)

### [Industrial scanner – Cost-effective alternatives](https://scanbot.io/blog/industrial-scanner-for-mobile-devices/)

Ever since its first revolution in 1800, the industrial sector has continually developed new approaches to make production, transportation, and communication between the divisions faster and more efficient. In...

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-1-1.svg)
Magdalena July 5, 20205 mins read

[![Navigating the Counterfeit Maze: Identifying Fake Industrial Products Using Barcodes](https://scanbot.io/wp-content/uploads/2022/09/ball-bearing-hero-300x200.jpeg)](https://scanbot.io/blog/bearing-counterfeits/)

### [Navigating the Counterfeit Maze: Identifying Fake Industrial Products Using Barcodes](https://scanbot.io/blog/bearing-counterfeits/)

Mobile barcode scanners enable customers to check the authenticity of industrial parts within seconds. Learn more about how it works.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-1-1.svg)
Magdalena September 20, 20224 mins read

[![Types of barcodes and their usage](https://scanbot.io/wp-content/uploads/2023/05/types-of-barcodes-header-e1734449907883-768x357.jpg)](https://scanbot.io/blog/types-of-barcodes/)

### [Types of barcodes and their usage](https://scanbot.io/blog/types-of-barcodes/)

An overview of the 1D and 2D barcode types supported by the Scanbot Barcode Scanner SDK and their use cases.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg)
Kevin November 15, 202419 mins read

+

## Evolution of Document Scanning
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

close

[Skip to content](https://scanbot.io/blog/evolution-of-document-scanning/#main)

## The first glimmer

The humble beginning of scanning dates back to the **16th century** with the appearance of **camera obscura**. This precursor to modern photography used a pinhole to project an image onto a surface, resembling a primitive camera. The images could not be captured yet, however.

This changed in the **19th century** with the invention of **photography**. The fathers of photography, Louis Daguerre and William Henry Fox Talbot, used chemical processes to capture images on metal plates and paper.

As the next step towards document scanning, a way was needed to easily copy – and transmit – images.

In **1860**, the **pantelegraph** emerged, vaguely mirroring today’s fax machines. For the first time, telegraph lines could be used to transmit handwriting and drawings. The device soon proved invaluable for verifying signatures in banking.

What did this look like? A pair of pantelegraphs transmitted the images, but the receiving end did not print them out in ink, unlike later fax machines. Instead, the shared image was permanently recorded on special chemically treated paper. The reproduction could thus be preserved for future reference or verification.

In **1913**, the **belinograph** revolutionized image scanning and transmission. Thanks to the recently-invented photocell, it became far easier to send images over standard telephone lines.

This breakthrough laid the foundation for the Associated Press (AP) press distribution service. The AP was established in 1846 to share news stories among member newspapers. Belinograph technology enabled the AP to rapidly transmit both text-based news and visual content. This innovation transformed news reporting and distribution, ushering in a new era where images shaped how information was presented and consumed.

Fast-forward to **1924**, where Richard Ranger’s work resulted in the wireless **photoradiogram** technology. This precursor to modern fax machines achieved a significant milestone by transmitting the first photograph across the Atlantic: from New York to London.

While the photoradiogram didn’t use telephone lines like modern fax machines, it did set the stage for sending images over long distances.

From the camera obscura to photoradiograms, these inventions document the pursuit of ways to efficiently capture and share visual information. They paved for still more advanced technology – and, ultimately, modern document scanning.

## Early document scanning technology

![](https://scanbot.io/wp-content/uploads/2023/11/document-scanning-timeline-1-1024x600.png)

The true revolution in document scanning arrived in the **1930s** with the introduction of the **photocopier**. Chester Carlson developed the Xerox machine, the first automatic photocopying device. It used **xerography** to transfer images from a photosensitive drum to paper. The photocopier made document replication faster and more accessible.

Duringthe **1950s**, David H. Shepard’s “Statistical Machine” gave rise to **optical character recognition (OCR)**. This innovation enabled the optical reading and conversion of printed text into electrical impulses, revolutionizing text processing.

In the **1960s**, scanning technology advanced with IBM’s 805 Test Scoring Machine and Russell Kirsch’s Drum Scanner, the first **flatbed scanner**.

The **1970s** saw the launch of commercial flatbed scanners from Xerox and Ray Kurzweil’s versatile OCR system, capable of reading text in any font.

The **1980s** brought the release of the Apple Macintosh, propelling desktop publishing and scanning into the mainstream. Visioneer’s PaperPort further developed scanning by making flatbed scanners accessible to personal computer users.

Throughout the **1990s**, the landscape continued to evolve with the introduction of color scanning, thanks to Fujitsu’s high-speed color document scanner. Simultaneously, Adobe’s launch of the **searchable PDF** format transformed how scanned documents were accessed and managed.

![](https://scanbot.io/wp-content/uploads/2023/11/document-scanning-timeline-2-1024x803.png)

## Scanning goes mobile

With the advent of smartphones at the beginning of the **21st century**, document scanning underwent its most dramatic transformation. Mobile apps and built-in camera technology turned our handheld devices into powerful document scanners. Suddenly, anyone could easily capture, store, and share documents, significantly impacting industries like business, education, and healthcare.

Document scanning soon became more deeply integrated into mobile devices. Apple’s **iPhone** introduced built-in scanning capabilities, Google Docs incorporated OCR for scanned documents, and Evernote popularized mobile document capture and storage.

In the **2010s**, the focus was on cloud integration. Microsoft launched Office Lens, and Adobe Acrobat DC offered **mobile scanning** and editing capabilities.

Now, in the **2020s**, AI-powered document scanning solutions provide **automated text recognition, classification, and data extraction**. They mark the latest chapter in the evolution of document scanning – but there is still room to grow. The remote work trend and digital document management further accelerated the adoption of cloud-based scanning and storage solutions.

![](https://scanbot.io/wp-content/uploads/2023/11/document-scanning-timeline-3-1024x960.png)

## The present and beyond

Today’s smartphones have high-resolution cameras and offer more than enough precision when scanning documents and receipts and recognizing data. It is now on app developers to make the most of the modern hardware.

The journey of document scanning has been remarkable, from its humble beginnings in the camera obscura to today’s sophisticated smartphone scanners. As technology continues to advance, the future possibilities for document scanning are limitless.

## Integrating a document scanner into your mobile app

The [Scanbot Document Scanning SDK](https://scanbot.io/document-scanner-sdk/) provides a cutting-edge solution that empowers developers to integrate document scanning capabilities into their applications. With the Scanbot SDK, businesses can streamline document management, enhance the user experience, and take full advantage of the smartphone’s scanning potential.

Download our [Demo App](https://scanbot.io/demo-apps/#document-scanner-sdk) or get a no-strings-attached [7-day trial license](https://scanbot.io/trial/) to try the Scanbot SDK for free.

## Ready to get started?

Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.

[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)

## Related blog posts

[![The evolution of document scanning](https://scanbot.io/wp-content/uploads/2023/08/Document-Scanner-App-Header-768x362.jpg)](https://scanbot.io/blog/essential-document-scanner-features/)

### [Document scanner apps: 7 features you shouldn’t miss out on](https://scanbot.io/blog/essential-document-scanner-features/)

Just taking a photo of a paper document is not enough for automated processing. To find the right scanning solution, keep an eye out for the following features.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg)
Kevin November 28, 20225 mins read

[![The evolution of document scanning](https://scanbot.io/wp-content/uploads/2023/07/What-is-ocr-hero-image-header.png)](https://scanbot.io/blog/what-is-ocr-software/)

### [What is OCR software?](https://scanbot.io/blog/what-is-ocr-software/)

How does optical character recognition work? And what can we do to achieve better end results? This article will help you understand the underlying mechanics of OCR technology.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg)
Kevin August 10, 20224 mins read

[![The evolution of document scanning](https://scanbot.io/wp-content/uploads/2023/10/web-sdk-document-upload-header-768x362.jpg)](https://scanbot.io/blog/online-document-submissions-using-a-web-sdk/)

### [How insurances can offer easy online document submissions using a Web SDK](https://scanbot.io/blog/online-document-submissions-using-a-web-sdk/)

Giving insureds the option to scan and submit documents via a web portal saves time and increases automatic processing rates.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg)
Kevin October 17, 20234 mins read

+

## Open-source vs SDK
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

close

[Skip to content](https://scanbot.io/blog/open-source-scanner-vs-scanner-sdk/?utm_source=chatgpt.com#main)

## **What is open-source software?**

Open-source software differentiates itself from proprietary software by having its code publicly available. This allows any knowledgeable user to audit it – and to contribute. Open-source projects often result from the collaboration of a large, mostly unpaid community of developers. Well-maintained open-source projects are updated regularly by this community, receiving new features and security patches.

“Free Software” or FOSS (“Free and Open-Source Software”) goes one step beyond publishing the source code by defining four additional essential criteria:

1. The freedom to run the program for any purpose
2. The freedom to study how the program works and change it to one’s own requirements
3. The freedom to redistribute copies of the software to help others
4. The freedom to distribute modified copies

These freedoms define the “free” part in FOSS. To avoid confusion with “free” as in free-of-charge, some use the term “libre” – from “liberty” – instead.

This contrasts with the term “freeware” – software that actually is free-of-charge, though its code can still be proprietary. Therefore, freeware should not be confused with open-source or free/libre software.

An important aspect of open-source projects are the licenses they come with. Code is covered by copyright laws, meaning anyone using the software as part of a project should know the terms under which it is licensed. For example, some open-source software forbids its use for commercial purposes.

## **Open-source software licenses**

There are many software licenses available for open-source projects, and they come with different restrictions on how the code can be used.

Some use a concept called “copyleft”. This means that any software incorporating code with such a license cannot be made proprietary. One example is the popular GNU General Public License (GPL). Companies should not take this issue lightly, since violating the software license can incite legal action. They may be forced to stop selling their product immediately and open-source its code.

At the other end of the spectrum are permissive licenses. These place minimal restrictions on how the code is used and allow its integration into proprietary software. The BSD License and the MIT License are good examples of this. Such code is generally safe to integrate into proprietary software, though companies should not do so blindly.

Sometimes, popular open-source projects are acquired by corporations, which can result in the community forking the project. A fork starts as a copy of a software’s source code, which is then developed independently. This results in a separate piece of software.

A famous example of this is MariaDB, a fork of the relational database management system MySQL. In 2009, before the latter was acquired by Oracle, its community of open-source developers grew worried about its future direction and decided to fork the project, resulting in MariaDB. What started as a drop-in replacement for MySQL is now a powerful tool in itself, providing many additional features and improved performance.

## **Advantages and disadvantages of open-source tools**

As outlined above, the advantages of open-source code are that it is often free of charge, independently developed, and in many cases very secure, since any knowledgeable person can audit it.

However, there is a flip side to the community-driven development of open-source software. Since maintainers are mostly unpaid, there is little monetary incentive to contribute to a project longer than necessary. As a result, even fundamental building blocks of today’s software may be abandoned by their developers at some point, leaving them outdated and open to malicious actors.

According to [Sonatype’s 8th Annual State of the Software Supply Chain Report](https://www.sonatype.com/state-of-the-software-supply-chain/introduction), 1.2 billion vulnerable dependencies are downloaded each month. Correspondingly, the number of attacks on software supply chains increased by a staggering 742% per year from 2019 to 2022.

It’s also easy to stumble into conflicts with the variety of licenses used by open-source projects, especially if a software depends on many different libraries. For proprietary products, code with GNU GPL licenses should generally be avoided, whereas the Apache, BSD, and MIT licenses pose less of a risk.

## **Challenges of building a mobile app with open-source software**

Say you want to add document scanning and text recognition functionalities to your mobile app. You could combine various freely available libraries for that. These include code for the scanning API itself, image filters, the user interface, and text recognition via OCR. Each of these components is subject to its license and might be available under different terms of use.

These licenses must be checked to ensure that every software component is used in a way that is legally compliant. If the software is forked for your company’s business purposes, any changes made by the original developers must be manually incorporated. This ensures that the updated components stay compatible with your company’s software environment.

Implementing all these updates requires considerable time and effort for your company’s internal development team. Thus, customers cannot always be immediately supplied with the latest component version.

Moreover, if a component’s original open-source code stops being maintained by the community, your company’s development team is responsible for any further improvements and security updates.

The initial investment needed to build a software product on open-source projects is often lower. However, these uncertainties can become considerable cost factors that are difficult to calculate in advance.

## **Advantages of proprietary software development kits**

A proprietary software development kit (SDK) is a comprehensive solution that can be easily integrated and tailored to a company’s needs. This contrasts with the many individual software components usually needed for products built on open-source code. The adaptability of open-source software is retained through various customization options.

Customers automatically receive continuous updates and new functionalities, without need for further adjustments. SDK components can deliver state-of-the-art features while guaranteeing compatibility with operating systems and cross-platform wrappers. This ensures both an optimal user experience and accurate results.

By purchasing a proprietary software license, companies can depend on extensive support. Customers that use our Scanbot SDK in their products have access to a dedicated Slack channel where they can directly contact our in-house developers with any questions or issues.

All updates, new features, and bug fixes are included in the license fee, as is assistance  from your dedicated Customer Success Manager, who ensures comprehensive support throughout the license period. This guarantees a flawless user experience.

## Ready to get started?

Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.

[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)

## Related blog posts

[![Open source scanner or proprietary SDK](https://scanbot.io/wp-content/uploads/2023/07/Open-source-or-sdk-hero-image-header-768x331.jpeg)](https://scanbot.io/blog/scanbot-sdk-vs-ml-kit-vs-zxing/)

### [Barcode scanner comparison – Scanbot SDK vs ML Kit vs ZXing](https://scanbot.io/blog/scanbot-sdk-vs-ml-kit-vs-zxing/)

A comparison of barcode reader libraries and the Scanbot Barcode Scanner SDK regarding platforms, barcode types, integration, and support.

![](https://scanbot.io/wp-content/uploads/2024/10/author-avatar-11.svg)
Ivan August 30, 20226 mins read

[![Open source scanner or proprietary SDK](https://scanbot.io/wp-content/uploads/2023/07/SDK-Buyer-Guide-Header-768x362.jpg)](https://scanbot.io/blog/5-things-to-look-out-for-in-an-sdk/)

### [5 things to look out for when deciding on an SDK](https://scanbot.io/blog/5-things-to-look-out-for-in-an-sdk/)

When it comes to SDKs, several factors can impact the success of your project. Here are five things you should consider when deciding which SDK to buy.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg)
Kevin October 4, 20225 mins read

[![Open source scanner or proprietary SDK](https://scanbot.io/wp-content/uploads/2023/08/Document-Scanner-App-Header-768x362.jpg)](https://scanbot.io/blog/essential-document-scanner-features/)

### [Document scanner apps: 7 features you shouldn’t miss out on](https://scanbot.io/blog/essential-document-scanner-features/)

Just taking a photo of a paper document is not enough for automated processing. To find the right scanning solution, keep an eye out for the following features.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg)
Kevin November 28, 20225 mins read

+

## Benefits of Mobile Apps
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

close

[Skip to content](https://scanbot.io/blog/leveraging-the-power-of-modern-technology-6-key-benefits-of-mobile-apps/#main)

Mobile apps have transformed how companies operate and communicate with their customers. From improved customer engagement and brand loyalty to increased operational efficiency and revenue generation, an effective mobile strategy provides numerous advantages. Apps are now an essential component of modern business strategies.

In this article, we explore the key benefits mobile apps hold for companies and how they enable businesses to stay ahead.

## 1\. Accelerated revenue generation

Companies can generate revenue using mobile apps in a variety of ways. Common monetization options include in-app purchases, subscriptions, and mobile advertising. A simple, seamless app experience and interesting features encourage users to make purchases (or watch ads).

Furthermore, businesses can use applications as a platform to demonstrate and advertise specific items or services. A simple way to increase sales is to regularly show customers personalized recommendations of new products, based on their view and purchase history. App-based loyalty programs can boost revenue even further.

## 2\. Enhanced customer loyalty & engagement

Mobile applications give companies a personal, direct marketing channel to their users. With push notifications and in-app messaging, businesses can deliver targeted, relevant, and highly personalized information. Not only does this increase immediate user engagement, it also strengthens the connection between the company and its customers, improving brand loyalty and customer satisfaction.

Push notifications, for example, are a great way to announce new features or in-app content – though they should be specifically tailored to the user’s previous behavior and preferences. This way, users are regularly reminded to use the mobile app, but without being flooded with unnecessary information that could repel them.

## 3\. Streamlined processes and cost efficiency

Enterprises can also use mobile apps to streamline their internal business processes. They help automate repetitive tasks such as inventory management, personnel scheduling, or order processing, thus increasing productivity, minimizing human error, and reducing costs.

Additionally, they can provide real-time data and analytics, enabling businesses to make informed choices to optimize their operations and resource distribution.

The gains can be dramatic: [Deutsche Telekom](https://scanbot.io/success-stories/telekom/) was able to cut document submission time from three days to three minutes. With the internal app, employees can now [scan relevant documents](https://scanbot.io/document-scanner-sdk/) with their mobile devices and submit them digitally within milliseconds. Paired with automated data extraction, this eliminated the need for manual processing in the back-office and resulted in significant cost savings.

![Benefits of mobile apps](https://scanbot.io/wp-content/uploads/2023/06/benefits-of-mobile-apps-blog-2-460x311-1.jpeg)

## 4\. Boosting brand awareness & competitive advantage

Modern customers expect businesses to have a mobile presence. This has a growing impact on buying decisions, giving an edge to enterprises that do offer a mobile application.

Businesses that deliver a well-designed, versatile app can distinguish themselves from their competitors and show their commitment to putting the customer first. Additionally, a mobile app can be a powerful branding tool, reinforcing brand identity and demonstrating the company’s thought leadership.

Health insurance apps are a great example here. Many offer more than just basic services, such as mobile document submission. Instead, they comprehensively cover health and fitness topics. This way, insurers can establish themselves as thought leaders around these topics, showing that they are committed to assisting their customers beyond the typical services.

## 5\. Efficient customer support & service

Thanks to mobile apps, businesses can provide outstanding customer support and service. With quicker responses to questions and issues through tools like in-app chatbots or support requests, they improve the entire customer experience. Knowledge bases, FAQs, and other self-service app features allow users to get common answers at any time – without having to pick up the phone to ask for help.

Additionally, mobile apps can be used to collect customer feedback to enhance processes and offering further.

This way, enterprises can establish a reputation for great service and foster customer loyalty with effective, timely customer care.

## 6\. Data collection & customer insights

Finally, enterprises can use mobile apps to collect valuable data and insights into consumer behavior. By analyzing user behavior and interactions within the app, companies can tailor their offerings directly to their target audience.

The data can be leveraged to study purchasing patterns, demand, or user flows. This information helps enterprises refine their marketing strategies, personalize the mobile app experience, and develop products or services that fulfill the current demand.

The retail industry provides a very practical example. Imagine an enterprise seeing an increased in-app search volume for yellow skirts. These searches are unsuccessful, however, because the store does not currently stock any yellow skirts. As these numbers are available in real-time, the retailer can quickly adjust to the high demand by ordering the desired piece of clothing for its customers.

## Leveraging a mobile app effectively promotes sales and creates long-term customer relationships

The shift to mobile devices has completely changed the way businesses operate, enabling them to increase client interaction and operate more efficiently. With modern mobile applications, companies can improve customer loyalty and engagement, promote sales, streamline operations, and deliver top-notch service to set themselves apart from rivals.

Today, therefore, mobile applications are no longer a nice-to-have – they are vital tools for businesses that want to succeed.

## Ready to get started?

Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.

[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)

## Related blog posts

[![key benefits of mobile apps](https://scanbot.io/wp-content/uploads/2025/07/header-cold-chain-300x229.png)](https://scanbot.io/blog/cold-chain-logistics-management-barcode-scanner/)

### [Overcoming challenges in cold chain logistics management with barcode technology](https://scanbot.io/blog/cold-chain-logistics-management-barcode-scanner/)

Barcodes optimize cold chain logistics management, improving visibility and ensuring regulatory compliance for temperature-sensitive goods.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-2-1.svg)
Johanna July 18, 20255 mins read

[![key benefits of mobile apps](https://scanbot.io/wp-content/uploads/2023/08/What-is-mrz-hero-jpg.jpg-header-300x202.jpg)](https://scanbot.io/blog/what-is-an-mrz/)

### [How to scan MRZs with OCR: Considerations and first steps](https://scanbot.io/blog/what-is-an-mrz/)

MRZs encode information on ID cards and passports in a machine-readable format. Find out how to automatically read MRZs with data capture software.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg)
Kevin July 16, 20259 mins read

[![key benefits of mobile apps](https://scanbot.io/wp-content/uploads/2025/07/OCR-legal-documents-300x229.jpg)](https://scanbot.io/blog/mobile-ocr-for-legal-documents/)

### [OCR for legal documents: Unlock efficiency with mobile data capture](https://scanbot.io/blog/mobile-ocr-for-legal-documents/)

OCR creates digital, searchable versions of legal documents that can be retrieved instantly. Learn how to set up an OCR scanner app in minutes.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-2-1.svg)
Johanna July 11, 20257 mins read

+

## Web Storage Solutions
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

close

[Skip to content](https://scanbot.io/techblog/storage-wars-web-edition/#main)

## Prologue

All modern browsers offer ways to store data locally. Our world would look rather different if they didn’t. Since you’re reading this, I’m sure you already have some idea of what local storage in the browser is. Still, let’s quickly go over the basics.

I’m writing this in Google Docs. I figure it stores my data locally before syncing it to Google’s servers. This is a good thing, because it makes sure that any changes I make are immediately stored on my device, and that Docs doesn’t fully depend on an external server being available.

Cookies are the oldest way to store data locally – however, they’re ripe for abuse by third parties. They’re also intended for communication with servers anyway, so they are a story for another time.

Then we have session storage and local storage proper. They’re almost exactly the same, except for their scope and lifetime.

**Local storage** stores data per origin, meaning whenever and from whichever tab you visit the same URL, you have the same data stored locally.

**Session storage**, on the other hand, works per instance, meaning its lifecycle is bound to a single browser tab. It’s intended to allow separate instances of the same web app to run in different windows without interfering with each other, which is a nifty feature. However, it does not exactly fit our requirements.

Wait, which requirements? What exactly are we looking for?

We’re here to research storage options for the Scanbot Web SDK, you see.

This SDK has a complex API that deals with various different types of data. When you scan a document with it, you don’t just get a bunch of strings and numbers. For one, the result data also includes an array with the coordinates of the document’s location on the scanned image. For another, you also get the image itself as binary data (more on this later). All of this needs to be properly stored and managed as conveniently for the user as possible.

Here’s an example of the data object we need to store (I’ve removed annotations and irrelevant types for the sake of brevity):

```hljs yaml
class CroppedDetectionResult {
    croppedImage: RawImage | null;
    originalImage: Image;
    status: DetectionStatus = "NOT_ACQUIRED";
    detectionScores: DetectionScores;
    points: Point[];
    horizontalLines: LineSegment[];
    verticalLines: LineSegment[];
    aspectRatio: number;
    averageBrightness: number = 0;
}




```

As you can see, it’s not overly complicated. Some numbers and strings, some classes as types.

There are only two parts that are actually problematic: `RawImage`, which contains `Uint8Array` data, and `Image`, which is a type that can refer to any of the interfaces `ImageData`, `ArrayBuffer`, `Uint8Array` and `RawImage` itself.

How can we store all this, then?

## Local storage

Let’s start with the basics, the OG of storage: `localStorage`. It has been available since before I could call myself a software developer, all the way back in 2009. Ah, simpler times. `localStorage` is still used in all kinds of applications and the API has remained relatively stable throughout the ages, so I will jump right into the implementation.

Let’s create a separate storage class for our data object. Just the bare bones for storing an item and retrieving it without worrying about unique keys or anything.

JSON parsing is necessary because `localStorage` only accepts strings as values, another indication that this is not meant for larger data sets. And here it is:

```hljs javascript
export default class SBStorage {

    static storeDocument(source: CroppedDetectionResult): void {
        localStorage.setItem("document", JSON.stringify(source));
    }

    static getDocument(): CroppedDetectionResult {
        const item = localStorage.getItem("document");
        return item ? JSON.parse(item) : null;
    }
}




```

### Limitations

At this point, I just wanted to show you what a retrieved document looked like, but my React starter project immediately threw an exception:

```hljs csharp
sb-storage.ts:7 Uncaught (in promise) DOMException: Failed to execute 'setItem' on 'Storage': Setting the value of 'document' exceeded the quota.
    at SBStorage.storeDocument (




```

There is this nifty online tool that shows you how many characters can be held in `localStorage`: [https://arty.name/localstorage.html](https://arty.name/localstorage.html). As of writing this, my limit seems to be 5,200,000. This number will vary based on the browser and version you’re using.

The site’s author even explains:

> Chrome 6.0.472.36 beta let me save 2600-2700 thousands of characters, Firefox 3.6.8 – 5200-5300k, Explorer 8 – 4900-5000k, and Opera 10.70 build 9013 popped a dialog, that allowed me to give the script unlimited storage. Spec arbitrarily recommends 5 megabytes of storage, but doesn’t say a thing about actual characters, so in UTF-16 you get twice less.

So, let’s check how many characters’ worth of data we’re trying to store. A quick modification to the existing snippet …

```hljs javascript
const value = JSON.stringify(source);
console.log("Characters:", value.length);
localStorage.setItem("document", value);




```

… and the result we get is:

```hljs yaml
Characters: 68046772




```

As it turns out, `localStorage` can’t even store a tenth of that.

Even though we’ve already proven that it’s not a viable option here, I briefly want to touch on the fact that `localStorage` does not support binary data. That’s what I was going to get at in the first place, but instead we immediately ran into the quota issue.

I just want to quickly show you what serialization does to a binary data format. To begin with, the format of our `croppedImage` data is an `Uint8Array`. It looks more or less like what you would expect (this array is actually 1,504,272 characters long, but here’s the start of it):

```hljs undefined
[169, 195, 195, 169, 195, 195, 168, 194, 194, 168, ...\
\
\
\
\
```\
\
After serialization, the same array looks like the following:\
\
```hljs cpp\
{"0":169,"1":195,"2":195,"3":169,"4":195,"5":195,"6":168,"7":194,"8":194,"9":168, ...\
\
\
\
\
```\
\
We’ll get into why this is in a later section, but what we need to know right now is that `localStorage` only accepts strings and therefore doesn’t support binary formats out of the box.\
\
There are ways to get around this – you can probably already imagine an algorithm to turn this map of keys and values back into an array of integers. It’s always going to be a hack, though. You just shouldn’t have to manipulate binary data manually.\
\
### Base64\
\
The correct way to do this would be to convert the image data to a Base64 image first, which we can then store properly.\
\
**Base64** is a family of binary-to-text encoding schemes that represent binary data in an ASCII string format by transforming it into a radix-64 representation.\
\
That may sound complicated, but it’s really a straightforward process. You simply create a reader object, pass your array as a blob, and read it in as a data URL using the native JavaScript function. If necessary, also remove the descriptor part of the string. Here’s the convenience function we use:\
\
```hljs typescript\
public static async toBase64(data: Uint8Array): Promise {\
    // See https://stackoverflow.com/a/39452119\
    const base64url = await new Promise(resolve => {\
        const reader = new FileReader()\
        reader.onload = () => resolve(reader.result as string)\
        reader.readAsDataURL(new Blob([data]))\
    });\
    // remove the `data:...;base64,` part from the start\
    return base64url.slice(base64url.indexOf(',') + 1);\
}\
\
\
\
\
```\
\
And then the following, if not too long, can be effectively held in local storage:\
\
```hljs javascript\
const base64 = await ImageUtils.toBase64(source.croppedImage.data);\
// Base64: wsLQw8LQw8LQw8TRxMXSxMXTxcfUxcjVxMjVxcnXx8vaztHh1dbm19np2dvr2Nv...\
console.log("Base64: ", base64);\
\
\
\
\
```\
\
However, any kind of operation of this magnitude is computationally heavy, be it the direct manipulation of a key-value map or the Base64 version, and we’re trying to be optimal here. So all that just won’t cut it. We need to be able to work with binary data directly.\
\
And this brings us to …\
\
## Binary data\
\
In web development, we meet binary data mostly when dealing with files (creating, uploading, downloading). Another typical use case is image processing – which is what we’re doing here.\
\
There are many classes for various implementations of binary data in JavaScript, such as `ArrayBuffer`, `Uint8Array`, `DataView`, `Blob` and `File`, but these different nuances of implementation aren’t important right now.\
\
Anyway, the core object is `ArrayBuffer` – the root of everything, the raw binary data. And that is what we will be working with. Whichever of the aforementioned wrapper classes you use, it will contain a variation of an `ArrayBuffer`.\
\
### Everything is an object (almost)\
\
Now, the explanation as to why stringification of `ArrayBuffer` or `Uint8Array` turns it into a bit of a nightmare is actually pretty interesting. You see, everything in JavaScript is actually an object, except strings. Strings are still strings. But with arrays, it means you can do the following:\
\
```hljs cpp\
const a  = [1, 2, 3]; a.foo = "bar"console.log(a); // [ 1, 2, 3, foo: 'bar']\
\
\
\
\
```\
\
That’s because natively, an array is still an object prototype, but it does stringify into _looking_ like a simple array simply because its `toString()` function has been overwritten for the convenience of developers. Because it’s often needed.\
\
And that is also exactly why stringifying an `Uint8Array` turns it into an object of key-value pairs (remember the `{"0":169,"1":195,"2":195,"3":169 …}` example from earlier) and why we need additional steps to properly serialize it.\
\
### Serialization\
\
At this point, it’s also worth it to elaborate on a point I made previously: that binary data is not serializable. While that is still fundamentally true, JavaScript does have some native support for serialization these days, with the latest and greatest tool being `TextDecoder`. Take this example:\
\
```hljs javascript\
const buffer = new TextEncoder().encode('banana');\
const testObj = { encodedText: buffer.toString() };\
\
const serializedTestObj = JSON.stringify(testObj);\
console.log(serializedTestObj); // {"encodedText":"98,97,110,97,110,97"}\
\
const deserializedTestObj = JSON.parse(serializedTestObj);\
const deserializedBuffer = deserializedTestObj.encodedText.split(',');\
const newBuffer = Uint8Array.from(deserializedBuffer);\
const str = new TextDecoder().decode(newBuffer);\
console.log(str); // banana\
\
\
\
\
```\
\
Thank you to [Will Munslow from dev.to](https://dev.to/subterrane/how-to-serialize-that-ing-buffer-12m3) for this snippet!\
\
While it is _relatively_ straightforward, you’ll notice right away that this encoding method requires:\
\
- For the data to initially be a string that’s serialized with the coder class, which is a relatively uncommon use case (in most cases you start off with binary data).\
- String splitting, which is an expensive operation.\
- At the end, both buffer deserialization and text decoding again.\
\
Let’s now move on to the next web storage method.\
\
## IndexedDB\
\
So, what is IndexedDB? I would’ve gladly given my own short overview of the concept, but [MDN](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) says it best:\
\
> IndexedDB is a low-level API for client-side storage of significant amounts of structured data, including files/blobs. This API uses indexes to enable high-performance searches of this data.\
\
What that actually means for us is a convenient way to store the aforementioned binary data of `ArrayBuffer` format. Yay, no more of this complex, nonsensical and resource-hungry encoding and decoding logic!\
\
To quickly reiterate, the main problems with `localStorage` are that:\
\
- It can only store strings.\
- It has a very small and unstable data cap.\
\
IndexedDB easily solves both of these issues. On top of that, it has some additional benefits, such as the fact that it can be used inside web workers (more on this later). It’s also asynchronous, meaning the render cycle is not blocked while saving/loading.\
\
The only thing `localStorage` has going for it is the simplicity of its API. It’s just `localStorage.setItem` and `localStorage.getItem`. There are a couple of additional convenience functions, but that’s roughly it. Done!\
\
### Messy API & solutions\
\
IndexedDB isn’t perfect, either: The API is famously a fabulous mess. It’s such a mess, in fact, that a whole ecosystem of libraries has been developed around it just so that your average developer doesn’t have to deal with its nonsense.\
\
So, before we finally move on to our actual implementation, let’s take a look at what’s already out there to help you with this.\
\
There’s [use-indexeddb](https://www.npmjs.com/package/use-indexeddb), which promises to be the most lightweight one, but that’s because it only wraps a few of the basics. It’s not all that convenient to use, and it also features some intrusive logging that cannot be disabled.\
\
Next up is [Dexie](https://dexie.org/), a more fully-fledged storage framework that looks pretty promising. Its API is very straightforward. It’s super intuitive to create a base, write queries and add entries:\
\
```hljs csharp\
const db = new Dexie('MyDatabase');\
\
// Declare tables, IDs and indexes\
db.version(1).stores({ friends: '++id, name, age' });\
\
// Find some old friends\
const oldFriends = await db.friends.where('age').above(75).toArray();\
\
// or make a new one\
await db.friends.add({\
    name: 'Camilla',\
    age: 25,\
    street: 'East 13:th Street',\
    picture: await getBlob('camilla.png')\
});\
\
\
\
\
```\
\
At first glance, it seems to be inspired by C#’s LINQ statements, and it also supports live queries. That means you can combine it with, for example, Redux and completely handle state management through that. While that’s a nice feature, Dexie is actually a bit too elaborate for our use case.\
\
Another one is [idb](https://www.npmjs.com/package/idb), which claims to mostly mirror the IndexedDB API, but with some notable usability improvements. But really, looking at the implementation, it just seems to wrap the API in the `Promise` class and not much else. It’s definitely not worth the hassle of adding a third-party dependency for such a minor increase in convenience.\
\
The final popular wrapper framework is called [JsStore](https://jsstore.net/docs/get-started), which wraps the IndexedDB API into an SQL-like API.\
\
```hljs csharp\
var insertCount = await connection.insert({ into: 'Product', values: [value] });\
\
var results = await connection.select({ from: 'Product', where: { id: 5 } });\
\
\
\
\
```\
\
Which, in my humble opinion, is not much of an improvement. SQL is still pretty complex and it’s easy to create sub-optimal transactions. It’s not raw SQL, so maybe it’s not too bad, but I’ve been burned by SQL too many times to trust anything like that again.\
\
Plus, as with Dexie, JsStore seems to be overkill for our use case as well.\
\
To be honest, I knew in advance that I wasn’t going to be impressed by any of these libraries. The plan was always to get our hands dirty, the Spartan way, and not to tie ourselves down by any more dependencies. I just wanted to give a quick overview of the options available. If our solution were more complex, I’d go with Dexie.\
\
### The Spartan approach\
\
However, we’re building an SDK for clients, so we do not want to rely on any external libraries. It is possible, and we do use them, but we do not add them lightly, because:\
\
- They always come with a license, which we must adhere to and disclose.\
- They add overhead to future development and maintenance (I’m sure you know the pain of upgrading dependencies all too well).\
- They add additional points of failure to our project.\
\
If possible and within reason, we want to be in control of what happens inside our SDK.\
\
So, for our storage logic, let’s roll our own!\
\
In terms of use cases, ours is relatively straightforward. The data model itself is complex, but the database transactions are not, so I was not expecting too much of a hassle. The basic setup is simple enough:\
\
```hljs kotlin\
const request = indexedDB.open("SBSDKBase", 1);\
\
\
\
\
```\
\
We create the request, think of a name for the database and add a version number of the database we’re requesting from. Having to specify the version number right away may seem unnecessary, but the documentation makes it pretty clear why: database models change all the time and having an easy option to keep track of version history seems intuitive enough.\
\
The request object has different callbacks: `onerror`, `onupgradeneeded`, and `onsuccess`. Right now, we can ignore errors, as we’re just trying to add some basic documents to the base and retrieve them. There’s no model changes, no indexing, we only use readwrite mode and increment automatically (let’s hope this doesn’t come back to bite us).\
\
All we’re interested in at the moment is the success callback.\
\
```hljs csharp\
request.onsuccess = (event) => {\
    const db = (event.target as IDBOpenDBRequest).result;\
    db.createObjectStore("documents", { keyPath: "id", autoIncrement: true });\
\
    const transaction = db.transaction("documents", "readwrite");\
    const store = transaction.objectStore("documents");\
    store.add(source);\
\
    console.log("Added item to store");\
\
    const getRequest = store.get(1);\
    getRequest.onsuccess = (event) => {\
        const result = (event.target as IDBRequest).result;\
        console.log("Got item from store", result);\
    };\
};\
\
\
\
\
```\
\
This is the most bare-bones code snippet I thought I’d need to add a document to storage. Open the database, create a document table, put an object in it. I’ve been doing this for a long time, I’ve worked on various databases and thought I had a handle on it. I thought this would work.\
\
Nope. I got bitten right away. The error:\
\
```hljs csharp\
Uncaught DOMException: Failed to execute 'createObjectStore' on 'IDBDatabase': The database is not running a version change transaction.\
\
\
\
\
```\
\
Why would I be unable to create a table when opening the database? I’m barely getting started and I already get the feeling that writing raw SQL is more intuitive than this. There, you can at least execute queries once you open the database.\
\
Let’s hope it gets better from here on! At least the error message itself is not cryptic. We’ll try again by implementing `onupgradeneeded` (don’t forget to upgrade your db version):\
\
```hljs csharp\
request.onupgradeneeded = (event) => {\
    const db = (event.target as IDBOpenDBRequest).result;\
    db.createObjectStore("documents", { keyPath: "id", autoIncrement: true });\
    console.log("IndexedDB upgraded", event);\
};\
\
\
\
\
```\
\
Now we can also remove the `create` block from our success callback and voilá, we’ve created a database, added our first item to it, and also retrieved it:\
\
```hljs csharp\
request.onsuccess = (event) => {\
    const db = (event.target as IDBOpenDBRequest).result;\
    const transaction = db.transaction("documents", "readwrite");\
    const store = transaction.objectStore("documents");\
    store.add(source);\
    console.log("Added item to store");\
\
    const getRequest = store.get(1);\
    getRequest.onsuccess = (event) => {\
        const result = (event.target as IDBRequest).result;\
        console.log("Got item from store", result);\
    };\
};\
\
\
\
\
```\
\
And the retrieved object still contains our image data in the correct `Uint8Array` format. Juicy!\
\
```hljs yaml\
Got item from store {\
    status: 'OK',\
    detectionScores: {...},\
    points: Array(4),\
    horizontalLines: Array(5),\
    verticalLines: Array(5), …}\
    aspectRatio: 0.698217078300424averageBrightness: 183\
    croppedImage: {..., format: 'BGR', data: Uint8Array(1859760)\
    ...\
}\
\
\
\
\
```\
\
### Asynchronous improvements\
\
Time to make the entire process a bit more convenient. Let’s wrap the database opening into its own asynchronous block:\
\
```hljs typescript\
private static openDB(): Promise {\
    return new Promise((resolve, reject) => {\
\
        const DB_NAME = "SBSDKBase";\
        const DB_VERSION = 4;\
        const request = indexedDB.open(DB_NAME, DB_VERSION);\
\
        request.onsuccess = (event) => {\
            resolve((event.target as IDBOpenDBRequest).result);\
        };\
\
        request.onerror = (event) => { reject(event); };\
        request.onupgradeneeded = (event) => {\
            // Update object stores when necessary\
        };\
    });\
}\
\
\
\
\
```\
\
And another block to get the store itself, so we don’t have to duplicate that any further:\
\
```hljs csharp\
private static async getDocumentStore(): Promise {\
    const db = await SBStorage.openDB();\
    const transaction = db.transaction("documents", "readwrite");\
    return transaction.objectStore("documents");\
}\
\
\
\
\
```\
\
And now we have two super intuitive public functions for our storage service to store a document and retrieve all of them:\
\
```hljs javascript\
static async storeDocument(source: CroppedDetectionResult): Promise {\
    const store = await SBStorage.getDocumentStore();\
    store.add(source);\
}\
\
static async getDocuments(): Promise {\
    const store = await SBStorage.getDocumentStore();\
    return new Promise((resolve, reject) => {\
        store.getAll().onsuccess = (event) => {\
            const result = (event.target as IDBRequest).result;\
            resolve(result);\
        };\
    });\
}\
\
\
\
\
```\
\
Eventually we’ll have to add proper error handling, but as you can see, with a couple of wrapper functions, it’s relatively easy to implement IndexedDB on your own, no third-party libraries required.\
\
This asynchronous approach with `Promise` already utilizes callbacks and does not block the main thread. JavaScript is pretty nice, you see. We just implemented some basic syntactic sugar to make the code look nicer, and that ended up being the optimal approach anyway.\
\
### Timing transactions\
\
It’s possible to optimize this even further, and we’ll get to that in a second. But first, let’s check out how much time all these transactions take. You should always know exactly what you’re optimizing and why. Performance metrics are key.\
\
The most robust way to do this is to just go back to our initial implementation and measure how many milliseconds have passed after each meaningful operation. For example:\
\
```hljs javascript\
const currentMS = new Date().getTime();\
const request = indexedDB.open("SBSDKBase", 4);\
console.log("Opening indexedDB", new Date().getTime() - currentMS);\
\
request.onsuccess = (event) => {\
    const db = (event.target as IDBOpenDBRequest).result;\
    const transaction = db.transaction("documents", "readwrite");\
    const store = transaction.objectStore("documents");\
    store.add(source);\
    console.log("Added item to store", new Date().getTime() - currentMS);\
\
    const getRequest = store.get(1);\
    getRequest.onsuccess = (event) => {\
        const result = (event.target as IDBRequest).result;\
        console.log("Got item from store", new Date().getTime() - currentMS);\
    };\
};\
\
\
\
\
```\
\
```hljs csharp\
Opening indexedDB 0\
Added item to store 17\
Got item from store 30\
\
\
\
\
```\
\
That’s not too bad, but it’s also not nothing. Considering that I’m currently working on a higher-end MacBook Pro with an M2 chip and an SSD, this operation could easily take 20–50 times as long on a lower-end Android or iOS device.\
\
We have already implemented basic asynchronous IndexedDB usage with Promises, and in some use cases this would be good enough. But since we’re dealing with large chunks of data, though, it’s worth investing in true parallelism and moving everything off the main thread.\
\
And this brings us to …\
\
## Web workers\
\
> Web workers are a simple means for web content to run scripts in background threads. The worker thread can perform tasks without interfering with the user interface. ( [MDN](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers))\
\
How web workers differ from promises/callbacks is rather fundamental.\
\
I won’t dive too deep into threading, but to put it briefly, a JavaScript environment is fundamentally single-threaded. In its simplest form, asynchronous is just syntactic sugar for promise chains that allow for the user interface to be rendered before other long-running operations.\
\
It’s also important to note that two jobs can never run in parallel in this environment. One async operation might run in between two jobs of another one, so in that sense they can run “concurrently.” For true parallelism, e.g. simultaneously rendering the user interface and storing data, we need threads.\
\
Luckily, all modern browsers give us worker threads, allowing for this kind of operation.\
\
### Basic implementation & problems\
\
Let’s see how we can set up worker threads for our specific use case, following the same example code used previously.\
\
Spawning a worker is a relatively trivial task. From [MDN’s examples](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers), you just need to create a worker JavaScript file:\
\
```hljs javascript\
onmessage = function(e) {\
  console.log('Worker: Message received from main script');\
  const result = e.data[0] * e.data[1];\
  if (isNaN(result)) {\
    postMessage('Please write two numbers');\
  } else {\
    const workerResult = 'Result: ' + result;\
    console.log('Worker: Posting message back to main script');\
    postMessage(workerResult);\
  }\
}\
\
\
\
\
```\
\
And then you’re able to import it in your main JavaScript file and pass data to it as follows:\
\
```hljs javascript\
if (window.Worker) {\
  const myWorker = new Worker("worker.js");\
\
  [first, second].forEach(input => {\
    input.onchange = function() {\
      myWorker.postMessage([first.value, second.value]);\
      ...\
\
\
\
\
```\
\
As you can see, running a piece of JavaScript code on another thread is not as trivial as running it asynchronously. You need to spawn a dedicated worker from a separate file. While that seems relatively simple, once your build system becomes more complex, so does this.\
\
Where do you put your worker file in a Vite environment? Where does it go when you’re using Webpack? Does your environment use bare-bones Webpack that is configurable, or is it wrapped behind another build system? What if you also have automated tests running – are they easily able to pick up your worker file?\
\
Or, to give a more specific example: We use Webpack to transpile the SDK, and it has a separate worker-loader plugin that can be used to ensure workers are bundled into the end product. That’s pretty straightforward. However, our development environment uses the SDK’s source code directly, so it’s necessary to have another option to make sure this worker file is properly compiled into that environment as well.\
\
### Loading a file as data\
\
So, the easiest solution turns out to be to simply create the file as you normally would, in your source code, and then simply use JavaScript itself to package it into a blob. That blob is then loaded into the worker, exactly as another external JavaScript file would be (and thank you to [Martins Olumide on dev.to](https://dev.to/martinsolumide8/how-to-use-web-worker-in-react-with-typescript-4o79) for this hint).\
\
It may sound convoluted, but it’s a pretty solid solution to start off with. I bet it’s good enough for production, but before shipping this, we will definitely delve into additional performance metrics to see whether using Webpack to pre-compile it into the bundle is better or not.\
\
First, the basic worker file will look like this:\
\
```hljs javascript\
const workerFunction = function () {\
   // Perform every operation we want in this function\
   self.onmessage = (event: MessageEvent) => {\
      postMessage('Message received!');\
   };\
};\
\
// This stringifies the whole function\
let codeToString = workerFunction.toString();\
// This brings out the code in the bracket in string\
let mainCode = codeToString.substring(codeToString.indexOf('{') + 1, codeToString.LastIndexOf('}'));\
// Convert the code into a raw data\
let blob = new Blob([mainCode], { type: 'application/javascript' });\
// A url is made out of the blob object and we're good to go\
let worker_script = URL.createObjectURL(blob);\
\
export default worker_script;\
\
\
\
\
```\
\
The comments in the block above should make pretty clear what we intend to do: We’re basically mock loading a separate worker file by simply stringifying the entire worker and returning it as a blob.\
\
## Putting it all together\
\
After that, we just need to refactor our previous code a bit to make it fit into that JavaScript function and we have our worker up and running. We move the previously defined wrapper functions inside that function (because, thankfully, in JavaScript you can have inner functions, else this would be a mess) and do exactly what we did previously, only now we need to post the message instead of returning the data:\
\
```hljs javascript\
const workerFunction = function () {\
\
    function openDB(): Promise {\
        ...\
    }\
\
    async function getDocumentStore(): Promise {\
        ...\
    }\
\
    self.onmessage = (event: MessageEvent) => {\
        console.log("Received in worker thread:", event.data);\
        if (event.data.type === 'storeDocument') {\
            console.log("Storing document in worker thread");\
            getDocumentStore().then((store) => {\
                store.add(event.data.data);\
                self.postMessage(true);\
            });\
        } else if (event.data.type === 'getDocuments') {\
            console.log("Getting documents in worker thread");\
            getDocumentStore().then((store) => {\
                const request = store.getAll();\
                request.onsuccess = (event) => {\
                    self.postMessage((event.target as IDBRequest).result);\
                };\
            });\
        }\
    };\
};\
\
\
\
\
```\
\
Now that we’ve moved all of the IndexedDB API implementation to the worker, our main storage service file ends up looking pretty bare:\
\
```hljs typescript\
import { CroppedDetectionResult } from "../../core/worker/ScanbotSDK.Core";\
import worker_script from './worker/sb-storage.worker';\
\
export default class SBStorage {\
\
    private static readonly worker: Worker = new Worker(worker_script);\
\
    static async storeDocument(source: CroppedDetectionResult): Promise {\
        this.worker.postMessage({ type: 'storeDocument', data: source });\
\
        return new Promise((resolve, reject) => {\
            this.worker.onmessage = (event) => {\
                resolve(true);\
            }\
        });\
    }\
\
    static async getDocuments(): Promise {\
        this.worker.postMessage({ type: 'getDocuments' });\
        return new Promise((resolve, reject) => {\
            this.worker.onmessage = (event) => {\
                resolve(event.data);\
            }\
        });\
    }\
}\
\
\
\
\
```\
\
All that’s left in this file is the code to import the blob, initialize the worker itself, post messages to the worker and resolve the promise once a message has been received.\
\
And that’s it! Some additional error handling needs to be implemented, but that’s busywork at this point. The takeaway: In just a few steps, we’ve built ourselves an optimal storage solution for complex objects – using only IndexedDB and web workers, no third-party libraries needed.\
\
## Ready to get started?\
\
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.\
\
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)\
\
## Related blog posts\
\
[![Web SDK storage options](https://scanbot.io/wp-content/uploads/2025/04/web-barcode-scanner-sdk-header-new-300x229.png)](https://scanbot.io/techblog/react-barcode-reader-tutorial/)\
\
### [How to build a React.js Barcode Scanner web app with TypeScript and Vite](https://scanbot.io/techblog/react-barcode-reader-tutorial/)\
\
This tutorial will demonstrate how to integrate our Web Barcode Scanner SDK using React.js and Vite.\
\
![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-8-1.svg)\
Alex January 3, 20259 mins read\
\
[![Web SDK storage options](https://scanbot.io/wp-content/uploads/2023/08/Scanning-SDK-Header-768x362.jpg)](https://scanbot.io/techblog/developing-a-scanning-sdk-for-windows-a-first-hand-account/)\
\
### [Developing a scanning SDK for Windows: A first-hand account](https://scanbot.io/techblog/developing-a-scanning-sdk-for-windows-a-first-hand-account/)\
\
One of our software engineers shares his experiences with developing our new Windows SDK. Trials and tribulations await.\
\
![](https://scanbot.io/wp-content/uploads/2024/10/author-avatar-14.svg)\
Aare June 20, 202317 mins read\
\
[![Web SDK storage options](https://scanbot.io/wp-content/uploads/2025/04/web-barcode-scanner-sdk-header-new-300x229.png)](https://scanbot.io/techblog/progressive-web-app-barcode-scanner-tutorial/)\
\
### [How to build a Progressive Web App (PWA) Barcode Scanner with React and TypeScript](https://scanbot.io/techblog/progressive-web-app-barcode-scanner-tutorial/)\
\
Learn how to build an installable barcode scanning PWA using React and our Web SDK in this step-by-step guide.\
\
![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg)\
Kevin January 7, 202510 mins read\
\
+

## UWP Barcode Scanner SDK
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

close

[Skip to content](https://scanbot.io/developer/uwp-barcode-scanner/?utm_source=chatgpt.com#main)

# UWP Barcode Scanner

Add fast and accurate barcode scanning to your UWP apps with the Scanbot UWP Barcode Scanner SDK. Seamlessly integrate real-time barcode scanning across Windows applications, with support for both VB.NET and C#.

[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)

Trusted by
300+
global


industry leaders


![Volvo Customer](https://scanbot.io/wp-content/uploads/2024/12/company-volvo.svg)![Shiseido Customer](https://scanbot.io/wp-content/uploads/2024/09/company-shiseido.svg)![](https://scanbot.io/wp-content/uploads/2024/06/coop_logo-150x39.png)![PwC Customer](https://scanbot.io/wp-content/uploads/2024/05/company_pwc.svg)![TitleMax Customer](https://scanbot.io/wp-content/uploads/2023/10/company_title-max.svg)![Procter & Gamble Customer](https://scanbot.io/wp-content/uploads/2023/09/company_procter-and-gamble.svg)![Generali Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_generali-150x121.png)![Deutsche Telekom Case Study](https://scanbot.io/wp-content/uploads/2023/06/company_deutsche-telekom-150x72.png)![Deutsche Bahn Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_db-150x106.png)![AXA Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_axa-150x150.png)![ArcBest Customer](https://scanbot.io/wp-content/uploads/2023/06/company_arc-best-1-150x28.png)![Volvo Customer](https://scanbot.io/wp-content/uploads/2024/12/company-volvo.svg)![Shiseido Customer](https://scanbot.io/wp-content/uploads/2024/09/company-shiseido.svg)![](https://scanbot.io/wp-content/uploads/2024/06/coop_logo-150x39.png)![PwC Customer](https://scanbot.io/wp-content/uploads/2024/05/company_pwc.svg)![TitleMax Customer](https://scanbot.io/wp-content/uploads/2023/10/company_title-max.svg)![Procter & Gamble Customer](https://scanbot.io/wp-content/uploads/2023/09/company_procter-and-gamble.svg)![Generali Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_generali-150x121.png)![Deutsche Telekom Case Study](https://scanbot.io/wp-content/uploads/2023/06/company_deutsche-telekom-150x72.png)![Deutsche Bahn Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_db-150x106.png)![AXA Success Story](https://scanbot.io/wp-content/uploads/2023/06/company_axa-150x150.png)![ArcBest Customer](https://scanbot.io/wp-content/uploads/2023/06/company_arc-best-1-150x28.png)

![UWP Barcode Scanner SDK](https://scanbot.io/wp-content/uploads/2023/07/uwp-developer-page-bento-1.png)

Seamless UWP integration

The Scanbot UWP Barcode Scanner SDK integrates natively into Windows applications, providing smooth barcode scanning functionality using VB.NET or C#, without the need for third-party integrations.

![UWP Barcode Scanner SDK](https://scanbot.io/wp-content/uploads/2023/07/uwp-developer-page-bento-2.png)

Barcode scanning in challenging conditions

The UWP Barcode Scanner SDK is designed to perform in challenging real-world environments, such as:

- Damaged barcodes
- Low-light environments
- Tiny or distant barcodes

[Customizable UI components\\
\\
Our Ready-To-Use UI components cover all barcode scanning scenarios and are highly customizable.](https://scanbot.io/rtu-ui/)

Fast.


Very fast.

Every scan happens in
0.04s
or less


Scans all major barcode types
Code 39

Code 93

Code 32

Code 25

EAN-5

PDF417

GS1 DataBar

Code 39

Code 93

Code 32

Code 25

EAN-5

PDF417

GS1 DataBar

EAN-13

MSI Plessey

EAN-2

Aztec Code

rMQR Code

Codabar

UPC-A

EAN-13

MSI Plessey

EAN-2

Aztec Code

rMQR Code

Codabar

UPC-A

EAN-8

ISBN

GiroCode

GS1-128

Data Matrix

IATA 2 of 5

EAN-8

ISBN

GiroCode

GS1-128

Data Matrix

IATA 2 of 5

Code 128

Code 11

QR Code

UPC-E

Micro QR Code

MaxiCode

Code 128

Code 11

QR Code

UPC-E

Micro QR Code

MaxiCode


## Add a fast and reliable UWP Barcode Scanner to your app

The Scanbot UWP [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) provides developers with a reliable solution to integrate fast barcode scanning functionality into Universal Windows Platform (UWP) applications. Whether you’re using VB.NET or C#, the SDK supports seamless integration with minimal coding effort, enabling real-time barcode recognition on Windows devices.

Supporting major barcode formats such as QR codes, PDF417, and EAN, the SDK is ideal for a wide range of industries, including logistics, retail, healthcare, and manufacturing. Developers can quickly implement the barcode scanning functionality and customize the UI for a tailored experience. Additionally, the SDK handles low-light environments and can scan damaged barcodes, ensuring high reliability in any condition.

The SDK also supports image-based barcode scanning, making it useful for applications that need to scan barcodes from static images uploaded to the app.

### Technical requirements

The Scanbot UWP Barcode Scanner SDK requires:

- **UWP Version**:


10.x or higher
- **Languages**:


Compatible with both VB.NET and C#
- **Hardware**:


A rear-facing camera with autofocus

## Integrate  this evening    with  your framework

## How to integrate the Scanbot UWP Barcode Scanner SDK

The SDK offers various ways to extract barcodes from a live camera feed or still images.

**Scanner UI**

For live detection, you can use our so-called **Ready-To-Use UI Component (RTU UI)** or implement a custom scanner UI by using our **Classic Component**.

**Ready-To-Use UI Component**

This UI component is a final and ready-to-use [`Page`](https://learn.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.page) component and is meant for the simplest interactions, with the fewest customizations possible, but can be implemented within a couple of minutes.

To launch Scanbot SDK’s barcode scanner `Page`, run the following:

```codeBlockLines_e6Vv hljs csharp
var scanner = new BarcodeScanner();var configuration = new BarcodeScannerConfiguration();BarcodeResult result = await scanner.Start(Frame, configuration);Debug.WriteLine(result.Barcodes);




```

This approach returns a `BarcodeResult` object and then closes and properly disposes the scanner `Page` itself.

This `BarcodeResult` object contains a list of barcodes, each with a `SoftwareBitmap` containing a crop of the detected barcode, and, if something went wrong, a `Scanbot.Model.ScanbotSdkException` object with a message.

**Classic Component**

If you wish to build your own layout, we advise you to use `BarcodeScannerComponent`. It’s a XAML-compliant camera component that offers endless recognition and handles all initialization and error-handling for you. This approach allows you full customization of the UI and workflow. Since you have full control over the lifecycle of this component, you can implement continuous scanning.

Add the component to your view:

```codeBlockLines_e6Vv

    

```

[Read the full UWP Barcode Scanner SDK documentation](https://docs.scanbot.io/barcode-scanner-sdk/windows/barcode-scanner/ui-components/)

## Ready to get started?

Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.

[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)

## Frequently Asked Questions

### **What are the key requirements for the Scanbot UWP Barcode Scanner SDK?**

The Scanbot UWP Barcode Scanner SDK has the following key requirements:

\- **Supported Platforms:** UWP Version 10.x or higher

\- **Supported Architectures:** x86, x64, ARM, and ARM64

\- **Development Environment:** Visual Studio 2019 or newer with UWP development workloads

\- **Programming Languages:** Compatible with C# and VB.NET

\- **Hardware:** A device with a rear-facing camera equipped with autofocus

These requirements ensure compatibility with a wide range of Windows devices, enabling robust barcode scanning capabilities within UWP applications.

### **Can I use the UWP Barcode Scanner SDK offline?**

Yes, the Scanbot UWP Barcode Scanner SDK functions fully offline. This ensures that all barcode data is processed directly on the device, without needing an internet connection. It is ideal for applications in healthcare, logistics, and retail, where data privacy and security are important, as well as for use in remote areas with limited connectivity.

### **Does the UWP Barcode Scanner SDK support all barcode types?**

Yes, the Scanbot UWP Barcode Scanner SDK supports a wide array of barcode formats, including:

**1D Barcodes:** [UPC](https://scanbot.io/barcode-scanner-sdk/upc/), [EAN](https://scanbot.io/barcode-scanner-sdk/ean/), [Code 128](https://scanbot.io/barcode-scanner-sdk/code-128/), [Code 39](https://scanbot.io/barcode-scanner-sdk/code-39/), [ITF](https://scanbot.io/barcode-scanner-sdk/itf-code/), and more

**2D Barcodes:** [QR codes](https://scanbot.io/glossary/qr-code/), [PDF417](https://scanbot.io/barcode-scanner-sdk/pdf417/), [DataMatrix](https://scanbot.io/barcode-scanner-sdk/data-matrix/), [Aztec](https://scanbot.io/barcode-scanner-sdk/aztec-code/), and others

This broad support ensures that the SDK is flexible and can be utilized across different industries, including logistics, healthcare, retail, and more.

### **Is there a trial version available for the UWP Barcode Scanner SDK?**

Yes, a **7-day free trial license** is available for the Scanbot UWP Barcode Scanner SDK. To request a trial, visit the Scanbot SDK [trial page](https://scanbot.io/trial/), fill out the required form, and you will receive a trial license key to test all SDK features.

### **Is the Scanbot UWP Barcode Scanner SDK compatible with different Windows devices?**

Yes, the Scanbot UWP Barcode Scanner SDK is compatible with a wide range of Windows devices, including:

\- Windows 10 version 1809 or higher

\- Architectures: x86, x64, ARM, and ARM64

### **How do I customize the UWP Barcode Scanner UI?**

The Scanbot UWP Barcode Scanner SDK provides customizable UI components that allow you to adjust the scanner’s interface according to your app’s design and user experience needs. Customization options include:

1\. Overlay design and colors

2\. Button styles

3\. Success and error feedback messages

These options make it easier to integrate barcode scanning functionality into your UWP app while maintaining your branding and app design.

If you need more customization options, you can also integrate the SDK using Classical Components – giving you complete freedom over the design of the Scanner UI.

### **What platforms are supported besides UWP?**

In addition to UWP, the Scanbot SDK is available on a variety of other platforms, making it versatile for developers working on multiple platforms. Supported platforms include:

1\. [iOS](https://scanbot.io/developer/ios-barcode-scanner-sdk/)

2\. [Android](https://scanbot.io/developer/android-barcode-scanner/)

3\. [JavaScript](https://scanbot.io/developer/javascript-barcode-scanner/) (Web)

4\. [Flutter](https://scanbot.io/developer/flutter-barcode-scanner/)

5\. [React Native](https://scanbot.io/developer/react-native-barcode-scanner/)

6\. [Cordova](https://scanbot.io/developer/cordova-barcode-scanner-plugin/)

7\. [Capacitor](https://scanbot.io/developer/capacitor-barcode-scanner-sdk/) / [Ionic](https://scanbot.io/developer/ionic-barcode-scanner/)

8\. [Xamarin](https://scanbot.io/developer/xamarin-barcode-scanner/)

9\. [.NET MAUI](https://scanbot.io/developer/net-maui-barcode-scanner-sdk/)

10\. [Linux](https://scanbot.io/developer/linux-barcode-scanner/)

This broad platform support ensures that barcode scanning functionality can be integrated across various environments, including mobile, desktop, and web applications.

+

## Prevent Barcode Misreads
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

close

[Skip to content](https://scanbot.io/blog/prevent-barcode-scanner-misreads/?utm_source=chatgpt.com#main)

When barcode scanners decode incorrect information, workflows can grind to a halt or – worse – continue with false information. In mission-critical operations, like warehouse and inventory management or at the point-of-sale (POS), this can have far-reaching consequences.

## What is a false positive barcode scan?

A false positive barcode scan occurs when a barcode scanner misidentifies a foreign pattern or noise on a barcode as a valid part of it. The result: Since the barcode reader will show a seemingly correct value, all dependent operations will proceed as usual. In reality, however, the scanned data is incorrect.

In real-world workflows, checking every single scanned barcode for correctness is impossible. False positives may go undetected, to be noticed only once the damage has already been done. This is why barcodes that have been scanned incorrectly are more dangerous than ones that haven’t been scanned at all.

## Why do barcode scanners read barcodes incorrectly?

Several factors influence how often barcode scanners produce false positives. Some are environmental, others are related to scanner technology and settings.

### Damaged barcodes

![Example of a ripped barcode](https://scanbot.io/wp-content/uploads/2024/01/ripped-barcode-example.png)

When barcodes are damaged or faded and have smudges or uneven spots, a barcode scanner might interpret that additional noise as a legitimate barcode pattern and decode it accordingly. In those cases, the barcode’s bad condition makes it difficult for scanners to extract the correct data accurately.

### Real-world conditions

![Example of a poorly lit barcode](https://scanbot.io/wp-content/uploads/2024/01/poorly-lit-barcode-example.png)

In real-life operations, ideal scanning conditions aren’t a given. Lighting, distance, and scanner alignment are just three common issues.

The lighting can be too harsh – or too poor – which impacts a scanner’s ability to read barcodes accurately, potentially causing false positives and failed scans. Distance matters because barcodes can be both too close or too far away for reliable scans.

Some scanners’ performance relies on the alignment of the scanner and barcode. Unsophisticated laser barcode scanners, for instance, must be placed such that the laser line is at an angle of 90 degrees to the bars of the barcode.

![Example of a angled barcode](https://scanbot.io/wp-content/uploads/2024/01/angled-barcode-example-2.png)

### Scanner-related issues

Laser scanners and camera-based scanners are two of the most popular choices for barcode scanners. They are usually very reliable, especially compared to manual entry. Still,, even these solutions are not immune to scanning false positives.

For instance, [laser barcode scanners](https://scanbot.io/blog/how-does-a-laser-barcode-scanner-work/) famously struggle with [inverted barcodes](https://scanbot.io/blog/how-to-scan-an-inverted-barcode/). Besides that, their laser light has to hit barcodes at a certain angle for accurate scanning. If they are mounted or handled incorrectly, false positives are more likely.

Camera-based barcode scanners, on the other hand, can scan inverted barcodes with the help of automatic detection modes. Their advanced image processing techniques enable them to identify and decode heavily damaged 2D barcodes accurately. However, their scan accuracy is tied to the camera’s quality. A low camera resolution, for instance, can result in more misreads.

What both laser- and camera-based scanners have in common is that certain settings can heighten the risk of receiving false positives. Higher sensitivity settings, in particular, help read faded or damaged barcodes, but they also make the scanner more prone to misinterpreting non-barcode patterns and noise as part of a barcode. Lowered sensitivity means that low-contrast barcodes may fail to scan accurately – a no-win situation.

In general, mobile devices enhanced with barcode scanning software will produce fewer false positives. However, today’s barcode scanner software options differ vastly in scan quality.

## Minimize the risk of false positives with mobile barcode scanners

At first glance, [open-source solutions and other free barcode scanning libraries](https://scanbot.io/blog/ml-kit-vs-zxing/) may seem like good, cost-efficient options. However, they have several disadvantages that can make them more prone to misreading. Open-source libraries often struggle with high-volume use cases, certain barcode symbologies, inadequate lighting, and device compatibility.

If you already use such a solution, limit the barcode scanner to only the types you expect to read. This will reduce the likelihood of the scanner misinterpreting other patterns (such as smudges or noise) as valid barcodes.

If this doesn’t solve the problem, consider switching to a solution that delivers higher accuracy and fewer false positives.

For mission-critical use cases, commercial solutions are your best bet. Not only do they often perform more reliably to begin with, they also come with extensive customer support. Should false positive scans occur, you can rely on developers committed to improving the solution.

The Scanbot [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) comes at a flat annual fee that is independent of the number of users or scans. We at Scanbot SDK know the impact that real-world conditions have on scan quality. That is why we ensured that the SDK scans even damaged, tiny, and distant barcodes – even in low-light environments.

The SDK scans all major barcode types. With our [AR overlay](https://scanbot.io/blog/how-to-use-our-barcode-scanner-ar-overlay/), users get real-time feedback on the scanning process, helping them achieve the best result possible. Complete data privacy is guaranteed: The SDK functions entirely offline, without connection to servers or usage tracking.

To troubleshoot false positives, integration challenges, or any other issue, our support engineers and a dedicated Customer Success Manager are always happy to help via Slack or Teams.

Experience the SDK yourself by trying our [free Barcode Scanner demo apps](https://scanbot.io/demo-apps/) or running our [example apps](https://github.com/doo/scanbot-sdk-examples/) for various platforms. If you’d like to test the SDK in your app, generate a [free 7-day trial license](https://scanbot.io/trial/) to start integration immediately.

## Ready to get started?

Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.

[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)

## Related blog posts

[![barcode scanner misread](https://scanbot.io/wp-content/uploads/2024/01/damaged-barcodes-header-768x362.jpg)](https://scanbot.io/blog/how-to-read-damaged-or-blurry-barcodes/)

### [How to read damaged or blurry barcodes](https://scanbot.io/blog/how-to-read-damaged-or-blurry-barcodes/)

As barcodes are used in all kinds of environments, they are susceptible to being scratched, deformed, or rendered illegible in other ways. Let’s look at the most common problems...

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg)
Kevin January 11, 20246 mins read

[![barcode scanner misread](https://scanbot.io/wp-content/uploads/2024/07/barcode-qa-header-768x432.png)](https://scanbot.io/blog/how-to-scan-an-inverted-barcode/)

### [How to scan an inverted barcode](https://scanbot.io/blog/how-to-scan-an-inverted-barcode/)

How does a barcode scanner recognize that a barcode is inverted and still scan it accurately? Here's the answer!

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg)
Kevin July 30, 20244 mins read

[![barcode scanner misread](https://scanbot.io/wp-content/uploads/2024/07/barcode-qa-header-768x432.png)](https://scanbot.io/blog/how-does-a-laser-barcode-scanner-work/)

### [How does a laser barcode scanner work?](https://scanbot.io/blog/how-does-a-laser-barcode-scanner-work/)

How does a laser scanner transform the black and white lines of a barcode into human-readable information? Let's find out!

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-2-1.svg)
Johanna October 22, 20244 mins read

+

## Flutter Barcode Scanner Tutorial
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

close

[Skip to content](https://scanbot.io/techblog/flutter-barcode-scanner-package-android-tutorial/?utm_source=chatgpt.com#main)

This tutorial shows how to create a simple barcode scanning app in Flutter using the [**flutter\_barcode\_scanner**](https://pub.dev/packages/flutter_barcode_scanner) package. While this library hasn’t been updated in years, it’s still widely used for both Android and iOS apps.

This guide covers installation, configuration, basic usage, and solutions to common problems. For this tutorial, we’ll focus on testing with an Android application.

## Setting up the project

Before diving into the code, let’s set up the Flutter project and install the necessary dependencies.

### Step 1: Create a new Flutter project

To create the Flutter project, open your terminal and run the following commands:

```hljs undefined
flutter create barcode_scanner_app
cd barcode_scanner_app




```

### Step 2: Add dependencies to **pubspec.yaml**

Now add the **flutter\_barcode\_scanner** package to **barcode\_scanner\_app/pubspec.yaml**.

You can either use the [original package](https://pub.dev/packages/flutter_barcode_scanner) …

```hljs yaml
dependencies:
  flutter:
    sdk: flutter
  flutter_barcode_scanner: ^2.0.0




```

… or a [fork](https://github.com/decodevM/flutter_barcode_scanner) that includes fixes for Android:

```hljs yaml
dependencies:
  flutter:
    sdk: flutter
  flutter_barcode_scanner:
    git:
      url: https://github.com/decodevM/flutter_barcode_scanner.git
      ref: master




```

To install the dependencies, run the following command in your terminal:

```hljs csharp
flutter pub get




```

We’ll need to access the device camera to scan barcodes. Therefore, open **android/app/src/main/AndroidManifest.xml** and add the necessary permissions:

```hljs html






```

### Step 3: Fixes for Android building

To ensure compatibility with newer Android versions and resolve common build issues, apply the following fixes to your application.

#### 1\. Update `minSdkVersion`

Open **android/app/build.gradle** and set the `minSdkVersion` to at least **21**:

```hljs undefined
defaultConfig {
    minSdkVersion 21
    targetSdkVersion 33
}




```

#### 2\. Set the correct NDK version

This package requires a specific Android NDK version ( **27.0.12077973**). First, check your installed NDK versions by running:

```hljs undefined
sdkmanager --list | grep ndk




```

💡 You can also check the installed NDK versions in Android Studio:

1. Go to **Tools > SDK Manager**.
2. Open the **SDK Tools** tab.
3. Check the **Show Package Details** box and look for **NDK (Side by side)**. The installed versions will be listed there.

![Checking the installed NDK versions in Android Studio's SDK Manager](https://scanbot.io/wp-content/uploads/2025/03/android-studio-ndk-versions-screenshot.png)

If the required version is missing, install it using the following command or via Android Studio’s SDK Manager:

```hljs cpp
sdkmanager "ndk;27.0.12077973"




```

Then update **android/app/build.gradle**:

```hljs cpp
android {
    ndkVersion "27.0.12077973"
}




```

#### 3\. Fix namespace issue for Android Gradle Plugin (AGP 7.0+)

If you encounter a “Namespace not specified” error, manually add a namespace in the package directory. Navigate to the package location …

```hljs swift
cd ~/.pub-cache/hosted/pub.dev/flutter_barcode_scanner-2.0.0/android




```

… then add the following to the **build.gradle** file located there:

```hljs dart
android {
    namespace 'com.amolg.flutterbarcodescanner'
}




```

## Basic implementation

Now we’ll implement a minimal barcode scanning feature. To start, open **lib/main.dart** and import the required packages.

```hljs dart
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart';




```

Next, define the `main` application:

```hljs csharp
void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Barcode Scanner Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
      ),
      home: const MyHomePage(title: 'Barcode Scanner Demo'),
    );
  }
}




```

We need to initialize the `scanBarcode` method (declared inside a `try except` block to handle errors) with four parameters:

```hljs dart
class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  @override
  State createState() => _MyHomePageState();
}

class _MyHomePageState extends State {
  String _scanResult = "";

  Future scanCode() async {
    String barcodeScanRes;
    try {
      barcodeScanRes = await FlutterBarcodeScanner.scanBarcode(
        "#ff6666", // Red scanning line
        "Cancel",
        true, // Show flash toggle
        ScanMode.BARCODE,
      );
    } on PlatformException {
      barcodeScanRes = "Failed to scan";
    }
    setState(() {
      _scanResult = barcodeScanRes;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [\
            const Text('Scan Result:', style: TextStyle(fontSize: 16)),\
            const SizedBox(height: 8),\
            Text(\
              _scanResult.isEmpty ? 'No scan yet' : _scanResult,\
              style: const TextStyle(\
                fontSize: 20,\
                fontWeight: FontWeight.bold,\
                color: Colors.blue,\
              ),\
            ),\
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: scanCode,
        tooltip: 'Scan Barcode',
        child: const Icon(Icons.qr_code_scanner),
      ),
    );
  }
}




```

With this, we’ve built a basic barcode scanning app. Try it out if you like:

```hljs undefined
flutter run




```

![Scanning a single barcode with the flutter_barcode_scanner package](https://scanbot.io/wp-content/uploads/2025/03/flutter-barcode-scanner-package-tutorial-gif-1.gif)

You might notice that the camera stream’s aspect ratio is wrong. Unfortunately, this is a common issue with the **flutter\_barcode\_scanner** package. More on this further down.

## Advanced features

The **flutter\_barcode\_scanner** library provides additional capabilities to add to your barcode scanner app.

### 1\. Different scanning modes

The `flutter_barcode_scanner` supports three scan modes:

| Scan Mode | Description |
| --- | --- |
| `ScanMode.BARCODE` | Restricts scanning to 1D barcodes. |
| `ScanMode.QR` | Restricts scanning to 2D barcodes. |
| `ScanMode.DEFAULT` | Scans both 1D and 2D barcodes. |

Restricting scanning to certain barcode types prevents accidental scans and improves the scanner’s performance, as it doesn’t need to check for each supported symbology.

![Scanning only 1D barcodes with the flutter_barcode_scanner package](https://scanbot.io/wp-content/uploads/2025/03/flutter-barcode-scanner-package-tutorial-gif-2.gif)

### 2\. Customizing the scanner’s appearance

You can change the scanner’s appearance by modifying the following parameters:

| Parameter | Example Value | Description |
| --- | --- | --- |
| `COLOR_CODE` | `"#ff6666"` | HEX color for the scanning line. |
| `CANCEL_BUTTON_TEXT` | `"Cancel"` | Custom text for the cancel button. |
| `isShowFlashIcon` | `true` | Whether to show the flash toggle button. |

The following code snippet shows an example of how to define the appearance configurations:

```hljs csharp
Future scanWithCustomAppearance() async {
  String barcodeScanRes;
  try {
    barcodeScanRes = await FlutterBarcodeScanner.scanBarcode(
      "#4CAF50", // Green scanning line
      "Close",   // Custom cancel button text
      true,      // Enable flash toggle
      ScanMode.DEFAULT,
    );
  } on PlatformException {
    barcodeScanRes = "Failed to scan";
  }
  setState(() {
    _scanResult = barcodeScanRes;
  });
}




```

### 3\. Continuous barcode scanning

By default, the scanner stops after detecting a barcode. To enable continuous scanning, you need to use a stream listener ( `listen`), as shown in the following code snippet:

```hljs csharp
void startContinuousScanning() {
  FlutterBarcodeScanner.getBarcodeStreamReceiver(
    "#ff6666",
    "Cancel",
    true,
    ScanMode.DEFAULT,
  )?.listen((barcode) {
    if (barcode != '-1') {
      setState(() {
        _scanResult = barcode;
      });
    }
  });
}




```

In the above code example, the scanner listens for barcodes ( `barcode`). If the scan result is not `-1`, meaning it wasn’t canceled, it updates the `_scanResult` state to ensure all barcode results are available after the scanning stops.

![Scanning barcodes continously with the flutter_barcode_scanner package](https://scanbot.io/wp-content/uploads/2025/03/flutter-barcode-scanner-package-tutorial-gif-3.gif)

Unfortunately, the continuous scanning mode lacks an indication of which barcodes have been successfully scanned. Worse still, barcodes outside the [viewfinder](https://scanbot.io/techblog/implementing-a-barcode-scanner-viewfinder/) are also picked up, leading to unexpected entries in the results list. When using the **flutter\_barcode\_scanner** package in your project, you might want to remedy this with your own code.

## Disadvantages of using the flutter\_barcode\_scanner package to scan barcodes

While the **flutter\_barcode\_scanner** package can be useful for quickly prototyping a Flutter app with barcode scanning functionalities, its lack of maintenance results in compatibility issues with modern Flutter, Android, and iOS environments. Issues users have faced when integrating the package into their Flutter apps include:

- Wrong aspect ratio of the camera stream
- Problems compiling with newer Flutter versions
- Incompatibility with older devices
- Black screen when trying to scan a barcode
- Crashes on startup

For companies that heavily rely on barcode scanning in their business processes, we recommend using an enterprise-grade solution instead.

## Building a Flutter Barcode Scanner with the Scanbot SDK

We developed the Scanbot [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) to help enterprises overcome the hurdles presented by free barcode scanning software. Our goal was to have a developer-friendly solution available for a wide range of platforms that consistently delivers high-quality results – even in challenging circumstances.

With the SDK’s Ready-to-Use UI Components, you can even use an AR overlay to display multiple barcodes’ contents directly in the viewfinder, enhancing the scanning experience.

![Scanning a single barcode](https://scanbot.io/wp-content/uploads/2025/02/single-barcode-scanning-gif.gif)Scanning a single barcode

![Scanning multiple barcodes with the AR overlay](https://scanbot.io/wp-content/uploads/2025/02/multi-barcode-scanning-gif.gif)Scanning multiple barcodes with the AR overlay

Setting up a Flutter app to scan 1D or 2D barcodes is straightforward. We’re going to follow these steps:

1. Prepare the project.
2. Install the SDK.
3. Initialize the SDK.
4. Implement the scanning modules.
5. Start scanning barcodes!

### Requirements

To develop Flutter applications for Android and iOS, ensure you have the following:

1. **Flutter SDK**: [Download the latest version](https://flutter.dev/docs/get-started/install) for your OS.
2. **Dart SDK**: No separate installation needed, since it’s integrated with Flutter.
3. **The right IDEs for your target platforms:**
1. [Android Studio](https://developer.android.com/studio) to develop for Android. It includes the Android SDK and AVD Manager.
2. [Xcode](https://developer.apple.com/xcode/) for iOS development on macOS.
3. You can also use [Visual Studio Code](https://code.visualstudio.com/), which supports Flutter plugins.

⚠️ **A note to Windows users:** A Mac is necessary to build and test iOS apps. Consider using a remote Mac service or a physical Mac as a build server.

### 1\. Preparing the project

First, create a new directory for your project and navigate into it:

```hljs undefined
mkdir test-flutter
cd test-flutter





```

Create a new Flutter project:

```hljs undefined
flutter create test_barcode_scanner
cd test_barcode_scanner





```

Since we need access to the device camera to scan barcodes, let’s add the necessary **camera permissions** for Android and iOS.

Add camera permissions to `android/app/src/main/AndroidManifest.xml`:

```hljs html







```

And in `ios/Runner/Info.plist`:

```hljs html
NSCameraUsageDescription
We need camera access to scan barcodes.





```

### 2\. Installing the SDK

Add the Scanbot Flutter Barcode Scanner package to your `pubspec.yaml`:

```hljs yaml
dependencies:
  flutter:
    sdk: flutter
	barcode_scanner: ^5.1.0





```

Run the following commnand to install the packages:

```hljs csharp
flutter pub get





```

💡 Please refer to our [changelog](https://docs.scanbot.io/barcode-scanner-sdk/flutter/changelog/) for the latest version of the Barcode Scanner SDK.

Now that the project is set up, we can integrate the barcode scanning functionalities.

### 3\. Initializing the SDK

Initialize the SDK in `main.dart`:

```hljs typescript
import 'package:flutter/material.dart';
import 'package:barcode_scanner/scanbot_barcode_sdk_v2.dart';

const BARCODE_SDK_LICENSE_KEY = "";

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State createState() => _MyHomePageState();
}

class _MyHomePageState extends State {
  @override
  void initState() {
    super.initState();
    _initScanbotSdk();
  }

  Future _initScanbotSdk() async {
    var config = ScanbotSdkConfig(
      licenseKey: BARCODE_SDK_LICENSE_KEY,
      loggingEnabled: true,
    );

    try {
      await ScanbotBarcodeSdk.initScanbotSdk(config);
      print('Scanbot SDK initialized successfully');
    } catch (e) {
      print('Error initializing Scanbot SDK: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
  ...
}





```

💡 Without a license key, our SDK only runs for 60 seconds per session. This is more than enough for the purposes of our tutorial, but if you like, you can [generate a license key](https://scanbot.io/trial/) using your [applicationId](https://docs.scanbot.io/barcode-scanner-sdk/flutter/detailed-setup-guide/sdk-initialization/#app-identifier).

### 4\. Implementing the scanning modes

The SDK’s [RTU UI components](https://docs.scanbot.io/barcode-scanner-sdk/flutter/barcode-scanner/ready-to-use-ui/) make it easy to deploy our Flutter Barcode Scanner package’s different scanning modes in your app. Let’s start with the simplest use case: single-barcode scanning.

Implement the barcode scanning functionality:

```hljs dart
void _startBarcodeScanning() async {
  try {
    // Create the default configuration object.
    var configuration = BarcodeScannerConfiguration();

    // Initialize the use case for single scanning.
    var scanningMode = SingleScanningMode();
    // Enable and configure the confirmation sheet.
    scanningMode.confirmationSheetEnabled = true;
    scanningMode.sheetColor = ScanbotColor("#FFFFFF");

    // Hide/unhide the barcode image.
    scanningMode.barcodeImageVisible = true;

    // Configure the barcode title of the confirmation sheet.
    scanningMode.barcodeTitle.visible = true;
    scanningMode.barcodeTitle.color = ScanbotColor("#000000");

    // Configure the barcode subtitle of the confirmation sheet.
    scanningMode.barcodeSubtitle.visible = true;
    scanningMode.barcodeSubtitle.color = ScanbotColor("#000000");

    // Configure the cancel button of the confirmation sheet.
    scanningMode.cancelButton.text = "Close";
    scanningMode.cancelButton.foreground.color = ScanbotColor("#C8193C");
    scanningMode.cancelButton.background.fillColor = ScanbotColor("#00000000");

    // Configure the submit button of the confirmation sheet.
    scanningMode.submitButton.text = "Submit";
    scanningMode.submitButton.foreground.color = ScanbotColor("#FFFFFF");
    scanningMode.submitButton.background.fillColor = ScanbotColor("#C8193C");

    // Configure other parameters, pertaining to single-scanning mode as needed.

    configuration.useCase = scanningMode;

    // Set an array of accepted barcode types.
    // configuration.recognizerConfiguration.barcodeFormats = [\
    //   scanbotV2.BarcodeFormat.AZTEC,\
    //   scanbotV2.BarcodeFormat.PDF_417,\
    //   scanbotV2.BarcodeFormat.QR_CODE,\
    //   scanbotV2.BarcodeFormat.MICRO_QR_CODE,\
    //   scanbotV2.BarcodeFormat.MICRO_PDF_417,\
    //   scanbotV2.BarcodeFormat.ROYAL_MAIL,\
    ///  .....\
    // ];

    // Configure other parameters as needed.

    var result = await ScanbotBarcodeSdk.startBarcodeScanner(configuration);

    if(result.operationResult == OperationResult.SUCCESS)
    {
      // TODO: present barcode result as needed
      print(result.value?.items.first.type?.name);
    }
  } catch (e) {
    print('Error: $e');
  }
}





```

Now let’s go to the `build` method and add the button on the start screen so it calls our `_startBarcodeScanning` method when clicked:

```hljs typescript
@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: const Text('Barcode Scanner'),
    ),
    body: Center(
      child: ElevatedButton(
        onPressed: _startBarcodeScanning,
        style: ElevatedButton.styleFrom(
          padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 40),
          textStyle: const TextStyle(fontSize: 18),
        ),
        child: const Text("Start single-barcode scanning"),
      ),
    ),
  );
}





```

If you like, you can build and run the app to see if everything is working correctly so far:

```hljs undefined
flutter run





```

![Single-barcode scanning with the Flutter Barcode Scanner package tutorial](https://scanbot.io/wp-content/uploads/2024/10/flutter-barcode-scanner-integration-tutorial-screenshot.png)

In the next step, we’re going to insert both the multi-barcode scanning and the AR overlay modules.

Let’s create two more methods, `_startBarcodeMultiScanning` and `_startAROverlay`:

```hljs dart
void _startBarcodeMultiScanning() async {
  try {
    // Create the default configuration object.
    var configuration = BarcodeScannerConfiguration();

    // Initialize the use case for multiple scanning.
    var scanningMode = MultipleScanningMode();

    // Set the counting mode.
    scanningMode.mode = MultipleBarcodesScanningMode.COUNTING;

    // Set the sheet mode for the barcodes preview.
    scanningMode.sheet.mode = SheetMode.COLLAPSED_SHEET;

    // Set the height for the collapsed sheet.
    scanningMode.sheet.collapsedVisibleHeight = CollapsedVisibleHeight.LARGE;

    // Enable manual count change.
    scanningMode.sheetContent.manualCountChangeEnabled = true;

    // Set the delay before same barcode counting repeat.
    scanningMode.countingRepeatDelay = 1000;

    // Configure the submit button.
    scanningMode.sheetContent.submitButton.text = "Submit";
    scanningMode.sheetContent.submitButton.foreground.color =
        ScanbotColor("#000000");

    // Configure other parameters, pertaining to multiple-scanning mode as needed.

    configuration.useCase = scanningMode;

    // Set an array of accepted barcode types.
    // configuration.recognizerConfiguration.barcodeFormats = [\
    //   BarcodeFormat.AZTEC,\
    //   BarcodeFormat.PDF_417,\
    //   BarcodeFormat.QR_CODE,\
    //   BarcodeFormat.MICRO_QR_CODE,\
    //   BarcodeFormat.MICRO_PDF_417,\
    //   BarcodeFormat.ROYAL_MAIL,\
    ///  .....\
    // ];

    // Configure other parameters as needed.

    var result = await ScanbotBarcodeSdk.startBarcodeScanner(configuration);

    if(result.operationResult == OperationResult.SUCCESS)
    {
      // TODO: present barcode result as needed
      print(result.value?.items.first.type?.name);
    }
  } catch (e) {
    print('Error: $e');
  }
}





```

```hljs dart
void _startAROverlay() async {
    try {
     // Create the default configuration object.
      var configuration = new BarcodeScannerConfiguration();

      // Configure the usecase.
      var usecase = new MultipleScanningMode();
      usecase.mode = MultipleBarcodesScanningMode.UNIQUE;
      usecase.sheet.mode = SheetMode.COLLAPSED_SHEET;
      usecase.sheet.collapsedVisibleHeight = CollapsedVisibleHeight.SMALL;

      // Configure AR Overlay.
      usecase.arOverlay.visible = true;
      usecase.arOverlay.automaticSelectionEnabled = false;

      // Set the configured usecase.
      configuration.useCase = usecase;

      // Set an array of accepted barcode types.
      // configuration.recognizerConfiguration.barcodeFormats = [\
      //   BarcodeFormat.AZTEC,\
      //   BarcodeFormat.PDF_417,\
      //   BarcodeFormat.QR_CODE,\
      //   BarcodeFormat.MICRO_QR_CODE,\
      //   BarcodeFormat.MICRO_PDF_417,\
      //   BarcodeFormat.ROYAL_MAIL,\
      ///  .....\
      // ];

      var result = await ScanbotBarcodeSdk.startBarcodeScanner(configuration);

      if (result.operationResult == OperationResult.SUCCESS) {
        // TODO: present barcode result as needed
        print(result.value?.items.first.type?.name);
      }
    } catch (e) {
      print('Error: $e');
    }
  }





```

And let’s not forget to insert the buttons:

```hljs yaml
@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Barcode Scanner'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [\
            ElevatedButton(\
              onPressed: _startBarcodeScanning,\
              style: ElevatedButton.styleFrom(\
                padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 40),\
                textStyle: const TextStyle(fontSize: 18),\
              ),\
              child: const Text("Start single-barcode scanning"),\
            ),\
            const SizedBox(height: 20),\
            ElevatedButton(\
              onPressed: _startBarcodeMultiScanning,\
              style: ElevatedButton.styleFrom(\
                padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 40),\
                textStyle: const TextStyle(fontSize: 18),\
              ),\
              child: const Text("Start multi-barcode scanning"),\
            ),\
            const SizedBox(height: 20),\
            ElevatedButton(\
              onPressed: _startAROverlay,\
              style: ElevatedButton.styleFrom(\
                padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 40),\
                textStyle: const TextStyle(fontSize: 18),\
              ),\
              child: const Text("Start the AR overlay"),\
            ),\
          ],
        ),
      ),
    );
  }





```

Your final `main.dart` should look something like this:

```hljs dart
import 'package:flutter/material.dart';
import 'package:barcode_scanner/scanbot_barcode_sdk_v2.dart';

const BARCODE_SDK_LICENSE_KEY = "";

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State createState() => _MyHomePageState();
}

class _MyHomePageState extends State {
  @override
  void initState() {
    super.initState();
    _initScanbotSdk();
  }

  Future _initScanbotSdk() async {
    var config = ScanbotSdkConfig(
      licenseKey: BARCODE_SDK_LICENSE_KEY,
      loggingEnabled: true,
    );

    try {
      await ScanbotBarcodeSdk.initScanbotSdk(config);
      print('Scanbot SDK initialized successfully');
    } catch (e) {
      print('Error initializing Scanbot SDK: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Barcode Scanner'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [\
            ElevatedButton(\
              onPressed: _startBarcodeScanning,\
              style: ElevatedButton.styleFrom(\
                padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 40),\
                textStyle: const TextStyle(fontSize: 18),\
              ),\
              child: const Text("Start single-barcode scanning"),\
            ),\
            const SizedBox(height: 20),\
            ElevatedButton(\
              onPressed: _startBarcodeMultiScanning,\
              style: ElevatedButton.styleFrom(\
                padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 40),\
                textStyle: const TextStyle(fontSize: 18),\
              ),\
              child: const Text("Start multi-barcode scanning"),\
            ),\
            const SizedBox(height: 20),\
            ElevatedButton(\
              onPressed: _startAROverlay,\
              style: ElevatedButton.styleFrom(\
                padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 40),\
                textStyle: const TextStyle(fontSize: 18),\
              ),\
              child: const Text("Start the AR overlay"),\
            ),\
          ],
        ),
      ),
    );
  }

  void _startBarcodeScanning() async {
    try {
      // Create the default configuration object.
      var configuration = BarcodeScannerConfiguration();

      // Initialize the use case for single scanning.
      var scanningMode = SingleScanningMode();
      // Enable and configure the confirmation sheet.
      scanningMode.confirmationSheetEnabled = true;
      scanningMode.sheetColor = ScanbotColor("#FFFFFF");

      // Hide/unhide the barcode image.
      scanningMode.barcodeImageVisible = true;

      // Configure the barcode title of the confirmation sheet.
      scanningMode.barcodeTitle.visible = true;
      scanningMode.barcodeTitle.color = ScanbotColor("#000000");

      // Configure the barcode subtitle of the confirmation sheet.
      scanningMode.barcodeSubtitle.visible = true;
      scanningMode.barcodeSubtitle.color = ScanbotColor("#000000");

      // Configure the cancel button of the confirmation sheet.
      scanningMode.cancelButton.text = "Close";
      scanningMode.cancelButton.foreground.color = ScanbotColor("#C8193C");
      scanningMode.cancelButton.background.fillColor = ScanbotColor("#00000000");

      // Configure the submit button of the confirmation sheet.
      scanningMode.submitButton.text = "Submit";
      scanningMode.submitButton.foreground.color = ScanbotColor("#FFFFFF");
      scanningMode.submitButton.background.fillColor = ScanbotColor("#C8193C");

      // Configure other parameters, pertaining to single-scanning mode as needed.

      configuration.useCase = scanningMode;

      // Set an array of accepted barcode types.
      // configuration.recognizerConfiguration.barcodeFormats = [\
      //   scanbotV2.BarcodeFormat.AZTEC,\
      //   scanbotV2.BarcodeFormat.PDF_417,\
      //   scanbotV2.BarcodeFormat.QR_CODE,\
      //   scanbotV2.BarcodeFormat.MICRO_QR_CODE,\
      //   scanbotV2.BarcodeFormat.MICRO_PDF_417,\
      //   scanbotV2.BarcodeFormat.ROYAL_MAIL,\
      ///  .....\
      // ];

      // Configure other parameters as needed.

      var result = await ScanbotBarcodeSdk.startBarcodeScanner(configuration);

      if(result.operationResult == OperationResult.SUCCESS)
      {
        // TODO: present barcode result as needed
        print(result.value?.items.first.type?.name);
      }
    } catch (e) {
      print('Error: $e');
    }
  }

  void _startBarcodeMultiScanning() async {
    try {
      // Create the default configuration object.
      var configuration = BarcodeScannerConfiguration();

      // Initialize the use case for multiple scanning.
      var scanningMode = MultipleScanningMode();

      // Set the counting mode.
      scanningMode.mode = MultipleBarcodesScanningMode.COUNTING;

      // Set the sheet mode for the barcodes preview.
      scanningMode.sheet.mode = SheetMode.COLLAPSED_SHEET;

      // Set the height for the collapsed sheet.
      scanningMode.sheet.collapsedVisibleHeight = CollapsedVisibleHeight.LARGE;

      // Enable manual count change.
      scanningMode.sheetContent.manualCountChangeEnabled = true;

      // Set the delay before same barcode counting repeat.
      scanningMode.countingRepeatDelay = 1000;

      // Configure the submit button.
      scanningMode.sheetContent.submitButton.text = "Submit";
      scanningMode.sheetContent.submitButton.foreground.color =
          ScanbotColor("#000000");

      // Configure other parameters, pertaining to multiple-scanning mode as needed.

      configuration.useCase = scanningMode;

      // Set an array of accepted barcode types.
      // configuration.recognizerConfiguration.barcodeFormats = [\
      //   BarcodeFormat.AZTEC,\
      //   BarcodeFormat.PDF_417,\
      //   BarcodeFormat.QR_CODE,\
      //   BarcodeFormat.MICRO_QR_CODE,\
      //   BarcodeFormat.MICRO_PDF_417,\
      //   BarcodeFormat.ROYAL_MAIL,\
      ///  .....\
      // ];

      // Configure other parameters as needed.

      var result = await ScanbotBarcodeSdk.startBarcodeScanner(configuration);

      if(result.operationResult == OperationResult.SUCCESS)
      {
        // TODO: present barcode result as needed
        print(result.value?.items.first.type?.name);
      }
    } catch (e) {
      print('Error: $e');
    }
  }

  void _startAROverlay() async {
    try {
     // Create the default configuration object.
      var configuration = new BarcodeScannerConfiguration();

      // Configure the usecase.
      var usecase = new MultipleScanningMode();
      usecase.mode = MultipleBarcodesScanningMode.UNIQUE;
      usecase.sheet.mode = SheetMode.COLLAPSED_SHEET;
      usecase.sheet.collapsedVisibleHeight = CollapsedVisibleHeight.SMALL;

      // Configure AR Overlay.
      usecase.arOverlay.visible = true;
      usecase.arOverlay.automaticSelectionEnabled = false;

      // Set the configured usecase.
      configuration.useCase = usecase;

      // Set an array of accepted barcode types.
      // configuration.recognizerConfiguration.barcodeFormats = [\
      //   BarcodeFormat.AZTEC,\
      //   BarcodeFormat.PDF_417,\
      //   BarcodeFormat.QR_CODE,\
      //   BarcodeFormat.MICRO_QR_CODE,\
      //   BarcodeFormat.MICRO_PDF_417,\
      //   BarcodeFormat.ROYAL_MAIL,\
      ///  .....\
      // ];

      var result = await ScanbotBarcodeSdk.startBarcodeScanner(configuration);

      if (result.operationResult == OperationResult.SUCCESS) {
        // TODO: present barcode result as needed
        print(result.value?.items.first.type?.name);
      }
    } catch (e) {
      print('Error: $e');
    }
  }
}





```

Now let’s build and run the app again so we can try out our new scanning modules.

### 5\. Scanning some barcodes!

Now you can go ahead and scan 1D and 2D barcodes – one after the other, many at the same time, and even with an AR overlay that lets you preview their values!

![Scanning multiple barcodes with the AR overlay](https://scanbot.io/wp-content/uploads/2025/02/multi-barcode-scanning-gif.gif)

And if you’re in need of some sample barcodes for testing purposes, we’ve got you covered:

![Various barcodes for testing](https://scanbot.io/wp-content/uploads/2024/06/ios-barcode-scanner-sdk-integration-tutorial-test-barcodes.png)

If this tutorial has piqued your interest in integrating barcode scanning functionalities into your Flutter app, make sure to take a look at our SDK’s other neat features in our [documentation](https://docs.scanbot.io/barcode-scanner-sdk/flutter/barcode-scanner/ready-to-use-ui/).

Should you have questions about this tutorial or ran into any issues, we’re happy to help! Just shoot us an email via [tutorial-support@scanbot.io](mailto:tutorial-support@scanbot.io).

Happy coding!

## Ready to get started?

Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.

[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)

## Related blog posts

[![flutter_barcode_scanner package tutorial](https://scanbot.io/wp-content/uploads/2025/05/android-barcode-scanner-sdk-header-300x229.png)](https://scanbot.io/techblog/integrate-android-barcode-scanner-library/)

### [How to build an Android Barcode Scanner with Kotlin in Android Studio](https://scanbot.io/techblog/integrate-android-barcode-scanner-library/)

In this tutorial, we'll create an Android app for scanning barcodes and QR codes using Kotlin and Android Studio.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg)
Kevin June 26, 202514 mins read

[![flutter_barcode_scanner package tutorial](https://scanbot.io/wp-content/uploads/2024/01/barcode-scanner-sdk-header-new-768x432.png)](https://scanbot.io/techblog/how-to-build-a-cross-platform-barcode-scanner/)

### [How to build a cross-platform barcode scanner app (in React Native, Flutter, .NET MAUI, and Capacitor)](https://scanbot.io/techblog/how-to-build-a-cross-platform-barcode-scanner/)

Learn how to build a mobile barcode scanning app using four popular frameworks.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg)
Kevin February 27, 202532 mins read

[![flutter_barcode_scanner package tutorial](https://scanbot.io/wp-content/uploads/2025/05/ios-barcode-scanner-sdk-header-300x229.png)](https://scanbot.io/techblog/ios-barcode-scanner-sdk-integration-tutorial/)

### [Building an iOS Barcode Scanner in Xcode using Storyboards](https://scanbot.io/techblog/ios-barcode-scanner-sdk-integration-tutorial/)

Learn how to build an iOS app for reading barcodes and QR codes in Xcode using Swift.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg)
Kevin April 21, 20259 mins read

+

## Industry Solutions Overview
https://scanbot.io/solutions/healthcare/2025-07-14T15:02:37+00:00https://scanbot.io/solutions/retail/2025-07-14T15:01:57+00:00https://scanbot.io/solutions/manufacturing-supply-chain/2025-06-16T12:44:51+00:00https://scanbot.io/solutions/finance-banking/2025-04-04T13:49:47+00:00https://scanbot.io/solutions/technology-software/2025-03-10T12:38:49+00:00https://scanbot.io/solutions/insurance/2025-01-29T07:02:40+00:00https://scanbot.io/solutions/freight-logistics/2025-01-29T06:59:21+00:00https://scanbot.io/solutions/hospitality-travel/2024-12-13T16:25:38+00:00

## Scanbot SDK Overview
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

close

[Skip to content](https://scanbot.io/social-links/#main)![Background image for the section with squares and crosses](https://scanbot.io/wp-content/themes/scanbot/public/build/assets/bg-highlighted-squares-lg-B5V6ujTh.png)

[Visit website\\
arrow\_outward](https://scanbot.io/)

# Learn more about Scanbot SDK

[Careerscall\_made](https://scanbot.io/careers/) [Blogcall\_made](https://scanbot.io/blog/)

[Cookie preferences](https://scanbot.io/social-links/#)

+

## HTML5 Barcode Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

close

[Skip to content](https://scanbot.io/techblog/html5-barcode-scanner-tutorial/#main)

In this tutorial, we’ll use the [html5-qrcode](https://github.com/mebjas/html5-qrcode) library to create a web app for scanning 1D and 2D barcodes with just a few lines of HTML and JavaScript code. This library runs in most desktop and mobile browsers and supports scanning barcodes from a live camera stream as well as image files.

![Scanning a QR code with our HTML5 barcode scanner's default configuration](https://scanbot.io/wp-content/uploads/2025/03/html5-barcode-scanner-tutorial-gif-1.gif)

We’ll set up our scanner in three simple steps:

1. Creating the HTML page
2. Using JavaScript to initialize and configure the scanner
3. Linking the JavaScript file to the HTML page

Let’s get started!

## Step 1: Create the HTML page

In your project folder, create an **index.html** file with the usual boilerplate.

```hljs html



    
    
    HTML5 Barcode Scanner








```

## Step 2: Use JavaScript to initialize and configure the scanner

Next, create a **script.js** file in the same folder. To set up our scanner, we can copy and paste a code snippet that the library’s developer has provided in a [gist on GitHub](https://gist.github.com/mebjas/729c5397506a879ec704075c8a5284e8#file-html5-qrcode-demo-js):

```hljs javascript
function docReady(fn) {
    // see if DOM is already available
    if (document.readyState === "complete" || document.readyState === "interactive") {
        // call on next available tick
        setTimeout(fn, 1);
    } else {
        document.addEventListener("DOMContentLoaded", fn);
    }
}

docReady(function() {
    var resultContainer = document.getElementById('qr-reader-results');
    var lastResult, countResults = 0;

    var html5QrcodeScanner = new Html5QrcodeScanner(
        "qr-reader", { fps: 10, qrbox: 250 });

    function onScanSuccess(decodedText, decodedResult) {
        if (decodedText !== lastResult) {
            ++countResults;
            lastResult = decodedText;
            console.log(`Scan result = ${decodedText}`, decodedResult);

            resultContainer.innerHTML += `
[${countResults}] - ${decodedText}
`; // Optional: To close the QR code scannign after the result is found html5QrcodeScanner.clear(); } } // Optional callback for error, can be ignored. function onScanError(qrCodeError) { // This callback would be called in case of qr code scan error or setup error. // You can avoid this callback completely, as it can be very verbose in nature. } html5QrcodeScanner.render(onScanSuccess, onScanError); }); ``` ## Step 3: Link the JavaScript file to the HTML page Back in **index.html**, we need to include our **script.js** as well as the **html5-qrcode** library itself. In this tutorial, we’ll use a CDN, but you can also use `npm install` or similar methods to include the library in your project. We also need to add two `
` elements. One for the QR code scanner and one for displaying the scan result. ```hljs html HTML5 Barcode Scanner
``` Since smartphone cameras are much better suited for scanning barcodes than laptop or desktop webcams, let’s also make sure our scanner looks good on mobile by including some simple CSS in our **index.html**: ```hljs html HTML5 Barcode Scanner
``` To test your project on your phone, you have a few options. One option is to use a service like [ngrok](https://ngrok.com/), which creates a tunnel to one of their SSL-certified domains. Their [Quick Start](https://ngrok.com/docs/getting-started/) guide will help you get up and running quickly. Now let’s test our app by scanning a barcode! ![Scanning a QR code with our HTML5 barcode scanner's default configuration](https://scanbot.io/wp-content/uploads/2025/03/html5-barcode-scanner-tutorial-gif-1.gif) ## Optional: Implement additional features The html5-qrcode library offers some further [customization options](https://github.com/mebjas/html5-qrcode?tab=readme-ov-file#documentation-1). Let’s say you want to build a [PDF417 scanner](https://scanbot.io/techblog/pdf417-barcode-reader-javascript-tutorial/) that also works in poor lighting conditions. By passing a `config` object as an argument to the `Html5QrcodeScanner` constructor in **script.js**, you can … - adapt the aspect ratio of the viewfinder to the more horizontal format of a PDF417 barcode, - restrict scanning to PDF417 barcodes to avoid false positives, - enable a button that turns on the device’s flashlight if it has one. ```hljs csharp // define the config object let config = { fps: 10, qrbox: {width: 300, height: 100}, formatsToSupport: [Html5QrcodeSupportedFormats.PDF_417], showTorchButtonIfSupported: true, }; // existing code // pass the config object to the Html5QrcodeScanner constructor var html5QrcodeScanner = new Html5QrcodeScanner( "qr-reader", config); // existing code ``` ![Scanning a PDF417 barcode with our customized HTML5 barcode scanner](https://scanbot.io/wp-content/uploads/2025/03/html5-barcode-scanner-tutorial-gif-2.gif) ## Disadvantages of using html5-qrcode for scanning barcodes The html5-qrcode library is easy to integrate and offers a preconfigured UI, which makes it a good choice for quick prototyping or personal projects. However, it comes with a few drawbacks: - **Camera issues**: Some users have reported issues with the camera not starting on specific platforms. - **Poor performance**: Compared to alternative libraries, html5-qrcode tends to be less performant and can struggle with certain barcode types. - **Inconsistent results**: Scanning results can vary between devices and environments, leading to unreliable performance. - **Lack of supported symbologies:** Under the hood, html5-qrcode uses ZXing.js (another barcode scanning library that is no longer officially supported), which limits the different barcode types it can scan. - **Difficulties when troubleshooting:** Debugging an app that uses html5-qrcode can be challenging due to insufficient documentation and unclear error messages. For companies that heavily rely on barcode scanning in their business processes, we recommend using an enterprise-grade solution instead. ## Building an HTML5 QR Code & Barcode Scanner with the Scanbot SDK We developed the Scanbot [Web Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/web-barcode-scanner/) to help enterprises overcome the hurdles presented by free barcode scanning software. Our goal was to have a developer-friendly solution available for a wide range of platforms that consistently delivers high-quality results – even in challenging circumstances. Thanks to the Scanbot SDK’s Ready-to-Use UI Components, you can even use an AR overlay to display multiple barcodes’ contents right in the viewfinder. ![Scanning a single barcode with our JavaScript barcode scanner](https://scanbot.io/wp-content/uploads/2024/07/javascript-barcode-scanner-tutorial-new-gif-single-scanning.gif)Scanning a single barcode ![Scanning multiple barcodes with an AR overlay with our JavaScript barcode scanner](https://scanbot.io/wp-content/uploads/2024/07/javascript-barcode-scanner-tutorial-new-gif-multi-scanning-1.gif)Scanning multiple barcodes with the AR overlay To accomplish that, you will need to follow the steps below: 1. Downloading the Web SDK 2. Creating the HTML page and configuring the Web SDK 3. Enabling the AR overlay Let’s dive into more details for each step. ### Step 1: Download the Web SDK First, create a new empty directory for your app and name it, e.g. “barcode-scanner-app”. Then download the Scanbot SDK package directly from [the npm registry](https://registry.npmjs.org/scanbot-web-sdk/-/scanbot-web-sdk-7.0.0.tgz). 💡 You can also [use npm to download and install the package](https://docs.scanbot.io/barcode-scanner-sdk/web/detailed-setup-guide/installation/#npm), but in this tutorial, we’ll do it manually. You can check the latest SDK version in the [changelog](https://docs.scanbot.io/barcode-scanner-sdk/web/changelog/). Unzip the downloaded files into **barcode-scanner-app**. If the unzipped folder is named “package” or similar, rename it to “scanbot-web-sdk” or make sure to later provide the correct directory path in the code. Your folder structure should look like this: ```bash barcode-scanner-app/   |- scanbot-web-sdk/     |- webpack/     |- bundle/     |- @types/     |- index.js     |- ui.js     ... (and some other files) ``` ### Step 2: Create the HTML page and configure the Web SDK Create an **index.html** file in the **barcode-scanner-app** folder. Then add the following code to the file: ```hljs html My Scanner App








```

The code block above:

- Adds the “Start scanning” button.
- Imports and initializes the Scanbot SDK.
- Executes the user interface from the Scanbot SDK when the user clicks the “Start scanning” button.
- If a barcode is identified, it will present the barcode type and its content to the user.

💡 Without a license key, our SDK only runs for 60 seconds per session. This is more than enough for the purposes of our tutorial, but if you like, you can [generate a license key](https://scanbot.io/trial/) on our website.

Feel free to run the app to see if everything is working so far.

![Scanning a single barcode with our JavaScript barcode scanner](https://scanbot.io/wp-content/uploads/2024/07/javascript-barcode-scanner-tutorial-new-gif-single-scanning.gif)

### Step 3: Enable the AR overlay

The Scanbot SDK lets you display an AR overlay on the screen so users can pick a specific barcode when the scanner recognizes multiple barcodes. All you need to do to enable this feature is to add the following code after defining the `config` object:

```hljs cpp
config.useCase.arOverlay.visible = true;
config.useCase.arOverlay.automaticSelectionEnabled = false;




```

Run your app again to see the AR overlay in action.

![Scanning multiple barcodes with an AR overlay with our JavaScript barcode scanner](https://scanbot.io/wp-content/uploads/2024/07/javascript-barcode-scanner-tutorial-new-gif-multi-scanning-1.gif)

### Conclusion

🎉 That’s it! You now have a fully functional barcode scanning web app using the Scanbot SDK’s RTU UI.

Are you interested in how the scanner implementation works in your favorite JavaScript framework?

We’ve got you covered:

- [React.js](https://scanbot.io/techblog/react-barcode-reader-tutorial/)
- [Vue](https://scanbot.io/techblog/vue-js-barcode-scanner-tutorial/)
- [Angular](https://scanbot.io/techblog/angular-barcode-scanner-tutorial/)
- [Svelte](https://scanbot.io/techblog/svelte-barcode-scanner-tutorial/)
- [Next.js](https://scanbot.io/techblog/next-js-barcode-scanner-tutorial/)

Should you have any questions, feel free to reach out to us [on Slack or MS Teams](https://docs.scanbot.io/support/) or send us an email via [sdksupport@scanbot.io](mailto:sdksupport@scanbot.io)

Happy scanning! 🤳

## Ready to get started?

Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.

[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)

## Related blog posts

[![HTML5 Barcode Scanner Tutorial](https://scanbot.io/wp-content/uploads/2025/04/web-document-scanner-sdk-header-new-300x229.png)](https://scanbot.io/techblog/how-to-build-a-javascript-document-scanner-web-app/)

### [How to build a JavaScript Document Scanner web app](https://scanbot.io/techblog/how-to-build-a-javascript-document-scanner-web-app/)

We'll show you how to build a document scanning web app in minutes using only HTML, JavaScript, and our Web Document Scanner SDK.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg)
Kevin February 21, 20257 mins read

[![HTML5 Barcode Scanner Tutorial](https://scanbot.io/wp-content/uploads/2024/11/compose-multiplatform-barcode-scanner-sdk-300x229.png)](https://scanbot.io/techblog/compose-multiplatform-barcode-scanning-ui-tutorial/)

### [How to create a Compose Multiplatform iOS & Android barcode scanning application using the Scanbot SDK](https://scanbot.io/techblog/compose-multiplatform-barcode-scanning-ui-tutorial/)

Compose Multiplatform enables developers to write UI code compatible with both Android and iOS. We’ll walk you through the integration process with the Scanbot Barcode Scanner SDK.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-7-1.svg)
Ildar July 30, 202411 mins read

[![HTML5 Barcode Scanner Tutorial](https://scanbot.io/wp-content/uploads/2025/04/web-barcode-scanner-sdk-header-new-300x229.png)](https://scanbot.io/techblog/progressive-web-app-barcode-scanner-tutorial/)

### [How to build a Progressive Web App (PWA) Barcode Scanner with React and TypeScript](https://scanbot.io/techblog/progressive-web-app-barcode-scanner-tutorial/)

Learn how to build an installable barcode scanning PWA using React and our Web SDK in this step-by-step guide.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg)
Kevin January 7, 202510 mins read

+

## Improve OCR Accuracy
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

close

[Skip to content](https://scanbot.io/blog/improve-ocr-accuracy-with-image-processing/#main)

On their quest to streamline and automate workflows, extracting text from images has become increasingly crucial for businesses. [Optical Character Recognition (OCR)](https://scanbot.io/blog/what-is-ocr-software/) technology has made great strides in recent years – even consumer smartphones can now accurately scan documents.

However, OCR accuracy still hinges on the quality of input images. This is where image pre-processing comes in. This article explores how image pre-processing techniques enhance OCR performance, making text extraction more reliable and efficient.

## What is OCR, and how does it work?

Optical Character Recognition ( **OCR**) technology converts images of text into digital text. The software first separates the text from the background and then recognizes the individual characters. The result is machine-readable text – data that can be copied, searched, and processed automatically.

Generally, an OCR solution works like this:

1. **Image capture**: The physical document is scanned with a camera, such as a smartphone’s. The result is a grayscale or color scan.
2. **Character recognition:** The OCR engine detects areas on the scanned document that contain individual characters, words, or lines. Historically, engines checked the individual characters against a database of characters in a variety of fonts ( _matrix matching_) or of topological features like open areas or line intersections ( _feature extraction_). Modern OCR instead uses neural networks, which provide superior pattern recognition. They can reliably recognize text even under challenging conditions such as low lighting, shadows, skewed text, or badly printed characters.
3. **Output:** Once the text is extracted from the input image, it can be processed. The output format depends on the use case: To create a searchable PDF file, for instance, the recognized text is added as an invisible layer over the input image. Or, if further editing of the document is required, the software can create an editable text file that mimics the formatting and layout of the input image.

## Benefits of OCR

Accurate OCR **improves data integrity** by ensuring that text extracted from [documents](https://scanbot.io/blog/ocr-automation-in-document-processing/) faithfully represents the original content. It eliminates the mistakes that arise from manual data entry, thus reducing the need for manual data correction and validation. This, and the fact that the documents are now searchable, dramatically speeds up document management workflows from data entry to retrieval. The result is significant **time and cost savings**.

The **workflow automation** this enables further boosts **productivity and efficiency**.

To reach its full potential, however, OCR depends on high input image quality. Less-than-ideal images with blurry text, skewing, shadows, and low contrast pose a serious challenge to OCR accuracy.

## Enhance OCR accuracy with image pre-processing

Modern OCR software is more than the OCR engine that performs the actual text recognition. Today’s solutions use image pre-processing techniques to enhance input image quality. The focus is usually on adjusting image angle and enhancing contrast between text and background.

### Deskewing

Scans of paper documents are often skewed at a slight angle, resulting in distorted text characters. Deskewing corrects this and makes it easier for the OCR software to establish text baselines, which are crucial reference lines the OCR engine uses for character alignment and recognition.

### Image filters

Image filters are often applied as a first step to improve quality. As color information is unnecessary for text recognition, images are typically converted to **grayscale**. The different shades of gray can result in cleaner backgrounds and sharper text characters.

Some OCR engines don’t perform well on grayscale or color images and need more contrast to deliver accurate results. **Binarization** converts the image from grayscale to pure black-and-white pixels, creating maximum contrast between text and background.

Apart from enhancing contrast, these filters also reduce **image noise**. By removing dust specks, image compression, and other noise, they improve character recognition.

Though these image-processing techniques can enhance OCR accuracy, they only go so far. Some images are so poor they cannot be salvaged. The solution is to prevent these poor-quality images in the first place – and this is where a feedback system for users comes into play.

## Prevent low-quality scans and use only high-quality input images

Recently, we introduced the Scanbot SDK [Document Quality Analyzer](https://scanbot.io/blog/enhanced-document-quality-analyzer/) (DQA). This feature provides you with built-in quality control right at the source: in your document scanner app. It ensures that documents are captured with optimal quality and are suitable for subsequent OCR processing.

This is how it works:

1. The DQA detects all Latin characters and numbers in the input image.
2. Next, it examines each detected text string and rates it – based on how sharp the characters are – as “excellent”, “good”, “reasonable”, “poor”, or “very poor”.
3. If the average rating of the input image does not match your set threshold, a notification asks the user to retake the scan.

You can set your own acceptance threshold, but we recommend using at least “good” for automatic OCR processing. This prevents low-quality images from entering the OCR process to begin with.

The DQA is part of our [Document Scanner SDK](https://scanbot.io/document-scanner-sdk/), but is also available as a stand-alone, self-hosted module. The SDK’s advanced OCR software turns any smartphone and tablet into a powerful document scanner. Features such as **user guidance**, **automatic capture**, and **automatic cropping** minimize low-quality submissions and ensure accurate results. Its powerful OCR engine also works on full-color images.

Try our [free demo app](https://scanbot.io/demo-apps/) and see for yourself why companies like [HUK Coburg](https://scanbot.io/success-stories/huk-coburg/), one of the ten largest insurance groups in Germany, trust our document-scanning solution. If you would like to learn more about our Document Scanner SDK or the Document Quality Analyzer, please contact us at sdk@scanbot.io.

## Ready to get started?

Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.

[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)

## Related blog posts

[![how to improve ocr accuracy](https://scanbot.io/wp-content/uploads/2024/12/document-scan-quality-1-300x220.jpg)](https://scanbot.io/blog/document-scan-quality-control-system/)

### [How to scan high-quality documents with a Document Scan Quality Control System](https://scanbot.io/blog/document-scan-quality-control-system/)

Finding a fast way to communicate and exchange documents is crucial for any business. Modern software tools enable input quality control.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-2-1.svg)
Johanna December 13, 20247 mins read

[![how to improve ocr accuracy](https://scanbot.io/wp-content/uploads/2024/12/blog_cover_img-300x219.png)](https://scanbot.io/blog/credit-card-scanner-sdk-mobile-apps/)

### [A complete guide: Credit card scanning for mobile apps](https://scanbot.io/blog/credit-card-scanner-sdk-mobile-apps/)

Credit card scanning in mobile apps can make the difference between an abandoned cart and a conversion. Learn all about it in this post.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-2-1.svg)
Maya December 6, 202410 mins read

[![how to improve ocr accuracy](https://scanbot.io/wp-content/uploads/2024/11/proof-of-delivery-scanner-header-300x220.jpg)](https://scanbot.io/blog/smart-devices-as-proof-of-delivery-scanners/)

### [Proof-of-delivery scanners for efficient and transparent deliveries](https://scanbot.io/blog/smart-devices-as-proof-of-delivery-scanners/)

Software-based proof of delivery scanners automate the delivery confirmation process to increase efficiency, reduce costs, and provide customers with transparency.

![](https://scanbot.io/wp-content/uploads/2024/08/author-avatar-10.svg)
Kevin November 26, 20245 mins read

+

## ZXing Android Scanner Tutorial
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)

close

[Skip to content](https://scanbot.io/techblog/zxing-android-embedded-tutorial/?utm_source=chatgpt.com#main)

**ZXing** is an open-source project that provides a barcode image processing library. **ZXing Android Embedded** is a standalone library that facilitates barcode scanning within Android applications.

In this tutorial, we’ll show you how to use [ZXing Android Embedded](https://github.com/journeyapps/zxing-android-embedded) to integrate a barcode scanner into your Android app using [Kotlin](https://kotlinlang.org/) and [Android Studio](https://developer.android.com/studio).

To achieve this, we’ll do the following:

1. Create a new Android project
2. Add the ZXing dependencies
3. Create the app layout
4. Configure the app activity
5. Change the orientation
6. Run the app

![](https://scanbot.io/wp-content/uploads/2024/08/zxing-android-embedded-tutorial-gif-01.gif)

Let’s get started! 🧑🏻‍💻

## Step 1: Create a new Android project

To create a new Android project, launch Android Studio and follow the steps below:

1. On the welcome screen, click on **New Project**. If Android Studio is already open, on the top menu, select **File > New > New Project**.
2. On the new window, select **Phone and Tablet** and choose the **Empty Views Activity**. Click **Next.**
3. Set the following project configurations:
1. **Name**: Choose a name for your app. In this tutorial, we’ll go with **BarcodeScanner**.
2. **Package Name**: This field is automatically populated based on your project name.
3. **Save Location**: Select a directory to save your project.
4. **Language**: Choose the programming language (Java or Kotlin). To follow this guide, select **Kotlin**.
5. **Minimum SDK**: Select the minimum Android version your app will support. Fewer devices will support the newer versions. For this tutorial, choose **API 24(“Nougat”; Android 7.0).**
4. Click **Finish** to create your project.

![](https://scanbot.io/wp-content/uploads/2024/08/zxing-android-embedded-tutorial-screenshot-01.png)

When you create the new project, Android Studio will make the necessary configurations and build the modules. After this is finished, you should see a project with an organization similar to the one below.

![](https://scanbot.io/wp-content/uploads/2024/08/zxing-android-embedded-tutorial-screenshot-02-1.png)

## Step 2: Add the ZXing dependencies

To start, you have to add ZXing to your project dependencies. First, add ZXing to your project’s libraries:

1. Open the **libs.versions.toml** file.
2. Under **\[versions\]** add `scanner = "4.3.0"`.
3. Under **\[libraries\]** add `scanner = { group = "com.journeyapps", name = "zxing-android-embedded", version.ref = "scanner" }`. Here, you are including the library and naming it as **scanner**, which you will use to add to your project.

The **libs.versions.tom** file should look something like this:

```hljs csharp
[versions]
agp = "8.4.0"
kotlin = "1.9.0"
coreKtx = "1.13.1"
junit = "4.13.2"
junitVersion = "1.1.5"
espressoCore = "3.5.1"
appcompat = "1.7.0"
material = "1.12.0"
activity = "1.9.0"
scanner = "4.3.0"
constraintlayout = "2.1.4"

[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" }
androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
scanner = { group = "com.journeyapps", name = "zxing-android-embedded", version.ref = "scanner" }

[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }




```

Afterwards, you have to include the library in your project’s **build.gradle.kts (Modular :app)** using the **scanner** name:

1. Open the **build.gradle.kts (Modular :app)** file.
2. Add `implementation(libs.scanner)` within **dependencies.**

The **build.gradle.kts (Modular :app)** file should look like this:

```hljs csharp
plugins {
   alias(libs.plugins.android.application)
   alias(libs.plugins.jetbrains.kotlin.android)
}

android {
   namespace = "com.example.barcodescanner"
   compileSdk = 34

   defaultConfig {
       applicationId = "com.example.barcodescanner"
       minSdk = 24
       targetSdk = 34
       versionCode = 1
       versionName = "1.0"

       testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
   }

   buildTypes {
       release {
           isMinifyEnabled = false
           proguardFiles(
               getDefaultProguardFile("proguard-android-optimize.txt"),
               "proguard-rules.pro"
           )
       }
   }
   compileOptions {
       sourceCompatibility = JavaVersion.VERSION_1_8
       targetCompatibility = JavaVersion.VERSION_1_8
   }
   kotlinOptions {
       jvmTarget = "1.8"
   }
}

dependencies {

   implementation(libs.androidx.core.ktx)
   implementation(libs.androidx.appcompat)
   implementation(libs.material)
   implementation(libs.androidx.activity)
   implementation(libs.androidx.constraintlayout)
   implementation(libs.scanner)
   testImplementation(libs.junit)
   androidTestImplementation(libs.androidx.junit)
   androidTestImplementation(libs.androidx.espresso.core)
}




```

## Step 3: Create the app layout

Before using the functionalities provided by the ZXing library, you need to add the visual elements to your app to enable the user to interact with it. For this tutorial, the app is composed of two elements:

- A Button the user will use to start the scanning process.
- A TextView to display the bar code after finishing the scanning process.

To add the above components to your app, open the **activity\_main.xml** file, which you will find under **app > res > layout**. Replace the existing content with the following code.

💡 If you open the **activity\_main.xml** file and no code appears on your screen, click the **Split** button at the top right of Android Studio.

```hljs html