PHPackages                             dynamsoft/javascript-barcode - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Image &amp; Media](/categories/media)
4. /
5. dynamsoft/javascript-barcode

ActiveLibrary[Image &amp; Media](/categories/media)

dynamsoft/javascript-barcode
============================

Dynamsoft Barcode Reader JS is a recognition SDK which enables you to embed barcode reading functionality in your web, desktop, and mobile applications. With a few lines of JavaScript code, you can develop a robust application to scan a linear barcode, QR Code, DaraMatrix, PDF417, and Aztec Code.

v8.4(4y ago)18553104[8 issues](https://github.com/Dynamsoft/barcode-reader-javascript/issues)[1 PRs](https://github.com/Dynamsoft/barcode-reader-javascript/pulls)proprietaryCI passing

Since Oct 21Pushed 3w ago11 watchersCompare

[ Source](https://github.com/Dynamsoft/barcode-reader-javascript)[ Packagist](https://packagist.org/packages/dynamsoft/javascript-barcode)[ Docs](https://www.dynamsoft.com/Products/barcode-recognition-javascript.aspx)[ RSS](/packages/dynamsoft-javascript-barcode/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (10)DependenciesVersions (14)Used By (0)

Barcode Reader for Your Website - Foundational API Guide
========================================================

[](#barcode-reader-for-your-website---foundational-api-guide)

[Dynamsoft Barcode Reader JavaScript Edition](https://www.dynamsoft.com/barcode-reader/sdk-javascript/) (DBR-JS) is equipped with industry-leading algorithms for exceptional speed, accuracy and read rates in barcode reading. Using its well-designed API, you can turn your web page into a barcode scanner with just a few lines of code. Once the DBR-JS SDK gets integrated into your web page, your users can access a camera via the browser and read barcodes directly from its video input.

In this guide, you will learn step by step on how to integrate the DBR-JS SDK into your website.

Table of Contents

- [Barcode Reader for Your Website - Foundational API Guide](#barcode-reader-for-your-website---foundational-api-guide)
    - [Hello World - Simplest Implementation](#hello-world---simplest-implementation)
        - [Understand the code](#understand-the-code)
            - [About the code](#about-the-code)
        - [Run the example](#run-the-example)
    - [Preparing the SDK](#preparing-the-sdk)
        - [Step 1: Include the SDK](#step-1-include-the-sdk)
        - [Step 2: Prepare the SDK](#step-2-prepare-the-sdk)
            - [1. Specify the license](#1-specify-the-license)
            - [2. \[Optional\] Specify the location of the "engine" files](#2-optional-specify-the-location-of-the-engine-files)
    - [Using the SDK](#using-the-sdk)
        - [Step 1: Preload the module](#step-1-preload-the-module)
        - [Step 2: Create a CaptureVisionRouter object](#step-2-create-a-capturevisionrouter-object)
        - [Step 3: Connect an image source](#step-3-connect-an-image-source)
        - [Step 4: Register a result receiver](#step-4-register-a-result-receiver)
        - [Step 5: Start process video frames](#step-5-start-process-video-frames)
    - [Customizing the process](#customizing-the-process)
        - [1. Adjust the preset template settings](#1-adjust-the-preset-template-settings)
            - [1.1. Change barcode settings](#11-change-barcode-settings)
            - [1.2. Retrieve the original image](#12-retrieve-the-original-image)
            - [1.3. Change reading frequency to save power](#13-change-reading-frequency-to-save-power)
            - [1.4. Specify a scan region](#14-specify-a-scan-region)
        - [2. Edit the preset templates directly](#2-edit-the-preset-templates-directly)
        - [3. \[Important\] Filter the results](#3-important-filter-the-results)
            - [Method 1: Verify results across multiple frames](#method-1-verify-results-across-multiple-frames)
            - [Method 2: Eliminate redundant results detected within a short time frame](#method-2-eliminate-redundant-results-detected-within-a-short-time-frame)
        - [4. Add feedback](#4-add-feedback)
    - [Customizing the UI](#customizing-the-ui)
    - [Documentation](#documentation)
        - [API Reference](#api-reference)
        - [How to Upgrade](#how-to-upgrade)
        - [Release Notes](#release-notes)
    - [Next Steps](#next-steps)

Hello World - Simplest Implementation
-------------------------------------

[](#hello-world---simplest-implementation)

Let's start with the "Hello World" example of the DBR-JS SDK which demonstrates how to use the minimum code to enable a web page to read barcodes from a live video stream.

**Basic Requirements**

- Internet connection
- A supported browser
- Camera access

> Please refer to [system requirements](https://www.dynamsoft.com/faq/barcode-reader/web/capabilities/system-requirement.html) for more details.

### Understand the code

[](#understand-the-code)

The complete code of the "Hello World" example is shown below

```
>

  Dynamsoft.License.LicenseManager.initLicense("DLS2eyJvcmdhbml6YXRpb25JRCI6IjIwMDAwMSJ9");
  Dynamsoft.Core.CoreModule.loadWasm();
  (async () => {
    let cvRouter = await Dynamsoft.CVR.CaptureVisionRouter.createInstance();

    let cameraView = await Dynamsoft.DCE.CameraView.createInstance();
    let cameraEnhancer = await Dynamsoft.DCE.CameraEnhancer.createInstance(cameraView);
    document.querySelector("#camera-view-container").append(cameraView.getUIElement());
    cvRouter.setInput(cameraEnhancer);

    const resultsContainer = document.querySelector("#results");
    await cvRouter.addResultReceiver({ onDecodedBarcodesReceived: (result) => {
      if (result.barcodeResultItems?.length) {
        resultsContainer.textContent = '';
        for (let item of result.barcodeResultItems) {
          resultsContainer.textContent += `${item.formatString}: ${item.text}\n\n`;
        }
      }
    }});

    let filter = new Dynamsoft.Utility.MultiFrameResultCrossFilter();
    filter.enableResultCrossVerification("barcode", true);
    filter.enableResultDeduplication("barcode", true);
    await cvRouter.addResultFilter(filter);

    await cameraEnhancer.open();
    await cvRouter.startCapturing("ReadSingleBarcode");
  })();

```

 [ ![Code in Github](https://camo.githubusercontent.com/90acd5ba6c6c0ec39271ebbe48af895142316c2f143f57b891b38f90447504bc/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f6e706d2f73696d706c652d69636f6e7340332e302e312f69636f6e732f6769746875622e737667) ](https://github.com/Dynamsoft/barcode-reader-javascript-samples/blob/v11.4.20/hello-world.html "Code in Github") [ ![Run via JSFiddle](https://camo.githubusercontent.com/aba5dc27e4b3658e46cb0e99b3befd9a0af74067489e299c04ecc4c2f4c9ff62/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f6e706d2f73696d706c652d69636f6e7340332e302e312f69636f6e732f6a73666964646c652e737667) ](https://jsfiddle.net/DynamsoftTeam/csm2f9wb/ "Run via JSFiddle") [ ![Run in Dynamsoft](https://camo.githubusercontent.com/25fea508faad9ac875712157e5da6b11f6fd737ffb559e9b7044c39a74d7bac1/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f6e706d2f40666f7274617765736f6d652f666f6e74617765736f6d652d6672656540362e302e302f737667732f736f6c69642f636972636c652d706c61792e737667) ](https://demo.dynamsoft.com/Samples/DBR/JS/hello-world.html?ver=11.4.20&utm_source=github "Run in Dynamsoft")

---

#### About the code

[](#about-the-code)

- `Dynamsoft.License.LicenseManager.initLicense()`: This method initializes the license for using the SDK in the application. Note that the string "**DLS2eyJvcmdhbml6YXRpb25JRCI6IjIwMDAwMSJ9**" used in this example points to an online license that requires a network connection to work. Read more on [Specify the license](#1-specify-the-license).
- `Dynamsoft.Core.CoreModule.loadWasm()`: This is an optional code. Used to load wasm resources in advance, reducing latency between video playing and barcode decoding.
- `Dynamsoft.CVR.CaptureVisionRouter.createInstance()`: This method creates a `CaptureVisionRouter` object `cvRouter` which controls the entire process in three steps:

    - **Retrieve Images from the Image Source**
        - `cvRouter` connects to the image source through the [ImageSourceAdapter](https://www.dynamsoft.com/capture-vision/docs/core/architecture/input.html#image-source-adapter?lang=js) interface with the method `setInput()`. ```
            cvRouter.setInput(cameraEnhancer);
            ```

        > The image source in our case is a [CameraEnhancer](https://www.dynamsoft.com/camera-enhancer/docs/web/programming/javascript/user-guide/index.html) object created with `Dynamsoft.DCE.CameraEnhancer.createInstance(cameraView)`
    - **Coordinate Image-Processing Tasks**
        - The coordination happens behind the scenes. `cvRouter` starts the process by specifying a preset template "ReadSingleBarcode" in the method `startCapturing()`. ```
            cvRouter.startCapturing("ReadSingleBarcode");
            ```
    - **Dispatch Results to Listening Objects**
        - The processing results are returned through the [CapturedResultReceiver](https://www.dynamsoft.com/capture-vision/docs/core/architecture/output.html#captured-result-receiver?lang=js) interface. The `CapturedResultReceiver` object is registered to `cvRouter` via the method `addResultReceiver()`. For more information, please check out [Register a result receiver](#step-4-register-a-result-receiver). ```
            cvRouter.addResultReceiver({/*The-CapturedResultReceiver-Object"*/});
            ```
        - Also note that reading from video is extremely fast and there could be many duplicate results. We can use a [filter](#3-important-filter-the-results) with result deduplication enabled to filter out the duplicate results. The object is registered to `cvRouter` via the method `addResultFilter()`. ```
            cvRouter.addResultFilter(filter);
            ```

> Read more on [Capture Vision Router](https://www.dynamsoft.com/capture-vision/docs/core/architecture/#capture-vision-router).

### Run the example

[](#run-the-example)

You can run the example deployed to [the Dynamsoft Demo Server](https://demo.dynamsoft.com/Samples/DBR/JS/hello-world.html?ver=11.4.20&utm_source=github) or test it with [JSFiddle code editor](https://jsfiddle.net/DynamsoftTeam/csm2f9wb/).

You will be asked to allow access to your camera, after which the video will be displayed on the page. After that, you can point the camera at a barcode to read it.

When a barcode is decoded, you will see the result text show up under the video and the barcode location will be highlighted in the video feed.

Alternatively, you can test locally by copying and pasting the code shown above into a local file (e.g. "hello-world.html") and opening it in your browser.

> *Secure Contexts*:
>
> If you open the web page as `http://` , our SDK may not work correctly because the [MediaDevices: getUserMedia()](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia) and other methods only work in [secure contexts](https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts) (HTTPS, `localhost`, `127.0.0.1`, `file://`), in some or all supporting browsers.
>
> Regarding configuring https on your server, these guides for [nginx](https://nginx.org/en/docs/http/configuring_https_servers.html) / [IIS](https://aboutssl.org/how-to-create-a-self-signed-certificate-in-iis/) / [tomcat](https://dzone.com/articles/setting-ssl-tomcat-5-minutes) / [nodejs](https://nodejs.org/docs/v0.4.1/api/tls.html) might help.
>
> If the test doesn't go as expected, you can [contact us](https://www.dynamsoft.com/company/contact/?ver=11.4.20&utm_source=github&product=dbr&package=js).

Preparing the SDK
-----------------

[](#preparing-the-sdk)

### Step 1: Include the SDK

[](#step-1-include-the-sdk)

Use a public CDN

The simplest way to include the SDK is to use either the [jsDelivr](https://jsdelivr.com/) or [UNPKG](https://unpkg.com/) CDN. The "hello world" example above uses **jsDelivr**.

- jsDelivr

    ```

    ```
- UNPKG

    ```

    ```

- In frameworks like React, Vue and Angular, you may want to add the package as a dependency.

    ```
    npm i dynamsoft-barcode-reader-bundle@11.4.2001 -E
    # or
    yarn add dynamsoft-barcode-reader-bundle@11.4.2001 -E
    ```

    NOTE that in frameworks, you need to [specify the location of the engine files](#2-optional-specify-the-location-of-the-engine-files).

Host the SDK yourself

Besides using the public CDN, you can also download the SDK and host its files on your own server or a commercial CDN before including it in your application.

- From the website

    [Download Dynamsoft Barcode Reader JavaScript Package](https://www.dynamsoft.com/barcode-reader/downloads/?ver=11.4.20&utm_source=github&product=dbr&package=js)

    The resources are located at path `dynamsoft/distributables/@`.
- From npm

    ```
    npm i dynamsoft-barcode-reader-bundle@11.4.2001 -E
    ```

    The resources are located at the path `node_modules/`, without `@`. You must copy "dynamsoft-xxx" packages elsewhere and add `@`. The `` can be obtained from `package.json` of each package. Another thing to do is to [specify the engineResourcePaths](#2-optional-specify-the-location-of-the-engine-files) so that the SDK can correctly locate the resources.

    > Since "node\_modules" is reserved for Node.js dependencies, and in our case the package is used only as static resources, we recommend either renaming the "node\_modules" folder or moving the "dynamsoft-" packages to a dedicated folder for static resources in your project to facilitate self-hosting.

You can typically include SDK like this:

```

```

*Note*:

- Certain legacy web application servers may lack support for the `application/wasm` mimetype for .wasm files. To address this, you have two options:

    1. Upgrade your web application server to one that supports the `application/wasm` mimetype.
    2. Manually define the mimetype on your server. You can refer to the guides for [apache](https://developer.mozilla.org/en-US/docs/Learn/Server-side/Apache_Configuration_htaccess#media_types_and_character_encodings) / [IIS](https://docs.microsoft.com/en-us/iis/configuration/system.webserver/staticcontent/mimemap) / [nginx](https://www.nginx.com/resources/wiki/start/topics/examples/full/#mime-types).
- To work properly, the SDK requires a few engine files, which are relatively large and may take quite a few seconds to download. We recommend that you set a longer cache time for these engine files, to maximize the performance of your web application.

    ```
    Cache-Control: max-age=31536000

    ```

    Reference: [Cache-Control](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control).

### Step 2: Prepare the SDK

[](#step-2-prepare-the-sdk)

Before using the SDK, you need to configure a few things.

#### 1. Specify the license

[](#1-specify-the-license)

To enable the SDK's functionality, you must provide a valid license. Utilize the API function initLicense to set your license key.

```
Dynamsoft.License.LicenseManager.initLicense("DLS2eyJvcmdhbml6YXRpb25JRCI6IjIwMDAwMSJ9");
```

As previously stated, the key "DLS2eyJvcmdhbml6YXRpb25JRCI6IjIwMDAwMSJ9" serves as a test license valid for 24 hours, applicable to any newly authorized browser. To test the SDK further, you can request a 30-day free trial license via the [Request a Trial License](https://www.dynamsoft.com/customer/license/trialLicense?ver=11.4.20&utm_source=github&product=dbr&package=js) link.

> Upon registering a Dynamsoft account and obtaining the SDK package from the official website, Dynamsoft will automatically create a 30-day free trial license and embed the corresponding license key into all the provided SDK samples.

#### 2. \[Optional\] Specify the location of the "engine" files

[](#2-optional-specify-the-location-of-the-engine-files)

This step is generally necessary when utilizing frameworks such as Angular, React, Vue, or when managing the hosting of resource files yourself.

The purpose is to tell the SDK where to find the engine files (\*.worker.js, \*.wasm.js and \*.wasm, etc.).

```
// in framework
import { CoreModule } from "dynamsoft-barcode-reader-bundle";
CoreModule.engineResourcePaths.rootDirectory = "https://cdn.jsdelivr.net/npm/";
```

```
// in pure js
Dynamsoft.Core.CoreModule.engineResourcePaths.rootDirectory = "https://cdn.jsdelivr.net/npm/";
```

These code uses the jsDelivr CDN as an example, feel free to change it to your own location.

Using the SDK
-------------

[](#using-the-sdk)

### Step 1: Preload the module

[](#step-1-preload-the-module)

The image processing logic is encapsulated within .wasm library files, and these files may require some time for downloading. To enhance the speed, we advise utilizing the following method to preload the libraries.

```
// Preload the .wasm files
Dynamsoft.Core.CoreModule.loadWasm();
```

### Step 2: Create a CaptureVisionRouter object

[](#step-2-create-a-capturevisionrouter-object)

To use the SDK, we first create a `CaptureVisionRouter` object.

```
Dynamsoft.License.LicenseManager.initLicense("DLS2eyJvcmdhbml6YXRpb25JRCI6IjIwMDAwMSJ9");

let cvRouter = null;
try {
    cvRouter = await Dynamsoft.CVR.CaptureVisionRouter.createInstance();
} catch (ex) {
    console.error(ex);
}
```

*Tip*:

When creating a `CaptureVisionRouter` object within a function which may be called more than once, it's best to use a "helper" variable to avoid double creation such as `pCvRouter` in the following code:

```
Dynamsoft.License.LicenseManager.initLicense("DLS2eyJvcmdhbml6YXRpb25JRCI6IjIwMDAwMSJ9");

let pCvRouter = null; // The helper variable which is a promise of cvRouter
let cvRouter = null;

document.getElementById('btn-scan').addEventListener('click', async () => {
    try {
        cvRouter = await (pCvRouter = pCvRouter || Dynamsoft.CVR.CaptureVisionRouter.createInstance());
    } catch (ex) {
        console.error(ex);
    }
});
```

### Step 3: Connect an image source

[](#step-3-connect-an-image-source)

The `CaptureVisionRouter` object, denoted as `cvRouter`, is responsible for handling images provided by an image source. In our scenario, we aim to detect barcodes directly from a live video stream. To facilitate this, we initialize a `CameraEnhancer` object, identified as `cameraEnhancer`, which is specifically designed to capture image frames from the video feed and subsequently forward them to `cvRouter`.

To enable video streaming on the webpage, we create a `CameraView` object referred to as `cameraView`, which is then passed to `cameraEnhancer`, and its content is displayed on the webpage.

```

```

```
let cameraView = await Dynamsoft.DCE.CameraView.createInstance();
let cameraEnhancer = await Dynamsoft.DCE.CameraEnhancer.createInstance(cameraView);
document.querySelector("#camera-view-container").append(cameraView.getUIElement());
cvRouter.setInput(cameraEnhancer);
```

### Step 4: Register a result receiver

[](#step-4-register-a-result-receiver)

Once the image processing is complete, the results are sent to all the registered `CapturedResultReceiver` objects. Each `CapturedResultReceiver` object may encompass one or multiple callback functions associated with various result types. This time we use `onDecodedBarcodesReceived`:

```
const resultsContainer = document.querySelector("#results");
const resultReceiver = new Dynamsoft.CVR.CapturedResultReceiver();
resultReceiver.onDecodedBarcodesReceived  = (result) => {
  if (result.barcodeResultItems?.length) {
    resultsContainer.textContent = '';
    for (let item of result.barcodeResultItems) {
      // In this example, the barcode results are displayed on the page below the video.
      resultsContainer.textContent += `${item.formatString}: ${item.text}\n\n`;
    }
  }
};
await cvRouter.addResultReceiver(resultReceiver);
```

You can also write code like this. It is the same.

```
const resultsContainer = document.querySelector("#results");
await cvRouter.addResultReceiver({ onDecodedBarcodesReceived: (result) => {
  if (result.barcodeResultItems?.length) {
    resultsContainer.textContent = '';
    for (let item of result.barcodeResultItems) {
      // In this example, the barcode results are displayed on the page below the video.
      resultsContainer.textContent += `${item.formatString}: ${item.text}\n\n`;
    }
  }
}});
```

Check out [CapturedResultReceiver](https://www.dynamsoft.com/capture-vision/docs/web/programming/javascript/api-reference/capture-vision-router/captured-result-receiver.html) for more information.

### Step 5: Start process video frames

[](#step-5-start-process-video-frames)

With the setup now complete, we can proceed to process the images in two straightforward steps:

1. Initiate the image source to commence image acquisition. In our scenario, we invoke the `open()` method on `cameraEnhancer` to initiate video streaming and simultaneously initiate the collection of images. These collected images will be dispatched to `cvRouter` as per its request.
2. Define a preset template to commence image processing. In our case, we utilize the "ReadSingleBarcode" template, specifically tailored for processing images containing a single barcode.

```
await cameraEnhancer.open();
await cvRouter.startCapturing("ReadSingleBarcode");
```

*Note*:

- `cvRouter` is engineered to consistently request images from the image source.
- Various preset templates are at your disposal for barcode reading:

Template NameFunction Description**ReadBarcodes\_Default**Scans multiple barcodes by default setting.**ReadSingleBarcode**Quickly scans a single barcode.**ReadBarcodes\_SpeedFirst**Prioritizes speed in scanning multiple barcodes.**ReadBarcodes\_ReadRateFirst**Maximizes the number of barcodes read.**ReadBarcodes\_Balance**Balances speed and quantity in reading multiple barcodes.**ReadDenseBarcodes**Specialized in reading barcodes with high information density.**ReadDistantBarcodes**Capable of reading barcodes from extended distances.Read more on the [preset CaptureVisionTemplates](https://www.dynamsoft.com/capture-vision/docs/web/programming/javascript/api-reference/capture-vision-router/preset-templates.html).

Customizing the process
-----------------------

[](#customizing-the-process)

### 1. Adjust the preset template settings

[](#1-adjust-the-preset-template-settings)

When making adjustments to some basic tasks, we often only need to modify [SimplifiedCaptureVisionSettings](https://www.dynamsoft.com/capture-vision/docs/web/programming/javascript/api-reference/capture-vision-router/interfaces/simplified-capture-vision-settings.html).

#### 1.1. Change barcode settings

[](#11-change-barcode-settings)

The preset templates can be updated to meet different requirements. For example, the following code limits the barcode format to QR code.

```
let settings = await cvRouter.getSimplifiedSettings("ReadSingleBarcode");
settings.barcodeSettings.barcodeFormatIds = Dynamsoft.DBR.EnumBarcodeFormat.BF_QR_CODE;
await cvRouter.updateSettings("ReadSingleBarcode", settings);
await cvRouter.startCapturing("ReadSingleBarcode");
```

For a list of adjustable barcode settings, check out [SimplifiedBarcodeReaderSettings](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/api-reference/interfaces/simplified-barcode-reader-settings.html) and [EnumBarcodeFormat](https://www.dynamsoft.com/capture-vision/docs/core/enums/barcode-reader/barcode-format.html?lang=js&product=dbr).

#### 1.2. Retrieve the original image

[](#12-retrieve-the-original-image)

Additionally, we have the option to modify the template to retrieve the original image containing the barcode.

```
let settings = await cvRouter.getSimplifiedSettings("ReadSingleBarcode");
settings.outputOriginalImage = true;
await cvRouter.updateSettings("ReadSingleBarcode", settings);
await cvRouter.startCapturing("ReadSingleBarcode");
```

Limit the barcode format to QR code, and retrieve the original image containing the barcode, at the same time.

```
let settings = await cvRouter.getSimplifiedSettings("ReadSingleBarcode");
settings.outputOriginalImage = true;
settings.barcodeSettings.barcodeFormatIds = Dynamsoft.DBR.EnumBarcodeFormat.BF_QR_CODE;
await cvRouter.updateSettings("ReadSingleBarcode", settings);
await cvRouter.startCapturing("ReadSingleBarcode");
```

Please be aware that it is necessary to update the `CapturedResultReceiver` object to obtain the original image. For instance:

```
const EnumCRIT = Dynamsoft.Core.EnumCapturedResultItemType; // Enum for captured result item types.
// Create a result receiver to handle the results.
await cvRouter.addResultReceiver({
  // This function is called when any capture result is received.
  onCapturedResultReceived: (result) => {
    //Check for barcode results
    let barcodeResultItems = result.items.filter((item) => item.type === EnumCRIT.CRIT_BARCODE);
    if (barcodeResultItems.length > 0) {
      let image = result.items.filter((item) => item.type === EnumCRIT.CRIT_ORIGINAL_IMAGE)[0]?.imageData; // Retrieve the original image.
      if (image) document.body.appendChild(image.toCanvas()); // Append the image to DOM.
      for (let item of barcodeResultItems) {
        // Print each barcode result to the console.
        console.log(`Barcode: ${item.text}, Format: ${item.formatString}`);
      }
    }
  },
});
```

#### 1.3. Change reading frequency to save power

[](#13-change-reading-frequency-to-save-power)

The SDK is initially configured to process images sequentially without any breaks. Although this setup maximizes performance, it can lead to elevated power consumption, potentially causing the device to overheat. In many cases, it's possible to reduce the reading speed while still satisfying business requirements. The following code snippet illustrates how to adjust the SDK to process an image every 500 milliseconds:

> Please bear in mind that in the following code, if an image's processing time is shorter than 500 milliseconds, the SDK will wait for the full 500 milliseconds before proceeding to process the next image. Conversely, if an image's processing time exceeds 500 milliseconds, the subsequent image will be processed immediately upon completion.

```
let settings = await cvRouter.getSimplifiedSettings("ReadSingleBarcode");
settings.minImageCaptureInterval = 500;
await cvRouter.updateSettings("ReadSingleBarcode", settings);
await cvRouter.startCapturing("ReadSingleBarcode");
```

#### 1.4. Specify a scan region

[](#14-specify-a-scan-region)

We can specify a scan region to allow the SDK to process only part of the image, improving processing speed. The code snippet below demonstrates how to do this using the `cameraEnhancer` image source.

```
cameraEnhancer = await Dynamsoft.DCE.CameraEnhancer.createInstance(cameraView);
// In this example, we set the scan region to cover the central 25% of the image.
cameraEnhancer.setScanRegion({
  x: 25,
  y: 25,
  width: 50,
  height: 50,
  isMeasuredInPercentage: true,
});
```

*Note*:

1. By configuring the region at the image source, images are cropped before processing, removing the need to adjust any further processing settings.
2. `cameraEnhancer` enhances interactivity by overlaying a mask on the video, clearly marking the scanning region.

*See Also*:

[CameraEnhancer::setScanRegion](https://www.dynamsoft.com/camera-enhancer/docs/web/programming/javascript/api-reference/acquisition.html#setscanregion)

### 2. Edit the preset templates directly

[](#2-edit-the-preset-templates-directly)

The preset templates have many more settings that can be customized to suit your use case best. If you [download the SDK from Dynamsoft website](https://www.dynamsoft.com/barcode-reader/downloads/1000003-confirmation/), you can find the templates under

- "/dynamsoft-barcode-reader-js-11.4.2001/dist/templates/"

Upon completing the template editing, you can invoke the `initSettings` method and provide it with the template path as an argument.

```
await cvRouter.initSettings("PATH-TO-THE-FILE"); // E.g. "https://your-website/ReadSingleBarcode.json")
await cvRouter.startCapturing("ReadSingleBarcode"); // Make sure the name matches one of the CaptureVisionTemplates in the template JSON file.
```

### 3. \[Important\] Filter the results

[](#3-important-filter-the-results)

When processing video frames, the same barcode is often detected multiple times. To improve the user experience, we can use the [MultiFrameResultCrossFilter](https://www.dynamsoft.com/capture-vision/docs/web/programming/javascript/api-reference/utility/multi-frame-result-cross-filter.html) object. This object provides two methods for handling duplicate detections, which can be used independently or together, depending on what best suits your application needs:

#### Method 1: Verify results across multiple frames

[](#method-1-verify-results-across-multiple-frames)

```
let filter = new Dynamsoft.Utility.MultiFrameResultCrossFilter();
filter.enableResultCrossVerification("barcode", true);
await cvRouter.addResultFilter(filter);
```

*Note*:

- `enableResultCrossVerification` was designed to cross-validate the outcomes across various frames in a video streaming scenario, enhancing the reliability of the final results. This validation is particularly crucial for barcodes with limited error correction capabilities, such as 1D codes.

#### Method 2: Eliminate redundant results detected within a short time frame

[](#method-2-eliminate-redundant-results-detected-within-a-short-time-frame)

```
let filter = new Dynamsoft.Utility.MultiFrameResultCrossFilter();
filter.enableResultDeduplication("barcode", true);
await cvRouter.addResultFilter(filter);
```

*Note*:

- `enableResultDeduplication` was designed to prevent high usage in video streaming scenarios, addressing the repetitive processing of the same code within a short period of time.

Initially, the filter is set to forget a result 3 seconds after it is first received. During this time frame, if an identical result appears, it is ignored.

> It's important to know that in version 9.x or earlier, the occurrence of an identical result would reset the timer, thus reinitiating the 3-second count at that point. However, in version 10.2.10 and later, an identical result no longer resets the timer but is instead disregarded, and the duration count continues uninterrupted.

Under certain circumstances, this duration can be extended with the method `setDuplicateForgetTime()`.

```
let filter = new Dynamsoft.Utility.MultiFrameResultCrossFilter();
filter.setDuplicateForgetTime("barcode", 5000); // Extend the duration to 5 seconds.
await cvRouter.addResultFilter(filter);
```

You can also enable both options at the same time:

```
let filter = new Dynamsoft.Utility.MultiFrameResultCrossFilter();
filter.enableResultCrossVerification("barcode", true);
filter.enableResultDeduplication("barcode", true);
filter.setDuplicateForgetTime("barcode", 5000);
await cvRouter.addResultFilter(filter);
```

### 4. Add feedback

[](#4-add-feedback)

When a barcode is detected within the video stream, its position is immediately displayed within the video. Furthermore, utilizing the "Dynamsoft Camera Enhancer" SDK, we can introduce feedback mechanisms, such as emitting a "beep" sound or triggering a "vibration".

The following code snippet adds a "beep" sound for when a barcode is found:

```
const resultReceiver = new Dynamsoft.CVR.CapturedResultReceiver();
resultReceiver.onDecodedBarcodesReceived = (result) => {
  if (result.barcodeResultItems.length > 0) {
    Dynamsoft.DCE.Feedback.beep();
  }
};
await cvRouter.addResultReceiver(resultReceiver);
```

Customizing the UI
------------------

[](#customizing-the-ui)

```
// Create a CameraView instance with default settings
let cameraView = await Dynamsoft.DCE.CameraView.createInstance();
// Create a CameraView instance with a specified XML file path, typically a local or remote URL
let cameraView1 = await Dynamsoft.DCE.CameraView.createInstance('@engineResourcePath/dce.ui.v5.xml');
// Create a CameraView instance within a specified DOM element
let cameraView2 = await Dynamsoft.DCE.CameraView.createInstance(document.getElementById('my-ui'));
// Create a CameraView instance using a custom UI file path
let cameraView3 = await Dynamsoft.DCE.CameraView.createInstance('url/to/my/ui.xml');

// Get the UI element associated with the cameraView instance
let uiElement = cameraView.getUIElement();
// Remove the camera selection dropdown from the CameraView's UI element
uiElement.querySelector('.dce-sel-camera').remove();
// Remove the resolution selection dropdown from the CameraView's UI element
uiElement.querySelector('.dce-sel-resolution').remove();
```

The UI is part of the auxiliary SDK "Dynamsoft Camera Enhancer", read more on how to [customize the UI](https://www.dynamsoft.com/barcode-reader/docs/core/programming/features/ui-customization-js.html?lang=js).

Documentation
-------------

[](#documentation)

### API Reference

[](#api-reference)

You can check out the detailed documentation about the APIs of the SDK at .

### How to Upgrade

[](#how-to-upgrade)

If you want to upgrade the SDK from an old version to a newer one, please see [how to upgrade](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/migrate-from-v10/index.html).

### Release Notes

[](#release-notes)

Learn about what are included in each release at .

Next Steps
----------

[](#next-steps)

Now that you have got the SDK integrated, you can choose to move forward in the following directions

1. Learn how to [Use in Framework](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/user-guide/use-in-framework.html)
2. Check out the [Official Samples and Demo](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/samples-demos/index.html)
3. Learn about the [APIs of the SDK](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/api-reference/index.html)

###  Health Score

47

—

FairBetter than 94% of packages

Maintenance62

Regular maintenance activity

Popularity29

Limited adoption so far

Community23

Small or concentrated contributor base

Maturity65

Established project with proven stability

 Bus Factor2

2 contributors hold 50%+ of commits

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~66 days

Recently: every ~37 days

Total

11

Last Release

1741d ago

Major Versions

v7.6 → v8.22021-03-17

### Community

Maintainers

![](https://www.gravatar.com/avatar/88ef35172840fc2b10dbdabdfdfd5fe383e340fd1fd87299f879119357dcb93d?d=identicon)[yushulx](/maintainers/yushulx)

---

Top Contributors

[![DMGithubPublisher](https://avatars.githubusercontent.com/u/65145280?v=4)](https://github.com/DMGithubPublisher "DMGithubPublisher (44 commits)")[![Keillion](https://avatars.githubusercontent.com/u/15797718?v=4)](https://github.com/Keillion "Keillion (32 commits)")[![Shen-wb](https://avatars.githubusercontent.com/u/62587615?v=4)](https://github.com/Shen-wb "Shen-wb (18 commits)")[![Cube-J](https://avatars.githubusercontent.com/u/41986394?v=4)](https://github.com/Cube-J "Cube-J (15 commits)")[![Tom-Dynamsoft](https://avatars.githubusercontent.com/u/12044551?v=4)](https://github.com/Tom-Dynamsoft "Tom-Dynamsoft (2 commits)")

---

Tags

1d-barcodeaztec-codebarcodebarcode-readerhtml5-barcodejavascriptjavascript-barcodejavascript-qrcodelinear-barcodenpm-packagepdf417qrcodesdkwebweb-barcodewebassemblyqrcodesdkpdf417barcodewebassembly1D Barcodeweb barcodeJavaScript barcodeHTML5 barcodeAztec CodeLinear barcode

### Embed Badge

![Health badge](/badges/dynamsoft-javascript-barcode/health.svg)

```
[![Health](https://phpackages.com/badges/dynamsoft-javascript-barcode/health.svg)](https://phpackages.com/packages/dynamsoft-javascript-barcode)
```

###  Alternatives

[milon/barcode

Barcode generator like Qr Code, PDF417, C39, C39+, C39E, C39E+, C93, S25, S25+, I25, I25+, C128, C128A, C128B, C128C, 2-Digits UPC-Based Extention, 5-Digits UPC-Based Extention, EAN 8, EAN 13, UPC-A, UPC-E, MSI (Variation of Plessey code)

1.5k13.3M39](/packages/milon-barcode)[tecnickcom/tc-lib-barcode

PHP library to generate linear and bidimensional barcodes

2957.1M28](/packages/tecnickcom-tc-lib-barcode)[jucksearm/php-barcode

Barcode Generation Package inspired by Nicola Asuni.

12362.6k1](/packages/jucksearm-php-barcode)[bitgrave/barcode-generator

simple barcode generator base classes supporting 2d- and datamatrix barcodes

1313.7k](/packages/bitgrave-barcode-generator)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
