Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
scripts/dev.sh text eol=lf
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ logs/
temp/*
!temp/keep.txt
.idea
.dev/
# *.py
16 changes: 14 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ Rules:
- **Link it from `index.md`.** Every subdirectory (`barcode-reader/general/`, `barcode-reader/web/configuration/`, `mrz-scanner/general/`, etc.) has an `index.md` that lists every article in that section. A new article with no entry there is orphaned — it exists but no one can navigate to it. Add a bullet there when you add the file, and remove the bullet if you remove the file.
- **Internal links use `.html`, not `.md`.** Link to sibling/other articles as `some-page.html` (Jekyll serves the built output), and to a parent-directory archive as `../archive/some-page.html`, etc. A link ending in `.md` will not resolve on the live site.
- **Don't add "back to index" links inside articles.** They were deliberately removed repo-wide; the sidebar/index already provides navigation.
- **Images** go through a site variable per product/edition — `{{site.dbr_web_assets}}`, `{{site.dbr_mobile_assets}}`, `{{site.dbr_server_assets}}` (defined in `_config.yml`), pointing at that edition's `assets/` directory. Before referencing an image, confirm the file actually exists at that path — a stale or placeholder filename (e.g. a literal `undefined.png`) will silently 404.
- **Images** go through a site variable — `{{site.assets}}` for shared assets or `{{site.dbr_web_assets}}`, `{{site.dbr_mobile_assets}}`, `{{site.dbr_server_assets}}` for edition assets (defined in `_config.yml`). Before referencing an image, confirm the file actually exists at that path — a stale or placeholder filename (e.g. a literal `undefined.png`) will silently 404.
- **Write the answer as a direct statement, not a raw Q&A fragment.** Don't leave phrasing like "Yes — ..." or "This can be expanded ..." floating with no visible question or antecedent above it — the H1 is the question; the body should read as its answer, not as a leftover snippet.
- **Don't duplicate a section under a second heading.** If a "what's new"/changelog-style heading and a "how to" heading right below it cover the same ground, merge them.

Expand All @@ -35,7 +35,13 @@ Rules:
- `barcode-reader/general/` — cross-edition Barcode Reader FAQs
- `barcode-reader/mobile/`, `barcode-reader/server/`, `barcode-reader/web/` — edition-specific Barcode Reader FAQs, each split into topic subdirectories (`configuration/`, `capabilities/`, `debug/`, `scan-setting/`, etc.)
- `mrz-scanner/general/` — MRZ Scanner FAQs
- `license/` — licensing FAQs shared across products
- `barcode-reader/license/`, `mrz-scanner/license/` — published licensing FAQs for each product; shared answer bodies live in `_includes/shared/license/`

## Shared FAQ answers

Published FAQs are regular Markdown pages under each product path. For an answer reused across products, keep the frontmatter and question H1 in each page and put only the answer body in `_includes/shared/`; include it with `{% include shared/<file>.md %}`. Edit the include for shared answer changes, and keep each product section’s `index.md` linked to its own page. Do not use filesystem symlinks. The two product license sections share `_includes/shared/license/` for their answers; there is no bare `license/` section.

The shared offline-registration answer references six screenshots through `{{site.assets}}license/`. Their only source files are in `assets/license/`; do not add copies in either product license directory.

## Archived content (`*/archive/*`)

Expand All @@ -47,6 +53,12 @@ Directories named `archive` under `barcode-reader/{mobile,server,web}/` hold his

If you find yourself wanting to *add* content to an archive directory, it almost certainly belongs in the live directory instead.

## Testing the local site

The Jekyll layout comes from `Docs-Template-Repo`, not this repository. Install Git and Ruby/Bundler plus `rsync` (Bash) or `robocopy` (PowerShell). From the repo root, run `./scripts/dev.sh` or `./scripts/dev.ps1` to prepare `.dev/DocHome` and serve at `http://localhost:5555/faq/`. The scripts exclude archived FAQ directories and local worktrees from that merged workspace.

For preparation without a server, use `./scripts/dev.sh --no-serve` or `./scripts/dev.ps1 -NoServe`; rerun the script without that flag to start the server. Use `--no-template-update` / `-NoTemplateUpdate` to reuse the cloned template. Rerun after editing FAQ source because the merged workspace is a copy, then check the changed page in the local site. `.dev/` is generated and Git-ignored; do not edit it as source.

## Before finishing

Run the link checker from the repo root and fix anything it flags in files you touched:
Expand Down
19 changes: 18 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,27 @@ See [`AGENTS.md`](AGENTS.md) for the FAQ article structure, frontmatter, linking

The site is built with Jekyll using a shared theme/layout maintained in [dynamsoft-docs/Docs-Template-Repo](https://github.com/dynamsoft-docs/Docs-Template-Repo), which this repo doesn't include locally. Pushes to `main` and `preview` trigger the CI workflows in `.github/workflows/main.yml`, which build and sync to production and the preview/testing environment respectively.

For a local preview, install Git, Ruby/Bundler, and rsync (Bash) or robocopy (PowerShell), then run from the repository root:

```bash
./scripts/dev.sh
```

Or on Windows:

```powershell
./scripts/dev.ps1
```

The scripts clone the shared template's preview branch into `.dev/`, merge it with this FAQ source, install gems, and serve Jekyll at `http://localhost:5555/faq/`. The generated `.dev/` workspace is ignored by Git and omits archived FAQ content and local worktrees. Use `--no-serve` / `-NoServe` to prepare without serving, then rerun without that flag to serve; `--no-template-update` / `-NoTemplateUpdate` reuses the cloned template. Changes to FAQ files require rerunning the script to refresh the merged workspace.

Shared answers live in `_includes/shared/`. Product FAQ pages retain their own frontmatter and question H1, then include the answer body. The license FAQs are regular pages under `barcode-reader/license/` and `mrz-scanner/license/`; they share `_includes/shared/license/` and preserve their product URLs. Edit shared answer text in the include, not in each page.
The license screenshots are stored once in `assets/license/` and referenced through `site.assets` from the shared answer. Do not copy them into the product license directories.

## Checking links

`check_links.py` crawls the repo's Markdown files and reports broken links. Run it before submitting a change that touches links:

```bash
python check_links.py
```
```
9 changes: 0 additions & 9 deletions _config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,15 +55,6 @@ defaults:
path: "Hide_Tree_Page.html"
values:
sitemap: false
- scope:
# license/ is shared content, duplicated at build time under
# /faq/barcode-reader/license/ and /faq/mrz-scanner/license/. Those
# product-scoped URLs are the ones linked from the site and correctly
# highlighted in the sidebar; this bare path has no product context
# for the sidebar to highlight, so keep it out of the sitemap.
path: "license"
values:
sitemap: false
- scope:
path: "barcode-reader/mobile/capabilities"
values:
Expand Down
100 changes: 100 additions & 0 deletions _includes/shared/camera-preview-renders-incorrectly-ios.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
## Applicable Products

This article applies to:

- Dynamsoft Barcode Reader (DBR) JavaScript SDK (`dynamsoft-barcode-reader-bundle`) 11.6.3000 and earlier
- Dynamsoft Capture Vision (DCV) JavaScript SDK (`dynamsoft-capture-vision-bundle`) 3.6.3000 and earlier

## Summary

On iOS 27, switching cameras or changing resolution can make the live camera preview render incorrectly. The exact behavior depends on the SDK version:

| Version | Behavior |
|---|---|
| DBR 11.4 – 11.6.3000 (DCV 3.4 – 3.6.3000) | The preview renders distorted — squeezed or stretched instead of filling its container. Intermittent: the same switch can render correctly on one attempt and distorted on the next. |
| DBR 11.2 and earlier (DCV 3.2 and earlier) | The preview isn't distorted, but it no longer fits its container — shown at the wrong zoom or size and not extending to the borders. |

It's reproducible on Safari, Chrome, Edge, and Firefox — all iOS browsers share WebKit's camera implementation, so we suspect the issue originates there rather than in any Dynamsoft SDK. It does not occur on iOS 26.

> [!NOTE]
> Reported to Apple, but not confirmed as an Apple bug and still open as of iOS 27 RC. Details here may change if Apple ships a fix.

<div style="display: flex; flex-wrap: wrap; gap: 16px; margin: 16px 0;">
<figure style="flex: 1 1 260px; max-width: 320px; margin: 0; text-align: center;">
<img src="{{site.assets}}img/ios-27-switching-camera-expected.jpg" alt="Camera video rendering correctly on iOS" style="width: 100%; height: auto;">
<figcaption><strong>Expected</strong></figcaption>
</figure>
<figure style="flex: 1 1 260px; max-width: 320px; margin: 0; text-align: center;">
<img src="{{site.assets}}img/ios-27-switching-camera-distorted.jpg" alt="Camera video rendering distorted after switching cameras on iOS 27" style="width: 100%; height: auto;">
<figcaption><strong>Distorted after switching cameras</strong></figcaption>
</figure>
</div>

## Resolution

### Recommended: upgrade

Upgrade to `dynamsoft-barcode-reader-bundle` **11.6.3200+** or `dynamsoft-capture-vision-bundle` **3.6.3200+**, which include a built-in workaround.

### If you can't upgrade yet

Both workarounds below are temporary and version-specific — neither replaces upgrading.

**DBR 11.4 – 11.6.3000 (DCV 3.4 – 3.6.3000)**

The distortion requires `object-fit: fill` on the video element plus an ancestor using `display: flex` with `flex: 0 0 auto`, so overriding `object-fit` with `cover` on the `<video>` element that [Dynamsoft Camera Enhancer](https://www.dynamsoft.com/camera-enhancer/docs/web/) renders avoids it:

```css
.dm-camera-core-container video {
object-fit: cover !important;
}
```

`!important` is needed because the SDK sets `object-fit` inline. The JavaScript equivalent, via [`cameraView.getVideoElement()`](https://www.dynamsoft.com/camera-enhancer/docs/web/programming/javascript/api-reference/cameraview.html?product=dbr&lang=javascript#getvideoelement):

```javascript
let videoElement = cameraView.getVideoElement();
videoElement?.style.setProperty('object-fit', 'cover', 'important');
```

> [!WARNING]
> `cover` crops rather than stretches to preserve the aspect ratio — confirm that trade-off works for your UI.

**DBR 11.2 and earlier (DCV 3.2 and earlier)**

Reset the video element's dimensions whenever the camera or resolution changes, registering the handlers before `cameraEnhancer.open()`:

```javascript
const resetVideoWH = () => {
const videoEl = cameraEnhancer.getVideoEl();
videoEl.style.width = "";
videoEl.style.height = "";

requestAnimationFrame(() => {
requestAnimationFrame(() => {
videoEl.style.width = "100%";
videoEl.style.height = "100%";
});
});
};
cameraEnhancer.on("cameraChange", resetVideoWH);
cameraEnhancer.on("resolutionChange", resetVideoWH);

cameraView.createDrawingLayer(2); // layer ID depends on the product — see below

// Normal startup routine, shown here only to indicate placement
await cameraEnhancer.open();
await cvRouter.startCapturing();
```

The `createDrawingLayer` call is part of the workaround. Pass the layer ID for your product:

| Product | Layer ID |
|---|---|
| Dynamsoft Barcode Reader (DBR) | 2 |
| Mobile Document Scanner (MDS — DDN layer) | 1 |
| MRZ Scanner (DLR layer) | 3 |

## Need more help?

[Contact the Dynamsoft Support team](https://www.dynamsoft.com/contact/).
Original file line number Diff line number Diff line change
@@ -1,13 +1,3 @@
---
layout: default-layout
title: How to get a free trial?
keywords: Dynamsoft Barcode Reader, FAQ, DBR Introduction, General, free trial
description: How to get a free trial?
needAutoGenerateSidebar: false
---

# How to get a free trial?

To get a free trial of the SDK, please download it from [our website](https://www.dynamsoft.com/barcode-reader/downloads/).

The main way to get the trial license is via the [Request a Trial License](https://www.dynamsoft.com/customer/license/trialLicense?product=dbr&utm_source=docs){:target="\_blank"} link through which you can extend your trial license once your original expires. The trial can be extended twice, for 15 days each, and a total of 30 days.
Original file line number Diff line number Diff line change
@@ -1,13 +1,3 @@
---
layout: default-layout
title: Error [xxx] No license found
keywords: Dynamsoft Barcode Reader, FAQ, JavaScript, tech basic, barcode format, no license found
description: When moving from a trial license to a production license, you may encounter the error `[xxx] No license found` if your enabled barcode formats don't match the formats supported by your license?
needAutoGenerateSidebar: false
---

# Troubleshooting - Error: [xxx] No license found

## Problem
When moving from a trial license to a production license, you may encounter the error `[xxx] No license found` if your enabled barcode formats don't match the formats supported by your license. This occurs because the SDK validates enabled formats against your license's capabilities.

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,3 @@
---
layout: default-layout
title: How to properly use concurrent instance license?
keywords: Dynamsoft Barcode Reader, FAQ, Pricing/Licensing, General, ensure no overuse
description: How to properly use concurrent instance license?
needAutoGenerateSidebar: false
---

# How to properly use concurrent instance license?

The standard way to use concurrent instance license is:

* Call method `SetMaxConcurrentInstanceCount` to set the license count you purchased.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,3 @@
---
layout: default-layout
title: How to expand the quota of a runtime license?
keywords: Dynamsoft Barcode Reader, FAQ, Pricing/Licensing, General, expand quota
description: How to expand the quota of a runtime license?
needAutoGenerateSidebar: false
---

# How to expand the quota of a runtime license?

The quota of a runtime license can be expanded before the license expires. This can be done in a couple of ways.

- By accessing the license page in the [customer portal](https://www.dynamsoft.com/customer/license/fullLicense), under the `Manage License` operation, one of the options include `Add Quota`. This leads the user to a checkout page confirming the extra quantity that they want to add (by default they will be adding the same quantity that they originally bought, which can be multiplied by the `Quantity` number. After confirming the customer details and payment info, the order will be processed for the quota expansion.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,2 @@
---
layout: default-layout
title: How is hardware bound to a license?
keywords: Dynamsoft Barcode Reader, FAQ, Pricing/Licensing, General, information gathered, hardware bind, new license consumption
description: How is hardware bound to a license?
needAutoGenerateSidebar: false
---

# How is hardware bound to a license?

- When devices are registered, they get a UUID that is generated based on some hardware and OS info. The exact breakdown of what is collected when using the mobile edition or server/desktop edition is mentioned [here](https://www.dynamsoft.com/license-server/docs/about/terms.html#generate-a-uuid).
- Should the user change the OS (upgrade/downgrade), then the same device will take up a new license since the UUID that is generated for the device after the change will be different.
1 change: 1 addition & 0 deletions _includes/shared/license/how-license-tracking-works.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Each option is explained in the [About section](https://www.dynamsoft.com/license-server/docs/about/licensetypes.html?ver=latest) of the license tracking documentation. Please read through each option to have a good understanding of what each entails. If you have any more questions, please contact the [Dynamsoft support team](https://www.dynamsoft.com/company/contact/).
11 changes: 0 additions & 11 deletions license/index.md → _includes/shared/license/index.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,3 @@
---
layout: default-layout
title: "Dynamsoft Barcode Reader License FAQ \u2013 Key Questions"
keywords: faq, license, dbr, dynamsoft, barcode reader, configuration
description: "Find answers about Dynamsoft Barcode Reader licensing, activation, usage limits, and plans so teams can deploy Dynamsoft capture workflows confidently for modern web."
needAutoGenerateSidebar: false
noTitleIndex: true
---

# License FAQ

Please use the links below to find answers to common questions and configuration guidance.

- [How to ensure no overuse of license?](ensure-no-overuse.html)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,3 @@
---
layout: default-layout
title: When is a new license spot taken when using a per-device licensing model?
keywords: Dynamsoft Barcode Reader, FAQ, Sales & Licensing, per-device, new license
description: When is a new license spot taken when using a per-device licensing model?
needAutoGenerateSidebar: false
---

# When is a new license spot taken when using a per-device licensing model?

A new license spot is required in any of these three conditions -

- if you use another browser.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,13 @@
---
layout: default-layout
title: How to use offline registration license type?
keywords: Dynamsoft Barcode Reader, FAQ, offline, license type
description: How to use offline registration license type?
needAutoGenerateSidebar: false
---

# How to use offline registration license type?

You can follow the steps below to manually register the device and get the license key for each device:

1. Log in [Customer Portal](https://www.dynamsoft.com/customer/license/fullLicense) -> Click the Activate button to activate the license
![activate]({{site.dbr_server_assets}}activate.jpg)
![activate]({{site.assets}}license/activate.jpg)

2. Select the 3rd option "No License Server. Register Offline Device(s) Manually" and click Activate.
![offline-activate]({{site.dbr_server_assets}}offline-activate.jpg)
![offline-activate]({{site.assets}}license/offline-activate.jpg)

3. Click the Add Device button then it will pop up a dialog. Download the tool from the pop up.
![uuid-tool]({{site.dbr_server_assets}}uuid-tool.jpg)
![uuid-tool]({{site.assets}}license/uuid-tool.jpg)

4. Unzip the file and run the GenerateUUID tool on the device to be registered and get the UUID.<br>

Expand All @@ -26,7 +16,7 @@ For Windows:<br>
-Change the working directory to the one where GenerateUUID.exe is<br>
-Run the command `GenerateUUID.exe`<br>
The returned string, e.g. 8ECCA3B6-66F9-4fd6-B6B6-308C874140C6, is the machine ID.<br>
![uuid]({{site.dbr_server_assets}}uuid.jpg)<br>
![uuid]({{site.assets}}license/uuid.jpg)<br>

For Linux:<br>
-Open Terminal<br>
Expand Down Expand Up @@ -54,10 +44,10 @@ SoftbindUUID:230e089a-7dc3-4caa-9c77-f7cc6d567f9b<br>
> ```

5. Input the generated UUID and device name and click Submit.
![submit-uuid]({{site.dbr_server_assets}}submit-uuid.jpg)
![submit-uuid]({{site.assets}}license/submit-uuid.jpg)

6. Then an authorization string will be generated. This string is the license for this device. Copy the license and set it in the code
![cp-license]({{site.dbr_server_assets}}cp-license.jpg)
![cp-license]({{site.assets}}license/cp-license.jpg)

Code snippet in JavaScript:

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,3 @@
---
layout: default-layout
title: Can the SDK work without internet connection?
keywords: Dynamsoft Barcode Reader, FAQ, Pricing/Licensing, General, internet
description: Can the SDK work without internet connection?
needAutoGenerateSidebar: false
---

# Can the SDK work without internet connection?

The SDK can indeed be used without an internet connection. In order to use the SDK without an internet connection, it is best to use the Self Hosting option when it comes to setting up the Dynamsoft License Server once you obtain a full license. If the Dynamsoft Hosted option is chosen, an internet connection will be needed for the per barcode scan and various per device license types in order to connect to the license server and validate the license.

- By using the Self Hosting option, the users will mainly just need an intranet connection in order to use the SDK since the server is hosted on the internal server(s) of the organization.
Expand Down
Loading
Loading