\ No newline at end of file
diff --git a/_includes/sidelist-programming/programming-ios.html b/_includes/sidelist-programming/programming-ios.html
index aa044c8..2ba97b8 100644
--- a/_includes/sidelist-programming/programming-ios.html
+++ b/_includes/sidelist-programming/programming-ios.html
@@ -11,194 +11,198 @@
Release Notes
diff --git a/assets/js/ddnMobileVersionSearch.json b/assets/js/ddnMobileVersionSearch.json
index b9811c1..e1837b8 100644
--- a/assets/js/ddnMobileVersionSearch.json
+++ b/assets/js/ddnMobileVersionSearch.json
@@ -1,5 +1,105 @@
[
{
+ "version": "2.2.10",
+ "matchList": {
+ "android":{
+ "dcvRepoMobile": [
+ {
+ "path": "/programming/android/api-reference/utility",
+ "version": "1.2.10"
+ }, {
+ "path": "/programming/android/api-reference/license",
+ "version": "3.2.10"
+ }, {
+ "path": "/programming/android/api-reference/capture-vision-router",
+ "version": "2.2.10"
+ }, {
+ "path": "/programming/android/api-reference/core",
+ "version": "3.2.10"
+ }, {
+ "path": "/programming/android/api-reference/image-processing",
+ "version": "2.2.10"
+ }
+ ],
+ "dcvRepoCore": [
+ {
+ "path": "/enums/capture-vision-router",
+ "version": "2.2.10"
+ }, {
+ "path": "/enums/core",
+ "version": "3.2.10"
+ },{
+ "path": "/parameters/reference/capture-vision-template",
+ "version": "2.2.10"
+ },{
+ "path": "/parameters/reference/target-roi-def",
+ "version": "2.2.10"
+ },{
+ "path": "/parameters/reference/document-normalizer-task-settings",
+ "version": "2.2.10"
+ },{
+ "path": "/parameters/reference/image-parameter",
+ "version": "2.2.10"
+ },{
+ "path": "/parameters/reference/image-source-options",
+ "version": "3.2.10"
+ },{
+ "path": "/parameters/reference/global-parameter",
+ "version": "2.2.10"
+ }
+ ],
+ "dce": "4.2.0"
+ },
+ "ios":{
+ "dcvRepoMobile": [
+ {
+ "path": "/programming/objectivec-swift/api-reference/utility",
+ "version": "1.2.10"
+ }, {
+ "path": "/programming/objectivec-swift/api-reference/license",
+ "version": "3.2.10"
+ }, {
+ "path": "/programming/objectivec-swift/api-reference/capture-vision-router",
+ "version": "2.2.10"
+ }, {
+ "path": "/programming/objectivec-swift/api-reference/core",
+ "version": "3.2.10"
+ }, {
+ "path": "/programming/objectivec-swift/api-reference/image-processing",
+ "version": "2.2.10"
+ }
+ ],
+ "dcvRepoCore": [
+ {
+ "path": "/enums/capture-vision-router",
+ "version": "2.2.10"
+ }, {
+ "path": "/enums/core",
+ "version": "3.2.10"
+ },{
+ "path": "/parameters/reference/capture-vision-template",
+ "version": "2.2.10"
+ },{
+ "path": "/parameters/reference/target-roi-def",
+ "version": "2.2.10"
+ },{
+ "path": "/parameters/reference/document-normalizer-task-settings",
+ "version": "2.2.10"
+ },{
+ "path": "/parameters/reference/image-parameter",
+ "version": "2.2.10"
+ },{
+ "path": "/parameters/reference/image-source-options",
+ "version": "3.2.10"
+ },{
+ "path": "/parameters/reference/global-parameter",
+ "version": "2.2.10"
+ }
+ ],
+ "dce": "4.2.0"
+ }
+ }
+ },{
"version": "2.0.20",
"matchList": {
"android":{
diff --git a/programming-old/ios/index-v1.0.30.md b/programming-old/ios/index-v1.0.30.md
index 076b72e..b4b760f 100644
--- a/programming-old/ios/index-v1.0.30.md
+++ b/programming-old/ios/index-v1.0.30.md
@@ -5,7 +5,7 @@ description: This is the main page of Dynamsoft Document Normalizer for iOS SDK.
keywords: ios
needAutoGenerateSidebar: false
breadcrumbText: iOS
-permalink: /programming/ios/index.html
+permalink: /programming/ios/index-v1.0.30.html
---
# Documentation - iOS
diff --git a/programming-old/ios/samples/helloworld-v1.0.30.md b/programming-old/ios/samples/helloworld-v1.0.30.md
index 3efe7ec..59a1c28 100644
--- a/programming-old/ios/samples/helloworld-v1.0.30.md
+++ b/programming-old/ios/samples/helloworld-v1.0.30.md
@@ -5,7 +5,7 @@ description: This is the HelloWorld Sample page of Dynamsoft Document Normalizer
keywords: ios, samples, HelloWorld
needAutoGenerateSidebar: false
breadcrumbText: HelloWorld
-permalink: /programming/ios/samples/helloworld.html
+permalink: /programming/ios/samples/helloworld-v1.0.30.html
---
# HelloWorld Sample
diff --git a/programming-old/ios/samples/index-v1.0.30.md b/programming-old/ios/samples/index-v1.0.30.md
index 58cd084..4d5615a 100644
--- a/programming-old/ios/samples/index-v1.0.30.md
+++ b/programming-old/ios/samples/index-v1.0.30.md
@@ -5,7 +5,7 @@ description: This is the Demos & Samples page of Dynamsoft Document Normalizer f
keywords: iOS, samples
needAutoGenerateSidebar: true
breadcrumbText: Samples
-permalink: /programming/ios/samples/index.html
+permalink: /programming/ios/samples/index-v1.0.30.html
---
# Demo and Samples
diff --git a/programming-old/ios/user-guide-v1.0.30.md b/programming-old/ios/user-guide-v1.0.30.md
index 52d886f..2c4d0c3 100644
--- a/programming-old/ios/user-guide-v1.0.30.md
+++ b/programming-old/ios/user-guide-v1.0.30.md
@@ -6,7 +6,7 @@ keywords: user guide, iOS
needAutoGenerateSidebar: true
needGenerateH4Content: true
noTitleIndex: true
-permalink: /programming/ios/user-guide-v1.0.0.html
+permalink: /programming/ios/user-guide-v1.0.30.html
---
# Getting Started with iOS
diff --git a/programming/android/api-reference/candidate-quad-edges-unit-v2.0.20.md b/programming/android/api-reference/candidate-quad-edges-unit-v2.0.20.md
new file mode 100644
index 0000000..78c432a
--- /dev/null
+++ b/programming/android/api-reference/candidate-quad-edges-unit-v2.0.20.md
@@ -0,0 +1,41 @@
+---
+layout: default-layout
+title: CandidateQuadEdgesUnit - Dynamsoft Document Normalizer Android SDK API Reference
+description: The class CandidateQuadEdgesUnit represents an intermediate result unit whose type is candidate quad edges.
+keywords: candidate quad edges, intermediate result unit, java, kotlin
+needGenerateH3Content: true
+needAutoGenerateSidebar: true
+noTitleIndex: true
+---
+
+# CandidateQuadEdgesUnit
+
+The `CandidateQuadEdgesUnit` class represents an intermediate result unit whose type is candidate quad edges.
+
+## Definition
+
+*Namespace:* com.dynamsoft.ddn.intermediate_results
+
+*Assembly:* DynamsoftDocumentNormalizer.aar
+
+```java
+class CandidateQuadEdgesUnit extends IntermediateResultUnit
+```
+
+## Methods Summary
+
+| Methods | Description |
+| ------- | ----------- |
+| [`getCandidateQuadEdges`](#getcandidatequadedges) | Get an array of edges. It includes all edges that candidate quadrilaterals assembling. |
+
+### getCandidateQuadEdges
+
+Get an array of edges. It includes all edges that candidate quadrilaterals assembling.
+
+```java
+Edge[] getCandidateQuadEdges();
+```
+
+**Return Value**
+
+Get an array of [`Edge`]({{site.dcv_android_api}}core/basic-structures/edge.html).
diff --git a/programming/android/api-reference/candidate-quad-edges-unit.md b/programming/android/api-reference/candidate-quad-edges-unit.md
index 78c432a..1f24171 100644
--- a/programming/android/api-reference/candidate-quad-edges-unit.md
+++ b/programming/android/api-reference/candidate-quad-edges-unit.md
@@ -27,6 +27,12 @@ class CandidateQuadEdgesUnit extends IntermediateResultUnit
| Methods | Description |
| ------- | ----------- |
| [`getCandidateQuadEdges`](#getcandidatequadedges) | Get an array of edges. It includes all edges that candidate quadrilaterals assembling. |
+| [`getCount`](#getcount) | Get the number of edges. |
+| [`getCandidateQuadEdge`](#getcandidatequadedge) | Get an edge. |
+| [`removeAllCandidateQuadEdges`](#removeallcandidatequadedges) | Remove all edges. |
+| [`removeCandidateQuadEdge`](#removecandidatequadedge) | Remove an edge. |
+| [`addCandidateQuadEdge`](#addcandidatequadedge) | Add an edge. |
+| [`setCandidateQuadEdge`](#setcandidatequadedge) | Set an edge. |
### getCandidateQuadEdges
@@ -39,3 +45,89 @@ Edge[] getCandidateQuadEdges();
**Return Value**
Get an array of [`Edge`]({{site.dcv_android_api}}core/basic-structures/edge.html).
+
+### getCount
+
+Get the number of edges.
+
+```java
+int getCount();
+```
+
+**Return Value**
+
+The number of edges.
+
+### getCandidateQuadEdge
+
+Get the `Edge` object at the specified index.
+
+```java
+Edge getCandidateQuadEdge(int index);
+```
+
+**Parameters**
+
+`[in] index`: The index of the edge.
+
+**Return Value**
+
+The `Edge` object as the specified edge.
+
+### removeAllCandidateQuadEdges
+
+Remove all edges.
+
+```java
+void removeAllCandidateQuadEdges();
+```
+
+### removeCandidateQuadEdge
+
+Remove the `Edge` object at the specified index.
+
+```java
+int removeCandidateQuadEdge(int index);
+```
+
+**Parameters**
+
+`[in] index`: The index of the edge.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. Otherwise, returns 0.
+
+### addCandidateQuadEdge
+
+Add a new `Edge` object to the unit.
+
+```java
+int addCandidateQuadEdge(Edge edge, Matrix matrixToOriginalImage);
+```
+
+**Parameter**
+
+`[in] edge`: The edge to be added.
+
+`[in] matrixToOriginalImage`: The matrix to the original image.
+
+### setCandidateQuadEdge
+
+Set the `Edge` object at the specified index.
+
+```java
+int setCandidateQuadEdge(int index, Edge edge, Matrix matrixToOriginalImage);
+```
+
+**Parameters**
+
+`[in] index`: The index of the edge.
+
+`[in] edge`: The edge to be set.
+
+`[in] matrixToOriginalImage`: The matrix to the original image.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. Otherwise, returns 0.
diff --git a/programming/android/api-reference/corners-unit-v2.0.20.md b/programming/android/api-reference/corners-unit-v2.0.20.md
new file mode 100644
index 0000000..bc53582
--- /dev/null
+++ b/programming/android/api-reference/corners-unit-v2.0.20.md
@@ -0,0 +1,41 @@
+---
+layout: default-layout
+title: CornersUnit - Dynamsoft Document Normalizer Android SDK API Reference
+description: The class CornersUnit represents an intermediate result unit whose type is corners.
+keywords: corners unit, java, kotlin
+needGenerateH3Content: true
+needAutoGenerateSidebar: true
+noTitleIndex: true
+---
+
+# CornersUnit
+
+The `CornersUnit` class represents an intermediate result unit whose type is corners.
+
+## Definition
+
+*Namespace:* com.dynamsoft.ddn.intermediate_results
+
+*Assembly:* DynamsoftDocumentNormalizer.aar
+
+```java
+class CornersUnit extends IntermediateResultUnit
+```
+
+## Methods Summary
+
+| Methods | Description |
+| ------- | ----------- |
+| [`getCorners`](#getcorners) | Get an array of corners. It includes all corners that participate quadrilaterals assembling. |
+
+### getCorners
+
+Get an array of corners. It includes all corners that participate quadrilaterals assembling.
+
+```java
+Corner[] getCorners();
+```
+
+**Return Value**
+
+Get an array of [`Corner`]({{site.dcv_android_api}}core/basic-structures/corner.html).
\ No newline at end of file
diff --git a/programming/android/api-reference/corners-unit.md b/programming/android/api-reference/corners-unit.md
index bc53582..b5b6516 100644
--- a/programming/android/api-reference/corners-unit.md
+++ b/programming/android/api-reference/corners-unit.md
@@ -27,6 +27,12 @@ class CornersUnit extends IntermediateResultUnit
| Methods | Description |
| ------- | ----------- |
| [`getCorners`](#getcorners) | Get an array of corners. It includes all corners that participate quadrilaterals assembling. |
+| [`getCount`](#getcount) | Get the number of corners. |
+| [`getCorner`](#getcorner) | Get a corner. |
+| [`removeAllCorners`](#removeallcorners) | Remove all corners. |
+| [`removeCorner`](#removecorner) | Remove a corner. |
+| [`addCorner`](#addcorner) | Add a corner. |
+| [`setCorner`](#setcorner) | Set a corner. |
### getCorners
@@ -38,4 +44,94 @@ Corner[] getCorners();
**Return Value**
-Get an array of [`Corner`]({{site.dcv_android_api}}core/basic-structures/corner.html).
\ No newline at end of file
+Get an array of [`Corner`]({{site.dcv_android_api}}core/basic-structures/corner.html).
+
+### getCount
+
+Get the number of corners.
+
+```java
+int getCount();
+```
+
+**Return Value**
+
+The number of corners.
+
+### getCorner
+
+Get the `Corner` object at the specified index.
+
+```java
+Corner getCorner(int index);
+```
+
+**Parameters**
+
+`[in] index`: The index of the corner.
+
+**Return Value**
+
+A `Corner` object as the specified corner.
+
+### removeAllCorners
+
+Remove all corners.
+
+```java
+void removeAllCorners();
+```
+
+### removeCorner
+
+Remove the corner at the specified index.
+
+```java
+int removeCorner(int index);
+```
+
+**Parameters**
+
+`[in] index`: The index of the corner.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. Otherwise, returns 0.
+
+### addCorner
+
+Add a new `Corner` object to the unit.
+
+```java
+int addCorner(Corner corner, Matrix matrixToOriginalImage);
+```
+
+**Parameters**
+
+`[in] corner`: The `Corner` object to be added.
+
+`[in] matrixToOriginalImage`: The matrix to the original image.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. Otherwise, returns 0.
+
+### setCorner
+
+Set the `Corner` object at the specified index.
+
+```java
+int setCorner(int index, Corner corner, Matrix matrixToOriginalImage);
+```
+
+**Parameters**
+
+`[in] index`: The index of the corner.
+
+`[in] corner`: The `Corner` object to be set.
+
+`[in] matrixToOriginalImage`: The matrix to the original image.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. Otherwise, returns 0.
diff --git a/programming/android/api-reference/detected-quads-unit-v2.0.20.md b/programming/android/api-reference/detected-quads-unit-v2.0.20.md
new file mode 100644
index 0000000..2ff0b7b
--- /dev/null
+++ b/programming/android/api-reference/detected-quads-unit-v2.0.20.md
@@ -0,0 +1,41 @@
+---
+layout: default-layout
+title: DetectedQuadsUnit - Dynamsoft Document Normalizer Android SDK API Reference
+description: The class DetectedQuadsUnit represents an intermediate result unit whose type is detected quads. It is inherited from the IntermediateResultUnit class.
+keywords: detected quads, java, kotlin
+needGenerateH3Content: true
+needAutoGenerateSidebar: true
+noTitleIndex: true
+---
+
+# DetectedQuadsUnit
+
+The `DetectedQuadsUnit` class represents an intermediate result unit whose type is detected quads. It is inherited from the `IntermediateResultUnit` class.
+
+## Definition
+
+*Namespace:* com.dynamsoft.ddn.intermediate_results
+
+*Assembly:* DynamsoftDocumentNormalizer.aar
+
+```java
+class DetectedQuadsUnit extends IntermediateResultUnit
+```
+
+## Methods Summary
+
+| Methods | Description |
+| ---------- | ----------- |
+| [`getDetectedQuads`](#getdetectedquads) | Gets an array of `DetectedQuadElement` objects, each containing the information of a single detected quadrilateral. |
+
+### getDetectedQuads
+
+Gets an array of `DetectedQuadElement` objects, each containing the information of a single detected quadrilateral.
+
+```java
+DetectedQuadElement[] getDetectedQuads()
+```
+
+**Return Value**
+
+The array of [`DetectedQuadElement`](./detected-quad-element.md).
diff --git a/programming/android/api-reference/detected-quads-unit.md b/programming/android/api-reference/detected-quads-unit.md
index 2ff0b7b..6d9f319 100644
--- a/programming/android/api-reference/detected-quads-unit.md
+++ b/programming/android/api-reference/detected-quads-unit.md
@@ -27,6 +27,12 @@ class DetectedQuadsUnit extends IntermediateResultUnit
| Methods | Description |
| ---------- | ----------- |
| [`getDetectedQuads`](#getdetectedquads) | Gets an array of `DetectedQuadElement` objects, each containing the information of a single detected quadrilateral. |
+| [`getCount`](#getcount) | Gets the number of detected quadrilaterals. |
+| [`getDetectedQuad`](#getdetectedquad) | Gets a detected quadrilateral. |
+| [`removeAllDetectedQuads`](#removedetectedquads) | Removes all detected quadrilaterals. |
+| [`removeDetectedQuad`](#removedetectedquad) | Removes a detected quadrilateral. |
+| [`addDetectedQuad`](#adddetectedquad) | Adds a detected quadrilateral. |
+| [`setDetectedQuad`](#setdetectedquad) | Sets a detected quadrilateral. |
### getDetectedQuads
@@ -39,3 +45,89 @@ DetectedQuadElement[] getDetectedQuads()
**Return Value**
The array of [`DetectedQuadElement`](./detected-quad-element.md).
+
+### getCount
+
+Gets the number of detected quadrilaterals.
+
+```java
+int getCount()
+```
+
+**Return Value**
+
+The number of detected quadrilaterals.
+
+### getDetectedQuad
+
+Gets the `DetectedQuadElement` at the specified index.
+
+```java
+DetectedQuadElement getDetectedQuad(int index)
+```
+
+**Return Value**
+
+A [`DetectedQuadElement`](./detected-quad-element.md) object that represents the detected quadrilateral.
+
+### removeAllDetectedQuads
+
+Removes all detected quadrilaterals.
+
+```java
+void removeAllDetectedQuads()
+```
+
+### removeDetectedQuad
+
+Removes the detected quadrilateral at the specified index.
+
+```java
+int removeDetectedQuad(int index)
+```
+
+**Parameters**
+
+`[in] index`: The index of the quadrilateral to remove.
+
+**Return Value**
+
+Returns the ErrorCode if failed. otherwise, returns 0.
+
+### addDetectedQuad
+
+Adds a [`DetectedQuadElement`](./detected-quad-element.md) to the unit.
+
+```java
+int addDetectedQuad(DetectedQuadElement element, Matrix matrixToOriginalImage)
+```
+
+**Parameters**
+
+`[in] element`: The [`DetectedQuadElement`](./detected-quad-element.md) object to add.
+
+`[in] matrixToOriginalImage`: The matrix to the original image.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. Otherwise, returns 0.
+
+### setDetectedQuad
+
+Sets the [`DetectedQuadElement`](./detected-quad-element.md) at the specified index.
+
+```java
+int setDetectedQuad(int index, DetectedQuadElement element, Matrix matrixToOriginalImage)
+```
+
+**Parameters**
+
+`[in] index`: The index of the quadrilateral to set.
+
+`[in] element`: The [`DetectedQuadElement`](./detected-quad-element.md) object to set.
+
+`[in] matrixToOriginalImage`: The matrix to the original image.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. Otherwise, returns 0.
diff --git a/programming/android/api-reference/index-v2.0.20.md b/programming/android/api-reference/index-v2.0.20.md
new file mode 100644
index 0000000..0aadb25
--- /dev/null
+++ b/programming/android/api-reference/index-v2.0.20.md
@@ -0,0 +1,168 @@
+---
+layout: default-layout
+title: Dynamsoft Document Normalizer Android API Reference - Main Page
+description: This is the main page of Dynamsoft Document Normalizer SDK API Reference for Android.
+keywords: api reference, Android
+permalink: /programming/android/api-reference/index-v2.0.20.html
+---
+
+# API Reference - Android
+
+## DynamsoftCaptureVisionRouter
+
+### CaptureVisionRouter Class
+
+- [`CaptureVisionRouter`]({{ site.dcv_android_api }}capture-vision-router/capture-vision-router.html)
+
+### Auxiliary Classes
+
+- [`CaptureVisionRouterModule`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/capture-vision-router-module.html)
+- [`SimplifiedCaptureVisionSettings`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/simplified-capture-vision-settings.html)
+
+### Interfaces
+
+- [`CaptureStateListener`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/capture-state-listener.html)
+- [`ImageSourceStateListener`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/image-source-state-listener.html)
+
+### Enumerations
+
+- [`EnumCaptureState`]({{ site.dcv_enumerations }}capture-vision-router/capture-state.html?lang=android)
+- [`EnumPresetTemplate`]({{ site.dcv_enumerations }}capture-vision-router/preset-template.html?lang=android)
+
+## DynamsoftDocumentNormalizer
+
+- [`CandidateQuadEdgesUnit`]({{ site.ddn_android_api }}candidate-quad-edges-unit.html)
+- [`CornersUnit`]({{ site.ddn_android_api }}corners-unit.html)
+- [`DetectedQuadElement`]({{ site.ddn_android_api }}detected-quad-element.html)
+- [`DetectedQuadResultItem`]({{ site.ddn_android_api }}detected-quad-result-item.html)
+- [`DetectedQuadsResult`]({{ site.ddn_android_api }}detected-quads-result.html)
+- [`DetectedQuadsUnit`]({{ site.ddn_android_api }}detected-quads-unit.html)
+- [`DocumentNormalizerModule`]({{ site.ddn_android_api }}document-normalizer-module.html)
+- [`LongLinesUnit`]({{ site.ddn_android_api }}long-lines-unit.html)
+- [`NormalizedImageElement`]({{ site.ddn_android_api }}normalized-image-element.html)
+- [`NormalizedImageResultItem`]({{ site.ddn_android_api }}normalized-image-result-item.html)
+- [`NormalizedImagesResult`]({{ site.ddn_android_api }}normalized-images-result.html)
+- [`NormalizedImageUnit`]({{ site.ddn_android_api }}normalized-image-unit.html)
+
+## DynamsoftCore
+
+### Classes
+
+- [`BinaryImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/binary-image-unit.html)
+- [`CapturedResultFilter`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/captured-result-filter.html)
+- [`CapturedResultItem`]({{ site.dcv_android_api }}core/basic-structures/captured-result-item.html)
+- [`CapturedResultReceiver`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/captured-result-receiver.html)
+- [`CapturedResult`]({{ site.dcv_android_api }}core/basic-structures/captured-result.html)
+- [`ColourImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/colour-image-unit.html)
+- [`ContoursUnit`]({{ site.dcv_android_api }}core/intermediate-results/contours-unit.html)
+- [`Contour`]({{ site.dcv_android_api }}core/basic-structures/contour.html)
+- [`CoreModule`]({{ site.dcv_android_api }}core/basic-structures/core-module.html)
+- [`Corner`]({{ site.dcv_android_api }}core/basic-structures/corner.html)
+- [`DSRect`]({{ site.dcv_android_api }}core/basic-structures/rect.html)
+- [`Edge`]({{ site.dcv_android_api }}core/basic-structures/edge.html)
+- [`EnhancedGrayscaleImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/enhanced-grayscale-image-unit.html)
+- [`FileImageTag`]({{ site.dcv_android_api }}core/basic-structures/file-image-tag.html)
+- [`GrayscaleImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/grayscale-image-unit.html)
+- [`ImageData`]({{ site.dcv_android_api }}core/basic-structures/image-data.html)
+- [`ImageSourceAdapter`]({{ site.dcv_android_api }}core/basic-structures/image-source-adapter.html)
+- [`ImageTag`]({{ site.dcv_android_api }}core/basic-structures/image-tag.html)
+- [`IntermediateResultExtraInfo`]({{ site.dcv_android_api }}core/intermediate-results/intermediate-result-extra-info.html)
+- [`IntermediateResultManager`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/intermediate-result-manager.html)
+- [`IntermediateResultReceiver`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/intermediate-result-receiver.html)
+- [`IntermediateResultUnit`]({{ site.dcv_android_api }}core/intermediate-results/intermediate-result-unit.html)
+- [`IntermediateResult`]({{ site.dcv_android_api }}core/intermediate-results/intermediate-result.html)
+- [`LineSegmentsUnit`]({{ site.dcv_android_api }}core/intermediate-results/line-segments-unit.html)
+- [`LineSegment`]({{ site.dcv_android_api }}core/basic-structures/line-segment.html)
+- [`ObservationParameters`]({{ site.dcv_android_api }}core/intermediate-results/observation-parameters.html)
+- [`OriginalImageResultItem`]({{ site.dcv_android_api }}core/basic-structures/original-image-result-item.html)
+- [`PredetectedRegionElement`]({{ site.dcv_android_api }}core/intermediate-results/predetected-region-element.html)
+- [`PredetectedRegionsUnit`]({{ site.dcv_android_api }}core/intermediate-results/predetected-regions-unit.html)
+- [`Quadrilateral`]({{ site.dcv_android_api }}core/basic-structures/quadrilateral.html)
+- [`RegionObjectElement`]({{ site.dcv_android_api }}core/intermediate-results/region-object-element.html)
+- [`ScaledDownColourImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/scaled-down-colour-image-unit.html)
+- [`TextRemovedBinaryImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/text-removed-binary-image-unit.html)
+- [`TextureDetectionResultUnit`]({{ site.dcv_android_api }}core/intermediate-results/texture-detection-result-unit.html)
+- [`TextureRemovedBinaryImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/texture-removed-binary-image-unit.html)
+- [`TextureRemovedGrayscaleImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/texture-removed-grayscale-image-unit.html)
+- [`TextZonesUnit`]({{ site.dcv_android_api }}core/intermediate-results/text-zones-unit.html)
+- [`TransformedGrayscaleImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/transformed-grayscale-image-unit.html)
+- [`Vector4`]({{ site.dcv_android_api }}core/basic-structures/vector4.html)
+- [`VideoFrameTag`]({{ site.dcv_android_api }}core/basic-structures/video-frame-tag.html)
+
+### Interfaces
+
+- [`ImageSourceErrorListener`]({{ site.dcv_android_api }}core/basic-structures/image-source-error-listener.html)
+
+### Enumerations
+
+- [`BufferOverflowProtectionMode`]({{ site.dcv_enumerations }}core/buffer-overflow-protection-mode.html?lang=android)
+- [`CapturedResultItemType`]({{ site.dcv_enumerations }}core/captured-result-item-type.html?lang=android)
+- [`ColourChannelUsageType`]({{ site.dcv_enumerations }}core/colour-channel-usage-type.html?lang=android)
+- [`CornerType`]({{ site.dcv_enumerations }}core/corner-type.html?lang=android)
+- [`ErrorCode`]({{ site.dcv_enumerations }}core/error-code.html?lang=android)
+- [`GrayscaleEnhancementMode`]({{ site.dcv_enumerations }}core/grayscale-enhancement-mode.html?lang=android)
+- [`GrayscaleTransformationMode`]({{ site.dcv_enumerations }}core/grayscale-transformation-mode.html?lang=android)
+- [`ImageCaptureDistanceMode`]({{ site.dcv_enumerations }}core/image-capture-distance-mode.html?lang=android)
+- [`ImagePixelFormat`]({{ site.dcv_enumerations }}core/image-pixel-format.html?lang=android)
+- [`ImageSourceState`]({{ site.dcv_enumerations }}core/image-source-state.html?lang=android)
+- [`ImageTagType`]({{ site.dcv_enumerations }}core/image-tag-type.html?lang=android)
+- [`IntermediateResultUnitType`]({{ site.dcv_enumerations }}core/intermediate-result-unit-type.html?lang=android)
+- [`LogMode`]({{ site.dcv_enumerations }}core/log-mode.html?lang=android)
+- [`RegionObjectElementType`]({{ site.dcv_enumerations }}core/region-object-element-type.html?lang=android)
+- [`SectionType`]({{ site.dcv_enumerations }}core/section-type.html?lang=android)
+- [`TransformMatrixType`]({{ site.dcv_enumerations }}core/transform-matrix-type.html?lang=android)
+- [`VideoFrameQuality`]({{ site.dcv_enumerations }}core/video-frame-quality.html?lang=android)
+
+## DynamsoftUtility
+
+- [`DirectoryFetcher`]({{ site.dcv_android_api }}utility/directory-fetcher.html)
+- [`FileFetcher`]({{ site.dcv_android_api }}utility/file-fetcher.html)
+- [`MultiFrameResultCrossFilter`]({{ site.dcv_android_api }}utility/multi-frame-result-cross-filter.html)
+- [`UtilityModule`]({{ site.dcv_android_api }}utility/utility-module.html)
+
+## DynamsoftCameraEnhancer
+
+### Classes
+
+- [`CameraEnhancer`]({{ site.dce_android_api }}primary-api/camera-enhancer.html)
+- [`CameraEnhancerModule`]({{ site.dce_android_api }}auxiliary-api/camera-enhancer-module.html)
+- [`CameraView`]({{ site.dce_android_api }}auxiliary-api/dcecameraview.html)
+- [`Capabilities`]({{ site.dce_android_api }}auxiliary-api/capabilities.html)
+- [`DrawingItem`]({{ site.dce_android_api }}auxiliary-api/drawingitem.html)
+- [`DrawingLayer`]({{ site.dce_android_api }}auxiliary-api/dcedrawinglayer.html)
+- [`DrawingStyleManager`]({{ site.dce_android_api }}auxiliary-api/drawingstylemanager.html)
+- [`DrawingStyle`]({{ site.dce_android_api }}auxiliary-api/drawingstyle.html)
+- [`Feedback`]({{ site.dce_android_api }}auxiliary-api/dcefeedback.html)
+- [`ImageEditorView`]({{ site.dce_android_api }}auxiliary-api/dceimageeditorview.html)
+- [`LineDrawingItem`]({{ site.dce_android_api }}auxiliary-api/drawingitem-line.html)
+- [`Note`]({{ site.dce_android_api }}auxiliary-api/note.html)
+- [`QuadDrawingItem`]({{ site.dce_android_api }}auxiliary-api/drawingitem-quad.html)
+- [`RectDrawingItem`]({{ site.dce_android_api }}auxiliary-api/drawingitem-rect.html)
+- [`TextDrawingItem`]({{ site.dce_android_api }}auxiliary-api/drawingitem-text.html)
+- [`TipConfig`]({{ site.dce_android_api }}auxiliary-api/tip-config.html)
+
+### Interfaces
+
+- [`CameraStateListener`]({{ site.dce_android_api }}auxiliary-api/protocol-dcecamerastatelistener.html)
+- [`PhotoListener`]({{ site.dce_android_api }}auxiliary-api/protocol-dcephotolistener.html)
+- [`VideoFrameListener`]({{ site.dce_android_api }}auxiliary-api/protocol-dceframelistener.html)
+
+### Enumerations
+
+- [`CameraPosition`]({{ site.dcv_enumerations }}camera-position.html?lang=objc,swift)
+- [`CameraState`]({{ site.dcv_enumerations }}camera-state.html?lang=objc,swift)
+- [`CoordinateBase`]({{ site.dcv_enumerations }}coordinate-base.html?lang=objc,swift)
+- [`DrawingItemMediaType`]({{ site.dcv_enumerations }}drawing-item-media-type.html?lang=objc,swift)
+- [`DrawingItemState`]({{ site.dcv_enumerations }}drawing-item-state.html?lang=objc,swift)
+- [`EnhancedFeatures`]({{ site.dcv_enumerations }}enhanced-features.html?lang=objc,swift)
+- [`FocusMode`]({{ site.dcv_enumerations }}focus-mode.html?lang=objc,swift)
+- [`Resolution`]({{ site.dcv_enumerations }}resolution.html?lang=objc,swift)
+
+## DynamsoftImageProcessing
+
+- [`ImageProcessingModule`]({{ site.dcv_android_api }}image-processing/image-processing-module.html)
+
+## DynamsoftLicense
+
+- [`LicenseManger`]({{ site.dcv_android_api }}license/license-manager.html)
+- [`LicenseModule`]({{ site.dcv_android_api }}license/license-module.html)
diff --git a/programming/android/api-reference/index.md b/programming/android/api-reference/index.md
index b1f0b8a..597a34e 100644
--- a/programming/android/api-reference/index.md
+++ b/programming/android/api-reference/index.md
@@ -8,116 +8,162 @@ permalink: /programming/android/api-reference/index.html
# API Reference - Android
-## Primary Class
+## DynamsoftCaptureVisionRouter
+
+### CaptureVisionRouter Class
- [`CaptureVisionRouter`]({{ site.dcv_android_api }}capture-vision-router/capture-vision-router.html)
-## Input
+### Auxiliary Classes
-- [`CameraEnhancer`]({{ site.dce_android }}primary-api/camera-enhancer.html)
-- [`ImageSourceAdapter`]({{ site.dcv_android_api }}core/basic-structures/image-source-adapter.html)
-- [`DirectoryFetcher`]({{ site.dcv_android_api }}utility/directory-fetcher.html)
-- [`FileFetcher`]({{ site.dcv_android_api }}utility/file-fetcher.html)
+- [`CaptureVisionRouterModule`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/capture-vision-router-module.html)
+- [`CapturedResultFilter`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/captured-result-filter.html)
+- [`CapturedResultReceiver`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/captured-result-receiver.html)
+- [`IntermediateResultManager`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/intermediate-result-manager.html)
+- [`IntermediateResultReceiver`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/intermediate-result-receiver.html)
+- [`SimplifiedCaptureVisionSettings`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/simplified-capture-vision-settings.html)
-## Final Results
+### Interfaces
-- [`CapturedResultReceiver`]({{ site.dcv_android_api }}core/basic-structures/captured-result-receiver.html)
-- [`CapturedResultItem`]({{ site.dcv_android_api }}core/basic-structures/captured-result-item.html)
-- [`CapturedResult`]({{ site.dcv_android_api }}core/basic-structures/captured-result.html)
-- [`DetectedQuadResultItem`]({{ site.android_api }}detected-quad-result-item.html)
-- [`DetectedQuadsResult`]({{ site.android_api }}detected-quads-result.html)
-- [`NormalizedImageResultItem`]({{ site.android_api }}normalized-image-result-item.html)
-- [`NormalizedImagesResult`]({{ site.android_api }}normalized-images-result.html)
-- [`OriginalImageResultItem`]({{ site.dcv_android_api }}core/basic-structures/original-image-result-item.html)
+- [`CaptureStateListener`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/capture-state-listener.html)
+- [`ImageSourceStateListener`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/image-source-state-listener.html)
-## Final Results Filters
+### Enumerations
-- [`CapturedResultFilter`]({{ site.dcv_android_api }}core/basic-structures/captured-result-filter.html)
-- [`MultiFrameResultCrossFilter`]({{ site.dcv_android_api }}utility/multi-frame-result-cross-filter.html)
+- [`EnumCaptureState`]({{ site.dcv_enumerations }}capture-vision-router/capture-state.html?lang=android)
+- [`EnumPresetTemplate`]({{ site.dcv_enumerations }}capture-vision-router/preset-template.html?lang=android)
-## Intermediate Results
+## DynamsoftDocumentNormalizer
+
+- [`CandidateQuadEdgesUnit`]({{ site.ddn_android_api }}candidate-quad-edges-unit.html)
+- [`CornersUnit`]({{ site.ddn_android_api }}corners-unit.html)
+- [`DetectedQuadElement`]({{ site.ddn_android_api }}detected-quad-element.html)
+- [`DetectedQuadResultItem`]({{ site.ddn_android_api }}detected-quad-result-item.html)
+- [`DetectedQuadsResult`]({{ site.ddn_android_api }}detected-quads-result.html)
+- [`DetectedQuadsUnit`]({{ site.ddn_android_api }}detected-quads-unit.html)
+- [`DocumentNormalizerModule`]({{ site.ddn_android_api }}document-normalizer-module.html)
+- [`LongLinesUnit`]({{ site.ddn_android_api }}long-lines-unit.html)
+- [`NormalizedImageElement`]({{ site.ddn_android_api }}normalized-image-element.html)
+- [`NormalizedImageResultItem`]({{ site.ddn_android_api }}normalized-image-result-item.html)
+- [`NormalizedImagesResult`]({{ site.ddn_android_api }}normalized-images-result.html)
+- [`NormalizedImageUnit`]({{ site.ddn_android_api }}normalized-image-unit.html)
+- [`SimplifiedDocumentNormalizerSettings`]({{ site.ddn_android_api }}simplified-document-normalizer-settings.html)
+
+## DynamsoftCore
+
+### Classes
-- [`IntermediateResultManager`]({{ site.dcv_android_api }}core/intermediate-results/intermediate-result-manager.html)
-- [`IntermediateResultReceiver`]({{ site.dcv_android_api }}core/intermediate-results/intermediate-result-receiver.html)
-- [`ObservationParameters`]({{ site.dcv_android_api }}core/intermediate-results/observation-parameters.html)
-- [`IntermediateResultExtraInfo`]({{ site.dcv_android_api }}core/intermediate-results/intermediate-result-extra-info.html)
-- [`IntermediateResult`]({{ site.dcv_android_api }}core/intermediate-results/intermediate-result.html)
-- [`IntermediateResultUnit`]({{ site.dcv_android_api }}core/intermediate-results/intermediate-result-unit.html)
-- [`PredetectedRegionsUnit`]({{ site.dcv_android_api }}core/intermediate-results/predetected-regions-unit.html)
-- [`DetectedQuadsUnit`]({{ site.android_api }}detected-quads-unit.html)
-- [`NormalizedImagesUnit`]({{ site.android_api }}normalized-image-unit.html)
-- [`RegionObjectElement`]({{ site.dcv_android_api }}core/intermediate-results/region-object-element.html)
-- [`PredetectedRegionElement`]({{ site.dcv_android_api }}core/intermediate-results/predetected-region-element.html)
-- [`DetectedQuadElement`]({{ site.android_api }}detected-quad-element.html)
-- [`NormalizedImageElement`]({{ site.android_api }}normalized-image-element.html)
- [`BinaryImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/binary-image-unit.html)
-- [`CandidateQuadEdgesUnit`]({{ site.android_api }}candidate-quad-edges-unit.html)
+- [`CapturedResultItem`]({{ site.dcv_android_api }}core/basic-structures/captured-result-item.html)
+- [`CapturedResult`]({{ site.dcv_android_api }}core/basic-structures/captured-result.html)
- [`ColourImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/colour-image-unit.html)
- [`ContoursUnit`]({{ site.dcv_android_api }}core/intermediate-results/contours-unit.html)
-- [`CornersUnit`]({{ site.android_api }}corners-unit.html)
+- [`Contour`]({{ site.dcv_android_api }}core/basic-structures/contour.html)
+- [`CoreModule`]({{ site.dcv_android_api }}core/basic-structures/core-module.html)
+- [`Corner`]({{ site.dcv_android_api }}core/basic-structures/corner.html)
+- [`DSRect`]({{ site.dcv_android_api }}core/basic-structures/rect.html)
+- [`Edge`]({{ site.dcv_android_api }}core/basic-structures/edge.html)
- [`EnhancedGrayscaleImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/enhanced-grayscale-image-unit.html)
+- [`FileImageTag`]({{ site.dcv_android_api }}core/basic-structures/file-image-tag.html)
- [`GrayscaleImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/grayscale-image-unit.html)
+- [`ImageData`]({{ site.dcv_android_api }}core/basic-structures/image-data.html)
+- [`ImageSourceAdapter`]({{ site.dcv_android_api }}core/basic-structures/image-source-adapter.html)
+- [`ImageTag`]({{ site.dcv_android_api }}core/basic-structures/image-tag.html)
+- [`IntermediateResultExtraInfo`]({{ site.dcv_android_api }}core/intermediate-results/intermediate-result-extra-info.html)
+- [`IntermediateResultUnit`]({{ site.dcv_android_api }}core/intermediate-results/intermediate-result-unit.html)
+- [`IntermediateResult`]({{ site.dcv_android_api }}core/intermediate-results/intermediate-result.html)
- [`LineSegmentsUnit`]({{ site.dcv_android_api }}core/intermediate-results/line-segments-unit.html)
-- [`LongLinesUnit`]({{ site.android_api }}long-lines-unit.html)
+- [`LineSegment`]({{ site.dcv_android_api }}core/basic-structures/line-segment.html)
+- [`ObservationParameters`]({{ site.dcv_android_api }}core/intermediate-results/observation-parameters.html)
+- [`OriginalImageResultItem`]({{ site.dcv_android_api }}core/basic-structures/original-image-result-item.html)
+- [`PredetectedRegionElement`]({{ site.dcv_android_api }}core/intermediate-results/predetected-region-element.html)
+- [`PredetectedRegionsUnit`]({{ site.dcv_android_api }}core/intermediate-results/predetected-regions-unit.html)
+- [`Quadrilateral`]({{ site.dcv_android_api }}core/basic-structures/quadrilateral.html)
+- [`RegionObjectElement`]({{ site.dcv_android_api }}core/intermediate-results/region-object-element.html)
- [`ScaledDownColourImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/scaled-down-colour-image-unit.html)
- [`TextRemovedBinaryImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/text-removed-binary-image-unit.html)
-- [`TextZonesUnit`]({{ site.dcv_android_api }}core/intermediate-results/text-zones-unit.html)
- [`TextureDetectionResultUnit`]({{ site.dcv_android_api }}core/intermediate-results/texture-detection-result-unit.html)
- [`TextureRemovedBinaryImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/texture-removed-binary-image-unit.html)
- [`TextureRemovedGrayscaleImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/texture-removed-grayscale-image-unit.html)
+- [`TextZonesUnit`]({{ site.dcv_android_api }}core/intermediate-results/text-zones-unit.html)
- [`TransformedGrayscaleImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/transformed-grayscale-image-unit.html)
+- [`Vector4`]({{ site.dcv_android_api }}core/basic-structures/vector4.html)
+- [`VideoFrameTag`]({{ site.dcv_android_api }}core/basic-structures/video-frame-tag.html)
-## Settings
+### Interfaces
-- [`SimplifiedCaptureVisionSettings`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/simplified-capture-vision-settings.html)
-- [`EnumPresetTemplate`]({{ site.dcv_enums }}capture-vision-router/preset-template.html?lang=android)
+- [`ImageSourceErrorListener`]({{ site.dcv_android_api }}core/basic-structures/image-source-error-listener.html)
-## State Listener
+### Enumerations
-- [`CaptureStateListener`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/capture-state-listener.html)
-- [`ImageSourceStateListener`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/image-source-state-listener.html)
+- [`BufferOverflowProtectionMode`]({{ site.dcv_enumerations }}core/buffer-overflow-protection-mode.html?lang=android)
+- [`CapturedResultItemType`]({{ site.dcv_enumerations }}core/captured-result-item-type.html?lang=android)
+- [`ColourChannelUsageType`]({{ site.dcv_enumerations }}core/colour-channel-usage-type.html?lang=android)
+- [`CornerType`]({{ site.dcv_enumerations }}core/corner-type.html?lang=android)
+- [`ErrorCode`]({{ site.dcv_enumerations }}core/error-code.html?lang=android)
+- [`GrayscaleEnhancementMode`]({{ site.dcv_enumerations }}core/grayscale-enhancement-mode.html?lang=android)
+- [`GrayscaleTransformationMode`]({{ site.dcv_enumerations }}core/grayscale-transformation-mode.html?lang=android)
+- [`ImageCaptureDistanceMode`]({{ site.dcv_enumerations }}core/image-capture-distance-mode.html?lang=android)
+- [`ImagePixelFormat`]({{ site.dcv_enumerations }}core/image-pixel-format.html?lang=android)
+- [`ImageSourceState`]({{ site.dcv_enumerations }}core/image-source-state.html?lang=android)
+- [`ImageTagType`]({{ site.dcv_enumerations }}core/image-tag-type.html?lang=android)
+- [`IntermediateResultUnitType`]({{ site.dcv_enumerations }}core/intermediate-result-unit-type.html?lang=android)
+- [`LogMode`]({{ site.dcv_enumerations }}core/log-mode.html?lang=android)
+- [`RegionObjectElementType`]({{ site.dcv_enumerations }}core/region-object-element-type.html?lang=android)
+- [`SectionType`]({{ site.dcv_enumerations }}core/section-type.html?lang=android)
+- [`TransformMatrixType`]({{ site.dcv_enumerations }}core/transform-matrix-type.html?lang=android)
+- [`VideoFrameQuality`]({{ site.dcv_enumerations }}core/video-frame-quality.html?lang=android)
-## License Manager
+## DynamsoftUtility
-- [`LicenseManager`]({{ site.dcv_android_api }}license/license-manager.html)
+- [`DirectoryFetcher`]({{ site.dcv_android_api }}utility/directory-fetcher.html)
+- [`FileFetcher`]({{ site.dcv_android_api }}utility/file-fetcher.html)
+- [`MultiFrameResultCrossFilter`]({{ site.dcv_android_api }}utility/multi-frame-result-cross-filter.html)
+- [`UtilityModule`]({{ site.dcv_android_api }}utility/utility-module.html)
-## Basic Structure
+## DynamsoftCameraEnhancer
+
+### Classes
+
+- [`CameraEnhancer`]({{ site.dce_android_api }}primary-api/camera-enhancer.html)
+- [`CameraEnhancerModule`]({{ site.dce_android_api }}auxiliary-api/camera-enhancer-module.html)
+- [`CameraView`]({{ site.dce_android_api }}auxiliary-api/dcecameraview.html)
+- [`Capabilities`]({{ site.dce_android_api }}auxiliary-api/capabilities.html)
+- [`DrawingItem`]({{ site.dce_android_api }}auxiliary-api/drawingitem.html)
+- [`DrawingLayer`]({{ site.dce_android_api }}auxiliary-api/dcedrawinglayer.html)
+- [`DrawingStyleManager`]({{ site.dce_android_api }}auxiliary-api/drawingstylemanager.html)
+- [`DrawingStyle`]({{ site.dce_android_api }}auxiliary-api/drawingstyle.html)
+- [`Feedback`]({{ site.dce_android_api }}auxiliary-api/dcefeedback.html)
+- [`ImageEditorView`]({{ site.dce_android_api }}auxiliary-api/dceimageeditorview.html)
+- [`LineDrawingItem`]({{ site.dce_android_api }}auxiliary-api/drawingitem-line.html)
+- [`Note`]({{ site.dce_android_api }}auxiliary-api/note.html)
+- [`QuadDrawingItem`]({{ site.dce_android_api }}auxiliary-api/drawingitem-quad.html)
+- [`RectDrawingItem`]({{ site.dce_android_api }}auxiliary-api/drawingitem-rect.html)
+- [`TextDrawingItem`]({{ site.dce_android_api }}auxiliary-api/drawingitem-text.html)
+- [`TipConfig`]({{ site.dce_android_api }}auxiliary-api/tip-config.html)
+
+### Interfaces
+
+- [`CameraStateListener`]({{ site.dce_android_api }}auxiliary-api/protocol-dcecamerastatelistener.html)
+- [`PhotoListener`]({{ site.dce_android_api }}auxiliary-api/protocol-dcephotolistener.html)
+- [`VideoFrameListener`]({{ site.dce_android_api }}auxiliary-api/protocol-dceframelistener.html)
+
+### Enumerations
+
+- [`CameraPosition`]({{ site.dcv_enumerations }}camera-position.html?lang=objc,swift)
+- [`CameraState`]({{ site.dcv_enumerations }}camera-state.html?lang=objc,swift)
+- [`CoordinateBase`]({{ site.dcv_enumerations }}coordinate-base.html?lang=objc,swift)
+- [`DrawingItemMediaType`]({{ site.dcv_enumerations }}drawing-item-media-type.html?lang=objc,swift)
+- [`DrawingItemState`]({{ site.dcv_enumerations }}drawing-item-state.html?lang=objc,swift)
+- [`EnhancedFeatures`]({{ site.dcv_enumerations }}enhanced-features.html?lang=objc,swift)
+- [`FocusMode`]({{ site.dcv_enumerations }}focus-mode.html?lang=objc,swift)
+- [`Resolution`]({{ site.dcv_enumerations }}resolution.html?lang=objc,swift)
+
+## DynamsoftImageProcessing
-- [`Contour`]({{ site.dcv_android_api }}core/basic-structures/contour.html)
-- [`Corner`]({{ site.dcv_android_api }}core/basic-structures/corner.html)
-- [`Edge`]({{ site.dcv_android_api }}core/basic-structures/edge.html)
-- [`FileImageTag`]({{ site.dcv_android_api }}core/basic-structures/file-image-tag.html)
-- [`ImageData`]({{ site.dcv_android_api }}core/basic-structures/image-data.html)
-- [`ImageTag`]({{ site.dcv_android_api }}core/basic-structures/image-tag.html)
-- [`LineSegment`]({{ site.dcv_android_api }}core/basic-structures/line-segment.html)
-- [`Quadrilateral`]({{ site.dcv_android_api }}core/basic-structures/quadrilateral.html)
-- [`Rect`]({{ site.dcv_android_api }}core/basic-structures/rect.html)
-- [`VideoFrameTag`]({{ site.dcv_android_api }}core/basic-structures/video-frame-tag.html)
+- [`ImageProcessingModule`]({{ site.dcv_android_api }}image-processing/image-processing-module.html)
-## Modules
+## DynamsoftLicense
-- [`CaptureVisionRouterModule`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/capture-vision-router-module.html)
-- [`DocumentNormalizerModule`]({{ site.android_api }}document-normalizer-module.html)
-- [`CoreModule`]({{ site.dcv_android_api }}core/basic-structures/core-module.html)
+- [`LicenseManger`]({{ site.dcv_android_api }}license/license-manager.html)
- [`LicenseModule`]({{ site.dcv_android_api }}license/license-module.html)
-- [`UtilityModule`]({{ site.dcv_android_api }}utility/utility-module.html)
-- [`ImageProcessingModule`]({{ site.dcv_android_api }}image-processing/image-processing-module.html)
-
-## Enumerations
-
-- [`EnumBufferOverflowProtectionMode`]({{ site.dcv_enums }}core/buffer-overflow-protection-mode.html?lang=android)
-- [`EnumCapturedResultItemType`]({{ site.dcv_enums }}core/captured-result-item-type.html?lang=android)
-- [`EnumCornerType`]({{ site.dcv_enums }}core/corner-type.html?lang=android)
-- [`EnumErrorCode`]({{ site.dcv_enums }}core/error-code.html?lang=android)
-- [`EnumGrayscaleTransformationMode`]({{ site.dcv_enums }}core/grayscale-transformation-mode.html?lang=android)
-- [`EnumImageCaptureDistanceMode`]({{ site.dcv_enums }}core/image-capture-distance-mode.html?lang=android)
-- [`EnumImagePixelFormat`]({{ site.dcv_enums }}core/image-pixel-format.html?lang=android)
-- [`EnumImageSourceState`]({{ site.dcv_enums }}core/image-source-state.html?lang=android)
-- [`EnumImageTagType`]({{ site.dcv_enums }}core/image-tag-type.html?lang=android)
-- [`EnumIntermediateResultUnitType`]({{ site.dcv_enums }}core/intermediate-result-unit-type.html?lang=android)
-- [`EnumRegionObjectElementType`]({{ site.dcv_enums }}core/region-object-element-type.html?lang=android)
-- [`EnumSectionType`]({{ site.dcv_enums }}core/section-type.html?lang=android)
-- [`EnumRasterDataSource`]({{ site.dcv_enums }}core/raster-data-source.html?lang=android)
-- [`EnumVideoFrameQuality`]({{ site.dcv_enums }}core/video-frame-quality.html?lang=android)
-- [`EnumColourChannelUsageType`]({{ site.dcv_enums}}core/colour-channel-usage-type.html?lang=android)
-- [`EnumTransformMatrixType`]({{ site.dcv_enums}}core/transform-matrix-type.html?lang=android)
diff --git a/programming/android/api-reference/long-lines-unit-v2.0.20.md b/programming/android/api-reference/long-lines-unit-v2.0.20.md
new file mode 100644
index 0000000..dcdbe35
--- /dev/null
+++ b/programming/android/api-reference/long-lines-unit-v2.0.20.md
@@ -0,0 +1,41 @@
+---
+layout: default-layout
+title: LongLinesUnit - Dynamsoft Document Normalizer Android SDK API Reference
+description: The class LongLinesUnit represents an intermediate result unit whose type is long lines. Line segments that are located in the same line are extended and merged to form a long line.
+keywords: long lines, intermediate result unit, java, kotlin
+needGenerateH3Content: true
+needAutoGenerateSidebar: true
+noTitleIndex: true
+---
+
+# LongLinesUnit
+
+The `LongLinesUnit` class represents an intermediate result unit whose type is long lines. Line segments that are located in the same line are extended and merged to form a long line.
+
+## Definition
+
+*Namespace:* com.dynamsoft.ddn.intermediate_results
+
+*Assembly:* DynamsoftDocumentNormalizer.aar
+
+```java
+class LongLinesUnit extends IntermediateResultUnit
+```
+
+## Methods Summary
+
+| Methods | Description |
+| ---------- | ----------- |
+| [`getLongLines`](#getlonglines) | Get an array of [`LineSegment`]({{site.dcv_android_api}}core/basic-structures/line-segment.html) as the long lines. |
+
+### getLongLines
+
+Get an array of [`LineSegment`]({{site.dcv_android_api}}core/basic-structures/line-segment.html) as the long lines.
+
+```java
+LineSegment[] getLongLines();
+```
+
+**Return Value**
+
+The array of [`LineSegment`]({{site.dcv_android_api}}core/basic-structures/line-segment.html) as the long lines.
diff --git a/programming/android/api-reference/long-lines-unit.md b/programming/android/api-reference/long-lines-unit.md
index dcdbe35..a93b5b3 100644
--- a/programming/android/api-reference/long-lines-unit.md
+++ b/programming/android/api-reference/long-lines-unit.md
@@ -27,6 +27,12 @@ class LongLinesUnit extends IntermediateResultUnit
| Methods | Description |
| ---------- | ----------- |
| [`getLongLines`](#getlonglines) | Get an array of [`LineSegment`]({{site.dcv_android_api}}core/basic-structures/line-segment.html) as the long lines. |
+| [`getCount`](#getcount) | Get the number of long lines. |
+| [`getLongLine`](#getlongline) | Get a long line. |
+| [`removeAllLongLines`](#removealllonglines) | Remove all long lines. |
+| [`removeLongLine`](#removelongline) | Remove a long line. |
+| [`addLongLine`](#addlongline) | Add a long line. |
+| [`setLongLine`](#setlongline) | Set a long line. |
### getLongLines
@@ -39,3 +45,93 @@ LineSegment[] getLongLines();
**Return Value**
The array of [`LineSegment`]({{site.dcv_android_api}}core/basic-structures/line-segment.html) as the long lines.
+
+### getCount
+
+Get the number of long lines.
+
+```java
+int getCount();
+```
+
+**Return Value**
+
+The number of long lines.
+
+### getLongLine
+
+Get the long line at the specified index.
+
+```java
+LineSegment getLongLine(int index);
+```
+
+**Parameters**
+
+`[in] index`: The index of the long line.
+
+**Return Value**
+
+A `LineSegment` object as the long line at the specified index.
+
+### removeAllLongLines
+
+Remove all long lines.
+
+```java
+void removeAllLongLines();
+```
+
+### removeLongLine
+
+Remove the long line at the specified index.
+
+```java
+int removeLongLine(int index);
+```
+
+**Parameters**
+
+The index of the long line to be removed.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. Otherwise, returns 0.
+
+### addLongLine
+
+Add a long line.
+
+```java
+int addLongLine(LineSegment line, Matrix matrixToOriginalImage);
+```
+
+**Parameters**
+
+`[in] line`: The long line to be added.
+
+`[in] matrixToOriginalImage`: The transformation matrix from the original image to the current image.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. Otherwise, returns 0.
+
+### setLongLine
+
+Set the long line at the specified index.
+
+```java
+int setLongLine(int index, LineSegment line, Matrix matrixToOriginalImage);
+```
+
+**Parameters**
+
+`[in] index`: The index of the long line to be set.
+
+`[in] line`: A `LineSegment` object as the long line to be set.
+
+`[in] matrixToOriginalImage`: The transformation matrix from the original image to the current image.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. Otherwise, returns 0.
diff --git a/programming/android/api-reference/normalized-image-unit-v2.0.20.md b/programming/android/api-reference/normalized-image-unit-v2.0.20.md
new file mode 100644
index 0000000..22c5219
--- /dev/null
+++ b/programming/android/api-reference/normalized-image-unit-v2.0.20.md
@@ -0,0 +1,41 @@
+---
+layout: default-layout
+title: NormalizedImagesUnit - Dynamsoft Document Normalizer Android SDK API Reference
+description: The class NormalizedImagesUnit represents an intermediate result unit whose type is normalized images.
+keywords: normalized images, java, kotlin
+needGenerateH3Content: true
+needAutoGenerateSidebar: true
+noTitleIndex: true
+---
+
+# NormalizedImagesUnit
+
+The `NormalizedImagesUnit` class represents an intermediate result unit whose type is normalized images.
+
+## Definition
+
+*Namespace:* com.dynamsoft.ddn.intermediate_results
+
+*Assembly:* DynamsoftDocumentNormalizer.aar
+
+```java
+class NormalizedImagesUnit extends IntermediateResultUnit
+```
+
+## Methods Summary
+
+| Methods | Description |
+| ---------- | ----------- |
+| [`getNormalizedImages`](#getnormalizedimages) | Gets an array of [`NormalizedImageElement`](./normalized-image-element.md). |
+
+### getNormalizedImages
+
+Gets an array of [`NormalizedImageElement`](./normalized-image-element.md).
+
+```java
+NormalizedImageElement[] getNormalizedImages();
+```
+
+**Return Value**
+
+The array of [`NormalizedImageElement`](./normalized-image-element.md).
diff --git a/programming/android/api-reference/normalized-image-unit.md b/programming/android/api-reference/normalized-image-unit.md
index 22c5219..ea78401 100644
--- a/programming/android/api-reference/normalized-image-unit.md
+++ b/programming/android/api-reference/normalized-image-unit.md
@@ -26,11 +26,15 @@ class NormalizedImagesUnit extends IntermediateResultUnit
| Methods | Description |
| ---------- | ----------- |
-| [`getNormalizedImages`](#getnormalizedimages) | Gets an array of [`NormalizedImageElement`](./normalized-image-element.md). |
+| [`getNormalizedImages`](#getnormalizedimages) | Gets an array of [`NormalizedImageElement`](normalized-image-element.md). |
+| [`getCount`](#getcount) | Gets the number of normalized images. |
+| [`getNormalizedImage`](#getnormalizedimage) | Gets a normalized image. |
+| [`removeAllNormalizedImages`](#removeallnormalizedimages) | Removes all normalized images. |
+| [`setNormalizedImage`](#setnormalizedimage) | Sets a normalized image. |
### getNormalizedImages
-Gets an array of [`NormalizedImageElement`](./normalized-image-element.md).
+Gets an array of [`NormalizedImageElement`](normalized-image-element.md).
```java
NormalizedImageElement[] getNormalizedImages();
@@ -38,4 +42,54 @@ NormalizedImageElement[] getNormalizedImages();
**Return Value**
-The array of [`NormalizedImageElement`](./normalized-image-element.md).
+The array of [`NormalizedImageElement`](normalized-image-element.md).
+
+### getCount
+
+Gets the number of normalized images.
+
+```java
+int getCount();
+```
+
+**Return Value**
+
+The number of normalized images.
+
+### getNormalizedImage
+
+Gets a normalized image.
+
+```java
+NormalizedImageElement getNormalizedImage(int index);
+```
+
+**Return Value**
+
+A [`NormalizedImageElement`](normalized-image-element.md) object that represents the normalized image.
+
+### removeAllNormalizedImages
+
+Removes all normalized images.
+
+```java
+void removeAllNormalizedImages();
+```
+
+### setNormalizedImage
+
+Sets a [`NormalizedImageElement`](normalized-image-element.md) as the normalized image.
+
+```java
+int setNormalizedImage(NormalizedImageElement element, Matrix matrixToOriginalImage);
+```
+
+**Parameters**
+
+`[in] element`: The normalized image to be set.
+
+`[in] matrixToOriginalImage`: The matrix to the original image.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. otherwise, returns 0.
diff --git a/programming/android/api-reference/simplified-document-normalizer-settings.md b/programming/android/api-reference/simplified-document-normalizer-settings.md
new file mode 100644
index 0000000..649de04
--- /dev/null
+++ b/programming/android/api-reference/simplified-document-normalizer-settings.md
@@ -0,0 +1,100 @@
+---
+layout: default-layout
+title: SimplifiedDocumentNormalizerSettings - Dynamsoft Document Normalizer module Android Edition API Reference
+description: The class SimplifiedDocumentNormalizerSettings of Dynamsoft Document Normalizer module Android edition represents the simplified document normalizer settings.
+keywords: document normalizer settings, Android, java
+needGenerateH3Content: true
+needAutoGenerateSidebar: true
+noTitleIndex: true
+---
+
+# SimplifiedDocumentNormalizerSettings
+
+The `SimplifiedDocumentNormalizerSettings` class represents the simplified document normalizer settings.
+
+## Definition
+
+*Namespace:* com.dynamsoft.ddn
+
+*Assembly:* DynamsoftDocumentNormalizer.aar
+
+```java
+class SimplifiedDocumentNormalizerSettings
+```
+
+## Attributes
+
+| Attributes | Type | Description |
+| ---------- | ---- | ----------- |
+| [`grayscaleTransformationModes`](#grayscaletransformationmodes) | *EnumGrayscaleTransformationMode[]* | An array of GrayscaleTransformationMode. It controls whether to detect the inverted document boundary. |
+| [`grayscaleEnhancementModes`](#grayscaleenhancementmodes) | *EnumGrayscaleEnhancementModes[]* | An array of GrayscaleEnhancementModes. |
+| [`colourMode`](#colourmode) | *EnumImageColourMode* | The grayscale transformation mode. It controls whether to decode the inverted text. |
+| [`pageSize`](#pagesize) | *int[]* | The page size. |
+| [`brightness`](#brightness) | *int* | The brightness. |
+| [`contrast`](#contrast) | *int* | The contrast. |
+| [`maxThreadsInOneTask`](#maxthreadsinonetask) | *int* | The maximum number of threads in one task. |
+| [`scaleDownThreshold`](#scaledownthreshold) | *int* | The scale down threshold. |
+
+### grayscaleTransformationModes
+
+Defines the grayscale transformation mode with an array of [`EnumGrayscaleTransformationMode`]({{ site.dcv_enumerations }}core/grayscale-transformation-mode.html?lang=android). It controls whether to detect the inverted document boundary.
+
+```java
+EnumGrayscaleTransformationMode[] grayscaleTransformationModes;
+```
+
+### grayscaleEnhancementModes
+
+Defines the grayscale enhancement mode with an array of [`EnumGrayscaleEnhancementModes`]({{ site.dcv_enumerations }}core/grayscale-enhancement-modes.html?lang=android).
+
+```java
+EnumGrayscaleEnhancementMode[] grayscaleEnhancementModes;
+```
+
+### colourMode
+
+Defines the colour mode of the normalized image with an [`EnumImageColourMode`]({{ site.dcv_enumerations }}core/image-colour-mode.html?lang=android) member.
+
+```java
+EnumImageColourMode colourMode;
+```
+
+### pageSize
+
+Defines the page size of the normalized image with the width and height in an int array.
+
+```java
+int[] pageSize;
+```
+
+### brightness
+
+Defines the brightness of the normalized image with an integer.
+
+```java
+int brightness;
+```
+
+### contrast
+
+Defines the contrast of the normalized image with an integer.
+
+```java
+int contrast;
+```
+
+### maxThreadsInOneTask
+
+Defines the maximum number of threads in one task.
+
+```java
+int maxThreadsInOneTask;
+```
+
+### scaleDownThreshold
+
+Defines the scale down threshold. If the image size is larger than the scale down threshold, the image is scaled down by half.
+
+```java
+int scaleDownThreshold;
+```
diff --git a/programming/android/index.md b/programming/android/index.md
index af6e44c..43cffe0 100644
--- a/programming/android/index.md
+++ b/programming/android/index.md
@@ -20,7 +20,7 @@ Furthermore, DDN provides a powerful parameter system in order to cope with vari
## Getting Started with DDN Android Edition
-The best way to start with the Dynamsoft Document Normalizer Android Edition is by following the [`User Guide`](user-guide.md) to build your first document normalization application.
+The best way to start with the Dynamsoft Document Normalizer Android Edition is by following the [User Guide](user-guide.md) to build your first document normalization application.
## License Subscription
diff --git a/programming/android/release-notes/android-2.md b/programming/android/release-notes/android-2.md
index 6b949d8..978dd71 100644
--- a/programming/android/release-notes/android-2.md
+++ b/programming/android/release-notes/android-2.md
@@ -11,6 +11,94 @@ permalink: /programming/android/release-notes/android-2.html
# Release Notes for Android SDK - v2.x
+## 2.2.10 (03/07/2024)
+
+### New
+
+- Updated the template system
+ - Added `ReferenceTaskNameArray` under [`Location.ReferenceObjectFilter`]({{ site.parameters }}reference/target-roi-def/location.html) to filter the reference objects generated by the task name.
+ - Added the support of the [`OutputTaskSetting`]({{ site.parameters }}reference/output-task-setting/index.html) definition. The following subparameters are available in `OutputTaskSetting` object:
+ - [`OutputCondition`]({{ site.parameters }}reference/output-task-setting/output-condition.html)
+ - [`TaskResultArray`]({{ site.parameters }}reference/output-task-setting/output-condition.html#taskresultarray)
+ - [`TargetROIDefName`]({{ site.parameters }}reference/target-roi-def/index.html#targetroidefname)
+ - [`TaskSettingNameArray`]({{ site.parameters }}reference/output-task-setting/output-condition.html#tasksettingnamearray)
+ - [`BackwardReferenceOutput`]({{ site.parameters }}reference/output-task-setting/output-condition.html#backwardreferenceoutput)
+ - `ReferenceTaskNameArray`
+ - `ReferenceResultTypeArray`
+ - [`Operator`]({{ site.parameters }}reference/output-task-setting/output-condition.html)
+ - [`Name`]({{ site.parameters }}reference/output-task-setting/name.html)
+ - [`Offset`]({{ site.parameters }}reference/target-roi-def/location.html#offset) parameter is optimized.
+ - Added `ReferenceObjectType` to specify whether the reference object is an atomic object or the whole image.
+ - Added `ReferenceXAxis` & `ReferenceYAxis` to define the X & Y axis.
+ - Modified `FirstPoint`, `SecondPoint`, `ThirdPoint` & `FourthPoint`. You can specify whether the X or Y coordinate of the point is measured by percentage.
+ - Deprecated `ReferenceObjectSize` Type.
+- The following classes are migrated from `DynamsoftCore.aar` into `DynamsoftCaptureVision.aar`:
+ - [`CapturedResult`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/captured-result.html)
+ - [`IntermediateResultReceiver`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/intermediate-result-receiver.html)
+ - [`CapturedResultReceiver`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/captured-result-receiver.html)
+ - [`CapturedResultFilter`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/captured-result-filter.html)
+ - [`IntermediateResultManager`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/intermediate-result-manager.html)
+- Added a new call back method [`onShortLinesUnitReceived`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/intermediate-result-receiver.html#onshortlinesunitreceived) to the [`IntermediateResultReceiver`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/intermediate-result-receiver.html) class.
+- Added methods [`pauseCapturing`]({{ site.dcv_android_api }}capture-vision-router/multiple-file-processing.html#pausecapturing) and [`resumeCapturing`]({{ site.dcv_android_api }}capture-vision-router/multiple-file-processing.html#resumecapturing). Two new enumeration members, `CapturedStatePaused` and `CapturedStateResumed`, are added to [`CapturedState`]({{ site.dcv_enumerations }}capture-vision-router/capture-state.html?lang=android) as well.
+- Added a new property [`documentSettings`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/simplified-capture-vision-settings.html#documentsettings) to class [`SimplifiedCaptureVisionSettings`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/simplified-capture-vision-settings.html). The corresponding class [`SimplifiedDocumentNormalizerSettings`]({{ site.ddn_android_api }}simplified-document-normalizer-settings.html) is added to the `DynamsoftDocumentNormalizer.aar` to store the `documentSettings`.
+- Added a new prop the following methods to the [`ObservationParameters`]({{ site.dcv_android_api }}core/intermediate-results/observation-parameters.html) class to specify the `input only` result unit.
+ - `setResultUnitTypesOnlyForInput`
+ - `getResultUnitTypesOnlyForInput`
+- Added the following methods to the [`RegionObjectElement`]({{ site.dcv_android_api }}core/intermediate-results/region-object-element.html) class to support the intermediate result modification.
+ - `setLocation`
+ - `clone`
+ - `retain`
+ - `release`
+- Added a new method `replace` to the [`IntermediateResultUnit`]({{ site.dcv_android_api }}core/intermediate-results/intermediate-result-unit.html) class to support the replacement of intermediate result units.
+- Added `setImageData` methods to the following classes:
+ - [`ColourImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/colour-image-unit.html)
+ - [`ScaledDownColourImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/scaled-down-colour-image-unit.html)
+ - [`GrayscaleImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/grayscale-image-unit.html)
+ - [`TransformedGrayscaleImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/transformed-grayscale-image-unit.html)
+ - [`EnhancedGrayscaleImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/enhanced-grayscale-image-unit.html)
+ - [`BinaryImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/binary-image-unit.html)
+ - [`TextureRemovedGrayscaleImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/texture-removed-grayscale-image-unit.html)
+ - [`TextureRemovedBinaryImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/texture-removed-binary-image-unit.html)
+ - [`TextRemovedBinaryImageUnit`]({{ site.dcv_android_api }}core/intermediate-results/text-removed-binary-image-unit.html)
+- Added new methods to the [`PredetectedRegionsUnit`]({{ site.dcv_android_api }}core/intermediate-results/predetected-regions-unit.html) class to add, remove or set the predetected regions.
+- Added new methods to the [`LineSegmentsUnit`]({{ site.dcv_android_api }}core/intermediate-results/line-segments-unit.html) class to add, remove or set the line segments.
+- Added new methods to the [`TextZonesUnit`]({{ site.dcv_android_api }}core/intermediate-results/text-zones-unit.html) class to add, remove or set the text zones. Added a new class CTextZone to store the information of a single text zone.
+- Added a new method `setContours` to the [`ContourUnit`]({{ site.dcv_android_api }}core/intermediate-results/contour-unit.html) class.
+- Added new methods to the [`TextureDetectionResultUnit`]({{ site.dcv_android_api }}core/intermediate-results/texture-detection-result-unit.html) class to set the X & Y spacing.
+- Added a new intermediate result unit, [`ShortLinesUnit`]({{ site.dcv_android_api }}core/intermediate-results/short-lines-unit.html), to output the detected short lines. The corresponding enumeration member `IntermediateResultUnitTypeShortLines` is added to the [`IntermediateResultUnitType`]({{ site.dcv_enumerations }}core/intermediate-result-unit-type.html?lang=android).
+- Added the following methods to the [`CapturedResultItem`]({{ site.dcv_android_api }}core/basic-structures/captured-result-item.html) class
+ - `getTargetROIDefName`
+ - `getTaskName`
+ - `retain`
+ - `release`
+- Added the following new error codes
+ - `EC_IMAGE_SIZE_NOT_MATCH`
+ - `EC_IMAGE_PIXEL_FORMAT_NOT_MATCH`
+ - `EC_SECTION_LEVEL_RESULT_IRREPLACEABLE`
+ - `EC_AXIS_DEFINITION_INCORRECT`
+ - `EC_TEXT_LINE_GROUP_LAYOUT_CONFLICT`
+ - `EC_TEXT_LINE_GROUP_REGEX_CONFLICT`
+- Added the following methods to the [`CapturedResult`]({{ site.dcv_android_api }}core/basic-structures/captured-result.html) class.
+ - `retain`
+ - `release`
+- Added a new supported image pixel format, binary 8 inverted. The corresponding enumeration member is added to the [`ImagePixelFormat`]({{ site.dcv_enumerations }}core/image-pixel-format.html?lang=android).
+- Added return value for the `retain` method of the [`IntermediateResultUnit`]({{ site.dcv_android_api }}core/intermediate-results/intermediate-result-unit.html) class. The method will return the pointer of the current `IntermediateResultUnit`.
+
+### Break Changes
+
+- Changed the logic of the [`stopCapturing`]({{ site.dcv_android_api }}capture-vision-router/multiple-file-processing.html#stopCapturing) method.
+ - [`CaptureResultReceiver`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/captured-result-receiver.html) will not receive results after `stopCapturing` is triggered with `waitForRemainingTasks` false.
+ - Support stop capturing after the [`pauseCapturing`]({{ site.dcv_android_api }}capture-vision-router/multiple-file-processing.html#pauseCapturing) method is triggered.
+- Changed the logic of the [`capturedResultItemTypes`]({{ site.dcv_android_api }}capture-vision-router/auxiliary-classes/simplified-capture-vision-settings.html#capturedresultitemtypes) setting of `SimplifiedCaptureVisionSettings`:
+ - If the result item types don't match the specified template, the method [`updateSettings`]({{ site.dcv_android_api }}capture-vision-router/settings.html#updatesettings) will return the error code `EC_PARAMETER_VALUE_INVALID` with the message "The captured result item types do not match the task configurations in the template".
+ - Based on the `capturedResultItemTypes` setting, the irrelevant tasks will be removed from the template.
+ - The `capturedResultItemTypes` should include at least one of the `CRIT_BARCODE`, `CRIT_TEXT_LINE`, `CRIT_DETECTED_QUAD`, `CRIT_NORMALIZED_IMAGE`. Otherwise, the method `updateSettings` will return the error code `EC_PARAMETER_VALUE_INVALID` with the message "The captured result item types should contain at least one task result type".
+- Refactored the [`Contour`]({{ site.dcv_android_api }}core/basic-structures/contour.html) class. Please view API reference - [`Contour`]({{ site.dcv_android_api }}core/basic-structures/contour.html) class for more information.
+
+### Fixed
+
+- Fixed a crash bug that might happen when triggering the [`setNextImageToReturn`]({{ site.dcv_android_api }}core/basic-structures/image-source-adapter.html#setnextimagetoreturn) method of the `ImageSourceAdapter` class.
+
## 2.0.20 (12/12/2023)
### New
diff --git a/programming/android/release-notes/index.md b/programming/android/release-notes/index.md
index bda9a0e..99ef65f 100644
--- a/programming/android/release-notes/index.md
+++ b/programming/android/release-notes/index.md
@@ -10,6 +10,7 @@ permalink: /programming/android/release-notes/index.html
# Release Notes - Android Edition
+- [2.2.10 (03/07/2024)]({{ site.android_release_notes }}android-2.html#2210-03072024)
- [2.0.20 (12/12/2023)]({{ site.android_release_notes }}android-2.html#2020-12122023)
- [2.0.10 (08/10/2023)]({{ site.android_release_notes }}android-2.html#2010-08102023)
- [1.0.30 (06/07/2023)]({{ site.android_release_notes }}android-1.html#1030-06072023)
diff --git a/programming/android/user-guide-v2.0.10.md b/programming/android/user-guide-v2.0.10.md
index 277be83..3f0c587 100644
--- a/programming/android/user-guide-v2.0.10.md
+++ b/programming/android/user-guide-v2.0.10.md
@@ -6,7 +6,7 @@ keywords: user guide, android
needAutoGenerateSidebar: true
needGenerateH4Content: true
noTitleIndex: true
-permalink: /programming/android/user-guide.html
+permalink: /programming/android/user-guide-v2.0.10.html
---
# Getting Started with Android
@@ -37,7 +37,7 @@ In this guide, you will learn step by step on how to build a document normalizat
- Supported OS: Android 5.0 (API Level 21) or higher.
- Supported ABI: **armeabi-v7a**, **arm64-v8a**, **x86** and **x86_64**.
-- Development Environment: Android Studio 3.4+ (Android Studio 4.2+ recommended).
+- Development Environment: Android Studio 2022.2.1 or higher.
## Build Your First Application
@@ -45,8 +45,10 @@ In this section, let's see how to create a HelloWorld app for normalizing docume
>Note:
>
->- Android Studio 4.2 is used here in this guide.
->- You can [get the similar source code of the HelloWorld sample here](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/android/java/HelloWorld){:target="_blank"}.
+> - Android Studio 2022.2.1 is used here in this guide.
+> - You can get the source code of the HelloWord app from the following link
+> - [Java](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/android/HelloWorld/AutoNormalize){:target="_blank"}.
+> - [Kotlin](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/android/HelloWorld/AutoNormalizeKt){:target="_blank"}.
### Create a New Project
@@ -405,4 +407,5 @@ There are two ways to add the SDK into your project - **Manually** and **Maven**
You can download the similar source code here:
-- Android source code
+- [Java](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/android/HelloWorld/AutoNormalize){:target="_blank"}.
+- [Kotlin](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/android/HelloWorld/AutoNormalizeKt){:target="_blank"}.
diff --git a/programming/android/user-guide-v2.0.20.md b/programming/android/user-guide-v2.0.20.md
new file mode 100644
index 0000000..d0b17e4
--- /dev/null
+++ b/programming/android/user-guide-v2.0.20.md
@@ -0,0 +1,414 @@
+---
+layout: default-layout
+title: Dynamsoft Document Normalizer for Android - User Guide
+description: This is the user guide of Dynamsoft Document Normalizer for Android SDK.
+keywords: user guide, android
+needAutoGenerateSidebar: true
+needGenerateH4Content: true
+noTitleIndex: true
+permalink: /programming/android/user-guide-v2.0.20.html
+---
+
+# Getting Started with Android
+
+In this guide, you will learn step by step on how to build a document normalization application with Dynamsoft Document Normalizer Android SDK.
+
+> Read more on [Dynamsoft Document Normalizer Features](https://www.dynamsoft.com/document-normalizer/docs/core/introduction/index.html)
+
+- [Getting Started with Android](#getting-started-with-android)
+ - [Requirements](#requirements)
+ - [Build Your First Application](#build-your-first-application)
+ - [Create a New Project](#create-a-new-project)
+ - [Add the SDK](#add-the-sdk)
+ - [Add the Library Manually](#add-the-library-manually)
+ - [Add the Library via Maven](#add-the-library-via-maven)
+ - [Initialize License](#initialize-license)
+ - [MainActivity for Realtime Document Normalization](#mainactivity-for-realtime-document-normalization)
+ - [Initialize Camera Module](#initialize-camera-module)
+ - [Initialize Capture Vision Router](#initialize-capture-vision-router)
+ - [Add a Captured Result Receiver and Filter](#add-a-captured-result-receiver-and-filter)
+ - [Start and Stop Video Document Normalization](#start-and-stop-video-document-normalization)
+ - [Additional Steps in MainActivity](#additional-steps-in-mainactivity)
+ - [ResultActivity for Displaying the Normalized Image](#resultactivity-for-displaying-the-normalized-image)
+ - [Display the Normalized Image](#display-the-normalized-image)
+ - [Build and Run the Project](#build-and-run-the-project)
+
+## Requirements
+
+- Supported OS: Android 5.0 (API Level 21) or higher.
+- Supported ABI: **armeabi-v7a**, **arm64-v8a**, **x86** and **x86_64**.
+- Development Environment: Android Studio 2022.2.1 or higher.
+
+## Build Your First Application
+
+In this section, let's see how to create a HelloWorld app for normalizing documents from camera video input.
+
+>Note:
+>
+> - Android Studio 2022.2.1 is used here in this guide.
+> - You can get the source code of the HelloWord app from the following link
+> - [Java](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/android/HelloWorld/AutoNormalize){:target="_blank"}.
+> - [Kotlin](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/android/HelloWorld/AutoNormalizeKt){:target="_blank"}.
+
+### Create a New Project
+
+1. Open Android Studio, select **File > New > New Project**.
+
+2. Choose the correct template for your project. In this sample, we use **Empty Activity**.
+
+3. When prompted, choose your app name 'HelloWorld' and set the **Save** location, **Language**, and **Minimum SDK** (we use 21 here).
+ > Note:
+ >
+ > - With **minSdkVersion** set to 21, your app is compatible with more than 94.1% of devices on the Google Play Store (last update: March 2021).
+
+### Add the SDK
+
+There are two ways to add the SDK into your project - **Manually** and **Maven**.
+
+#### Add the Library Manually
+
+1. Download the SDK package from the Dynamsoft website. After unzipping, You can find the following **aar** files under the **Dynamsoft\Libs** directory:
+
+ | File | Description |
+ |---------|-------------|
+ | `DynamsoftCaptureVisionRouter.aar` | The capture vision router library of Dynamsoft's capture vision SDK is used by users to interact with image processing and semantic processing products in their applications. It takes an image source as input and provides processing results, which can include final results or intermediate results. |
+ | `DynamsoftDocumentNormalizer.aar` | The document normalizer library of Dynamsoft's capture vision SDK includes document normalizer related algorithms and APIs. |
+ | `DynamsoftCore.aar` | The core library of Dynamsoft's capture vision SDK includes common basic structures and intermediate result related APIs. |
+ | `DynamsoftImageProcessing.aar` | The image processing library of Dynamsoft's capture vision SDK incorporates a collection of basic and specialized image processing algorithms designed to support other SDK modules such as Document Normalizer. |
+ | `DynamsoftLicense.aar` | The license library of Dynamsoft's capture vision SDK includes license related APIs. |
+ | `DynamsoftUtility.aar` | The utility library of Dynamsoft's Capture Vision SDK includes multiple implementations of image source adapters, image exporter, and other utility APIs. |
+ | `DynamsoftCameraEnhancer.aar` | The Dynamsoft Camera Enhancer SDK provides camera control, camera enhancements, and basic UI configuration features. |
+
+2. Copy the above five **aar** files to the target directory `HelloWorld\app\libs`
+
+3. Open the file `HelloWorld\app\build.gradle` and add reference in the dependencies:
+
+ ```groovy
+ dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.aar'])
+
+ def camerax_version = '1.1.0'
+ implementation "androidx.camera:camera-core:$camerax_version"
+ implementation "androidx.camera:camera-camera2:$camerax_version"
+ implementation "androidx.camera:camera-lifecycle:$camerax_version"
+ implementation "androidx.camera:camera-view:$camerax_version"
+ }
+ ```
+
+ > Note:
+ >
+ > DCE 4.x is based on Android CameraX, so you need to add the CameraX dependency manually.
+
+4. Click **Sync Now**. After the synchronization completes, the SDK is added to the project.
+
+#### Add the Library via Maven
+
+1. Open the file `HelloWorld\app\build.gradle` and add the remote repository:
+
+ ```groovy
+ repositories {
+ maven {
+ url "https://download2.dynamsoft.com/maven/aar"
+ }
+ }
+ ```
+
+2. Add reference in the dependencies:
+
+ ```groovy
+ dependencies {
+ implementation 'com.dynamsoft:dynamsoftcapturevisionrouter:2.0.21'
+ implementation 'com.dynamsoft:dynamsoftdocumentnormalizer:2.0.20'
+ implementation 'com.dynamsoft:dynamsoftcameraenhancer:4.0.2'
+ implementation 'com.dynamsoft:dynamsoftcore:3.0.20'
+ implementation 'com.dynamsoft:dynamsoftlicense:3.0.30'
+ implementation 'com.dynamsoft:dynamsoftimageprocessing:2.0.21'
+ implementation 'com.dynamsoft:dynamsoftutility:1.0.21'
+ }
+ ```
+
+3. Click **Sync Now**. After the synchronization completes, the SDK is added to the project.
+
+### Initialize License
+
+1. Import the `LicenseManager` class and initialize the license in the file `MyApplication.java`.
+
+ ```java
+ import com.dynamsoft.license.LicenseManager;
+
+ public class MyApplication extends Application {
+ private static final String TAG = "MyApplication";
+ private static final String LICENSE = "DLS2eyJvcmdhbml6YXRpb25JRCI6IjIwMDAwMSJ9";
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ LicenseManager.initLicense(LICENSE, this, (isSuccess, error) -> {
+ if (!isSuccess) {
+ Log.e(TAG, "InitLicense Error: " + error);
+ }
+ });
+ }
+ }
+ ```
+
+ >Note:
+ >
+ >- Network connection is required for the license to work.
+ >- The license string here will grant you a time-limited trial license.
+ >- If the license has expired, you can go to the customer portal to request for an extension.
+
+### MainActivity for Realtime Document Normalization
+
+#### Initialize Camera Module
+
+1. In the Project window, open **app > res > layout > `activity_main.xml`** and create a DCE camera view section under the root node.
+
+ ```xml
+
+
+ ```
+
+2. Import the camera module, initialize the camera view and bind to the created Camera Enhancer instance in the file `MainActivity.java`.
+
+ ```java
+ ...
+
+ import com.dynamsoft.dce.CameraView;
+ import com.dynamsoft.dce.CameraEnhancer;
+ import com.dynamsoft.dce.CameraEnhancerException;
+ import com.dynamsoft.dce.utils.PermissionUtil;
+
+ public class MainActivity extends AppCompatActivity {
+ private CameraEnhancer mCamera;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+
+ ...
+
+ CameraView cameraView = findViewById(R.id.camera_view);
+ mCamera = new CameraEnhancer(cameraView, MainActivity.this);
+
+ PermissionUtil.requestCameraPermission(MainActivity.this);
+ }
+ }
+ ```
+
+#### Initialize Capture Vision Router
+
+1. Import and initialize the capture vision router, and set the created Camera Enhancer instance as the input image source.
+
+ ```java
+ ...
+
+ import com.dynamsoft.cvr.CaptureVisionRouter;
+ import com.dynamsoft.cvr.CaptureVisionException;
+
+ public class MainActivity extends AppCompatActivity {
+
+ ...
+
+ private CaptureVisionRouter mRouter;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+
+ ...
+
+ mRouter = new CaptureVisionRouter(MainActivity.this);
+ try {
+ mRouter.setInput(mCamera);
+ } catch (CaptureVisionRouterException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ ```
+
+#### Add a Captured Result Receiver and Filter
+
+1. Add a result receiver to get the normalized image results.
+
+ ```java
+ ...
+
+ import com.dynamsoft.core.basic_structures.CapturedResultReceiver;
+ import com.dynamsoft.core.basic_structures.ImageData;
+ import com.dynamsoft.cvr.EnumPresetTemplate;
+ import com.dynamsoft.ddn.NormalizedImagesResult;
+
+ public class MainActivity extends AppCompatActivity {
+
+ ...
+
+ public static ImageData mNormalizedImageData;
+ private boolean mJumpToOtherActivity = false;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+
+ ...
+
+ mRouter.addResultReceiver(new CapturedResultReceiver() {
+ @Override
+ public void onNormalizedImagesReceived(NormalizedImagesResult result) {
+ if (mJumpToOtherActivity && result.getItems().length > 0) {
+ mJumpToOtherActivity = false;
+
+ mNormalizedImageData = result.getItems()[0].getImageData();
+
+ Intent intent = new Intent(MainActivity.this, ResultActivity.class);
+ startActivity(intent);
+ }
+ }
+ });
+ }
+ }
+ ```
+
+2. Add a result cross filter to validate the normalized image result across multiple frames.
+
+ ```java
+ ...
+
+ import com.dynamsoft.utility.MultiFrameResultCrossFilter;
+
+ public class MainActivity extends AppCompatActivity {
+
+ ...
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+
+ ...
+
+ MultiFrameResultCrossFilter filter = new MultiFrameResultCrossFilter();
+ filter.enableResultCrossVerification(CRIT_NORMALIZED_IMAGE, true);
+ mRouter.addResultFilter(filter);
+ }
+ }
+ ```
+
+#### Start and Stop Video Document Normalization
+
+1. Override the `MainActivity.onResume` function to open camera and start video document normalization, override the `MainActivity.onPause` function to close camera and stop video document normalization.
+
+ ```java
+ public class MainActivity extends AppCompatActivity {
+
+ ...
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ try {
+ mCamera.open();
+ mRouter.startCapturing(EnumPresetTemplate.PT_DETECT_AND_NORMALIZE_DOCUMENT);
+ } catch (CameraEnhancerException | CaptureVisionRouterException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ try {
+ mCamera.close();
+ } catch (CameraEnhancerException e) {
+ e.printStackTrace();
+ }
+
+ mRouter.stopCapturing();
+ }
+ }
+ ```
+
+2. Add `onCaptureBtnClick` function to start the video document normalization. After start capturing, the SDK will process the video frames from the Camera Enhancer, then send the normalized image results to the registered result receiver.
+
+ ```java
+ public class MainActivity extends AppCompatActivity {
+
+ ...
+
+ public void onCaptureBtnClick(View v) {
+ mJumpToOtherActivity = true;
+ }
+ }
+ ```
+
+#### Additional Steps in MainActivity
+
+1. In the Project window, open **app > res > layout > `activity_main.xml`**, create a button under the root node to capture the quads detected on the image.
+
+ ```xml
+ ...
+
+
+ ```
+
+### ResultActivity for Displaying the Normalized Image
+
+#### Display the Normalized Image
+
+1. Create a new empty activity named `ResultActivity`.
+
+2. In the Project window, open **app > res > layout > `activity_result.xml`**, create a image view under the root node to display the result image.
+
+ ```xml
+
+ ```
+
+3. Display the normalized image.
+
+ ```java
+ import com.dynamsoft.core.basic_structures.CoreException;
+
+ public class ResultActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_result);
+
+ ImageView ivNormalize = findViewById(R.id.iv_normalize);
+
+ try {
+ ivNormalize.setImageBitmap(MainActivity.mNormalizedImageData.toBitmap());
+ } catch (CoreException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ ```
+
+### Build and Run the Project
+
+1. Select the device that you want to run your app on from the target device drop-down menu in the toolbar.
+
+2. Click the **Run app** button, then Android Studio installs your app on your connected device and starts it.
+
+You can download the similar source code here:
+
+- [Java](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/android/HelloWorld/AutoNormalize){:target="_blank"}.
+- [Kotlin](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/android/HelloWorld/AutoNormalizeKt){:target="_blank"}.
diff --git a/programming/android/user-guide.md b/programming/android/user-guide.md
index 81a6518..f0e437d 100644
--- a/programming/android/user-guide.md
+++ b/programming/android/user-guide.md
@@ -37,7 +37,7 @@ In this guide, you will learn step by step on how to build a document normalizat
- Supported OS: Android 5.0 (API Level 21) or higher.
- Supported ABI: **armeabi-v7a**, **arm64-v8a**, **x86** and **x86_64**.
-- Development Environment: Android Studio 3.4+ (Android Studio 4.2+ recommended).
+- Development Environment: Android Studio 2022.2.1 or higher.
## Build Your First Application
@@ -45,8 +45,10 @@ In this section, let's see how to create a HelloWorld app for normalizing docume
>Note:
>
->- Android Studio 4.2 is used here in this guide.
->- You can [get the similar source code of the HelloWorld sample here](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/android/java/HelloWorld){:target="_blank"}.
+> - Android Studio 2022.2.1 is used here in this guide.
+> - You can get the source code of the HelloWord app from the following link
+> - [Java](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/android/HelloWorld/AutoNormalize){:target="_blank"}.
+> - [Kotlin](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/android/HelloWorld/AutoNormalizeKt){:target="_blank"}.
### Create a New Project
@@ -65,19 +67,19 @@ There are two ways to add the SDK into your project - **Manually** and **Maven**
#### Add the Library Manually
-1. Download the SDK package from the Dynamsoft website. After unzipping, You can find the following **aar** files under the **Dynamsoft\Libs** directory:
+1. Download the SDK package from the Dynamsoft website. After unzipping, You can find the following **aar** files under the **Dynamsoft\Libs** directory:
| File | Description |
|---------|-------------|
- | `DynamsoftCaptureVisionRouter.aar` | The capture vision router library of Dynamsoft's capture vision SDK is used by users to interact with image processing and semantic processing products in their applications. It takes an image source as input and provides processing results, which can include final results or intermediate results. |
- | `DynamsoftDocumentNormalizer.aar` | The document normalizer library of Dynamsoft's capture vision SDK includes document normalizer related algorithms and APIs. |
- | `DynamsoftCore.aar` | The core library of Dynamsoft's capture vision SDK includes common basic structures and intermediate result related APIs. |
- | `DynamsoftImageProcessing.aar` | The image processing library of Dynamsoft's capture vision SDK incorporates a collection of basic and specialized image processing algorithms designed to support other SDK modules such as Document Normalizer. |
- | `DynamsoftLicense.aar` | The license library of Dynamsoft's capture vision SDK includes license related APIs. |
- | `DynamsoftUtility.aar` | The utility library of Dynamsoft's Capture Vision SDK includes multiple implementations of image source adapters, image exporter, and other utility APIs. |
- | `DynamsoftCameraEnhancer.aar` | The Dynamsoft Camera Enhancer SDK provides camera control, camera enhancements, and basic UI configuration features. |
+ | `DynamsoftDocumentNormalizer.aar` | The Dynamsoft Document Normalizer SDK which includes the document normalizer related APIs. |
+ | `DynamsoftCore.aar` | The core library of the Dynamsoft Capture Vision SDK which includes basic structures and intermediate result related APIs. |
+ | `DynamsoftCaptureVisionRouter.aar` | The CaptureVisionRouter is used to coordinate the image-processing and semantic-processing products that are being used in the application. It accepts an image source and returns processing results which may contain final results or intermediate results. |
+ | `DynamsoftImageProcessing.aar` | The image processing library of the Dynamsoft Capture Vision SDK, and so includes the image processing algorithms and APIs. |
+ | `DynamsoftLicense.aar` | This module includes the licensing API. |
+ | `DynamsoftCameraEnhancer.aar` | The [Dynamsoft Camera Enhancer SDK]({{ site.dce_android_api }}) defines the camera control and frame preprocessing API. |
+ | `DynamsoftUtility.aar (Optional)` | The module includes functional APIs that support you to integrate the input, filtering the results, generating result images, etc. |
-2. Copy the above five **aar** files to the target directory `HelloWorld\app\libs`
+2. Copy the above six (seven if the Utility is included) **aar** files to the target directory `HelloWorld\app\libs`
3. Open the file `HelloWorld\app\build.gradle` and add reference in the dependencies:
@@ -115,13 +117,13 @@ There are two ways to add the SDK into your project - **Manually** and **Maven**
```groovy
dependencies {
- implementation 'com.dynamsoft:dynamsoftcapturevisionrouter:2.0.21'
- implementation 'com.dynamsoft:dynamsoftdocumentnormalizer:2.0.20'
- implementation 'com.dynamsoft:dynamsoftcameraenhancer:4.0.2'
- implementation 'com.dynamsoft:dynamsoftcore:3.0.20'
- implementation 'com.dynamsoft:dynamsoftlicense:3.0.30'
- implementation 'com.dynamsoft:dynamsoftimageprocessing:2.0.21'
- implementation 'com.dynamsoft:dynamsoftutility:1.0.21'
+ implementation 'com.dynamsoft:dynamsoftcapturevisionrouter:2.2.10'
+ implementation 'com.dynamsoft:dynamsoftdocumentnormalizer:2.2.10'
+ implementation 'com.dynamsoft:dynamsoftcameraenhancer:4.2.0'
+ implementation 'com.dynamsoft:dynamsoftcore:3.2.10'
+ implementation 'com.dynamsoft:dynamsoftlicense:3.2.10'
+ implementation 'com.dynamsoft:dynamsoftimageprocessing:2.2.10'
+ implementation 'com.dynamsoft:dynamsoftutility:1.2.10'
}
```
@@ -154,7 +156,7 @@ There are two ways to add the SDK into your project - **Manually** and **Maven**
>
>- Network connection is required for the license to work.
>- The license string here will grant you a time-limited trial license.
- >- If the license has expired, you can go to the customer portal to request for an extension.
+ >- If the license has expired, you can go to the customer portal to request for an extension.
### MainActivity for Realtime Document Normalization
@@ -163,7 +165,7 @@ There are two ways to add the SDK into your project - **Manually** and **Maven**
1. In the Project window, open **app > res > layout > `activity_main.xml`** and create a DCE camera view section under the root node.
```xml
-
-
+
```
2. Import the camera module, initialize the camera view and bind to the created Camera Enhancer instance in the file `MainActivity.java`.
@@ -408,4 +410,5 @@ There are two ways to add the SDK into your project - **Manually** and **Maven**
You can download the similar source code here:
-- Android source code
+- [Java](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/android/HelloWorld/AutoNormalize){:target="_blank"}.
+- [Kotlin](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/android/HelloWorld/AutoNormalizeKt){:target="_blank"}.
diff --git a/programming/ios/api-reference/candidate-quad-edges-unit-v2.0.20.md b/programming/ios/api-reference/candidate-quad-edges-unit-v2.0.20.md
new file mode 100644
index 0000000..dc0608d
--- /dev/null
+++ b/programming/ios/api-reference/candidate-quad-edges-unit-v2.0.20.md
@@ -0,0 +1,53 @@
+---
+layout: default-layout
+title: DSCandidateQuadEdgesUnit - Dynamsoft Document Normalizer SDK API Reference
+description: The class DSCandidateQuadEdgesUnit represents an intermediate result unit whose type is candidate quad edges.
+keywords: candidate quad edges, intermediate result unit, objective-c, swift
+needGenerateH3Content: true
+needAutoGenerateSidebar: true
+noTitleIndex: true
+---
+
+# DSCandidateQuadEdgesUnit
+
+The `DSCandidateQuadEdgesUnit` class represents an intermediate result unit whose type is candidate quad edges.
+
+## Definition
+
+*Assembly:* DynamsoftDocumentNormalizer.framework
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+@interface DSCandidateQuadEdgesUnit: DSIntermediateResultUnit
+```
+2.
+```swift
+class CandidateQuadEdgesUnit: IntermediateResultUnit
+```
+
+## Attributes
+
+| Attributes | Type | Description |
+| ---------- | ---- | ----------- |
+| [`candidateQuadEdges`](#candidatequadedges) | *NSArray<DSEdge \* > \** | An array of edges. It includes all edges that candidate quadrilaterals assembling. |
+
+### candidateQuadEdges
+
+An array of edges. It includes all edges that candidate quadrilaterals assembling.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+@property (nonatomic, nullable, copy) NSArray * candidateQuadEdges;
+```
+2.
+```swift
+var candidateQuadEdges: [Edge]? { get set }
+```
diff --git a/programming/ios/api-reference/candidate-quad-edges-unit.md b/programming/ios/api-reference/candidate-quad-edges-unit.md
index dc0608d..8595d5f 100644
--- a/programming/ios/api-reference/candidate-quad-edges-unit.md
+++ b/programming/ios/api-reference/candidate-quad-edges-unit.md
@@ -29,15 +29,21 @@ The `DSCandidateQuadEdgesUnit` class represents an intermediate result unit whos
class CandidateQuadEdgesUnit: IntermediateResultUnit
```
-## Attributes
+## Methods
-| Attributes | Type | Description |
-| ---------- | ---- | ----------- |
-| [`candidateQuadEdges`](#candidatequadedges) | *NSArray<DSEdge \* > \** | An array of edges. It includes all edges that candidate quadrilaterals assembling. |
+| Methods | Description |
+| ------- | ----------- |
+| [`getCandidateQuadEdges`](#getcandidatequadedges) | Get an array of edges. It includes all edges that candidate quadrilaterals assembling. |
+| [`getCount`](#getcount) | Get the number of edges. |
+| [`getCandidateQuadEdge`](#getcandidatequadedge) | Get an edge. |
+| [`removeAllCandidateQuadEdges`](#removeallcandidatequadedges) | Remove all edges. |
+| [`removeCandidateQuadEdge`](#removecandidatequadedge) | Remove an edge. |
+| [`addCandidateQuadEdge`](#addcandidatequadedge) | Add an edge. |
+| [`setCandidateQuadEdge`](#setcandidatequadedge) | Set an edge. |
-### candidateQuadEdges
+### getCandidateQuadEdges
-An array of edges. It includes all edges that candidate quadrilaterals assembling.
+Get an array of edges. It includes all edges that candidate quadrilaterals assembling.
>- Objective-C
@@ -45,9 +51,160 @@ An array of edges. It includes all edges that candidate quadrilaterals assemblin
>
>1.
```objc
-@property (nonatomic, nullable, copy) NSArray * candidateQuadEdges;
+-(nullable NSArray *)getCandidateQuadEdges;
```
2.
```swift
-var candidateQuadEdges: [Edge]? { get set }
+func getCandidateQuadEdges() -> [DSEdge]?
```
+
+**Return Value**
+
+Returns an array of edges.
+
+### getCount
+
+Get the number of edges.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(NSInteger)getCount;
+```
+2.
+```swift
+func getCount() -> NSInteger
+```
+
+**Return Value**
+
+Returns the number of edges.
+
+### getCandidateQuadEdge
+
+Get the `DSEdge` object at the specified index.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(nullable DSEdge *)getCandidateQuadEdge:(NSInteger)index;
+```
+2.
+```swift
+func getCandidateQuadEdge(_ index: Int) -> DSEdge?
+```
+
+**Parameters**
+
+`[in] index`: The index of the edge.
+
+**Return Value**
+
+Returns the `DSEdge` object as the specified edge.
+
+### removeAllCandidateQuadEdges
+
+Remove all edges.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(void)removeAllCandidateQuadEdges;
+```
+2.
+```swift
+func removeAllCandidateQuadEdges()
+```
+
+### removeCandidateQuadEdge
+
+Remove the `DSEdge` object at the specified index.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(NSInteger)removeCandidateQuadEdge:(NSInteger)index;
+```
+2.
+```swift
+func removeCandidateQuadEdge(_ index: Int) -> NSInteger
+```
+
+**Parameters**
+
+`[in] index`: The index of the edge.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. Otherwise, returns 0.
+
+### addCandidateQuadEdge
+
+Add an edge.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(NSInteger)addCandidateQuadEdge:(DSEdge *)edge
+ matrixToOriginalImage:(CGAffineTransform)matrixToOriginalImage;
+```
+2.
+```swift
+func addCandidateQuadEdge(_ edge: DSEdge, matrixToOriginalImage: CGAffineTransform) -> NSInteger
+```
+
+**Parameters**
+
+`[in] edge`: The edge to be added.
+
+`[in] matrixToOriginalImage`: The matrix to the original image.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. Otherwise, returns 0.
+
+### setCandidateQuadEdge
+
+Set the `DSEdge` object at the specified index.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(NSInteger)setCandidateQuadEdge:(NSInteger)index
+ edge:(DSEdge *)edge
+ matrixToOriginalImage:(CGAffineTransform)matrixToOriginalImage;
+```
+2.
+```swift
+func setCandidateQuadEdge(_ index: Int, edge: DSEdge, matrixToOriginalImage: CGAffineTransform) -> NSInteger
+```
+
+**Parameters**
+
+`[in] index`: The index of the edge.
+
+`[in] edge`: The edge to be set.
+
+`[in] matrixToOriginalImage`: The matrix to the original image.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. Otherwise, returns 0.
diff --git a/programming/ios/api-reference/corners-unit-v2.0.20.md b/programming/ios/api-reference/corners-unit-v2.0.20.md
new file mode 100644
index 0000000..3f95a8f
--- /dev/null
+++ b/programming/ios/api-reference/corners-unit-v2.0.20.md
@@ -0,0 +1,53 @@
+---
+layout: default-layout
+title: DSCornersUnit - Dynamsoft Document Normalizer module iOS Edition API Reference
+description: The class DSCornersUnit of Dynamsoft Document Normalizer module represents an intermediate result unit whose type is corners.
+keywords: corners unit, objective-c, swift
+needGenerateH3Content: true
+needAutoGenerateSidebar: true
+noTitleIndex: true
+---
+
+# DSCornersUnit
+
+The `DSCornersUnit` class represents an intermediate result unit whose type is corners.
+
+## Definition
+
+*Assembly:* DynamsoftDocumentNormalizer.framework
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+@interface DSCornersUnit : DSIntermediateResultUnit
+```
+2.
+```swift
+class CornersUnit : IntermediateResultUnit
+```
+
+## Attributes
+
+| Attributes | Type | Description |
+| ---------- | ---- | ----------- |
+| [`corners`](#corners) | *NSArray \** | An array of corners. It includes all corners that participate quadrilaterals assembling. |
+
+### corners
+
+An array of corners. It includes all corners that participate quadrilaterals assembling.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+@property(nonatomic, copy, nullable) NSArray *corners
+```
+2.
+```swift
+var corners: [Corner]? { get set }
+```
diff --git a/programming/ios/api-reference/corners-unit.md b/programming/ios/api-reference/corners-unit.md
index 3f95a8f..1580d25 100644
--- a/programming/ios/api-reference/corners-unit.md
+++ b/programming/ios/api-reference/corners-unit.md
@@ -29,15 +29,21 @@ The `DSCornersUnit` class represents an intermediate result unit whose type is c
class CornersUnit : IntermediateResultUnit
```
-## Attributes
+## Methods
-| Attributes | Type | Description |
-| ---------- | ---- | ----------- |
-| [`corners`](#corners) | *NSArray \** | An array of corners. It includes all corners that participate quadrilaterals assembling. |
+| Methods | Description |
+| ---------- | ----------- |
+| [`getCorners`](#getcorners) | Get an array of corners. It includes all corners that participate quadrilaterals assembling. |
+| [`getCount`](#getcount) | Get the number of corners. |
+| [`getCorner`](#getcorner) | Get a corner. |
+| [`removeAllCorners`](#removeallcorners) | Remove all corners. |
+| [`removeCorner`](#removecorner) | Remove a corner. |
+| [`addCorner`](#addcorner) | Add a corner. |
+| [`setCorner`](#setcorner) | Set a corner. |
-### corners
+### getCorners
-An array of corners. It includes all corners that participate quadrilaterals assembling.
+Get an array of `DSCorner` that represent all the assembled corners. The corners will participate assembling.
>- Objective-C
@@ -45,9 +51,160 @@ An array of corners. It includes all corners that participate quadrilaterals ass
>
>1.
```objc
-@property(nonatomic, copy, nullable) NSArray *corners
+-(nullable NSArray*)getCorners;
```
2.
```swift
-var corners: [Corner]? { get set }
+func getCorners() -> [Corner]?
```
+
+**Return Value**
+
+An array of `DSCorner` as the assembled corners.
+
+### getCount
+
+Get the number of corners.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(NSInteger)getCount;
+```
+2.
+```swift
+func getCount() -> Int
+```
+
+**Return Value**
+
+The number of corners.
+
+### getCorner
+
+Get the corner at the specified index.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(nullable DSCorner*)getCorner:(NSInteger)index;
+```
+2.
+```swift
+func getCorner(_ index: Int) -> Corner?
+```
+
+**Parameters**
+
+`[in] index`: The index of the corner.
+
+**Return Value**
+
+The corner at the specified index.
+
+### removeAllCorners
+
+Remove all corners.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(void)removeAllCorners;
+```
+2.
+```swift
+func removeAllCorners()
+```
+
+### removeCorner
+
+Remove the corner at the specified index.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(NSInteger)removeCorner:(NSInteger)index;
+```
+2.
+```swift
+func removeCorner(_ index: Int) -> Int
+```
+
+**Parameters**
+
+`[in] index`: The index of the corner to be removed.
+
+**Return Value**
+
+The index of the removed corner.
+
+### addCorner
+
+Add a corner.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(NSInteger)addCorner:(DSCorner*)corner
+matrixToOriginalImage:(CGAffineTransform)matrixToOriginalImage;
+```
+2.
+```swift
+func addCorner(_ corner: Corner, matrixToOriginalImage: CGAffineTransform) -> Int
+```
+
+**Parameters**
+
+`[in] corner`: The corner to be added.
+
+`[in] matrixToOriginalImage`: The matrix to the original image.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. Otherwise, returns 0.
+
+### setCorner
+
+Set the corner at the specified index.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(NSInteger)setCorner:(NSInteger)index
+ corner:(DSCorner*)corner
+matrixToOriginalImage:(CGAffineTransform)matrixToOriginalImage;
+```
+2.
+```swift
+func setCorner(_ index: Int, corner: Corner, matrixToOriginalImage: CGAffineTransform) -> Int
+```
+
+**Parameters**
+
+`[in] index`: The index of the corner to be set.
+
+`[in] corner`: The corner to be set.
+
+`[in] matrixToOriginalImage`: The matrix to the original image.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. Otherwise, returns 0.
diff --git a/programming/ios/api-reference/detected-quads-unit-v2.0.20.md b/programming/ios/api-reference/detected-quads-unit-v2.0.20.md
new file mode 100644
index 0000000..808486c
--- /dev/null
+++ b/programming/ios/api-reference/detected-quads-unit-v2.0.20.md
@@ -0,0 +1,53 @@
+---
+layout: default-layout
+title: DSDetectedQuadsUnit - Dynamsoft Document Normalizer module iOS Edition API Reference
+description: The class DSDetectedQuadsUnit of Dynamsoft Document Normalizer module represents an intermediate result unit whose type is detected quads. It is inherited from the DSIntermediateResultUnit class.
+keywords: detected quads, objective-c, swift
+needGenerateH3Content: true
+needAutoGenerateSidebar: true
+noTitleIndex: true
+---
+
+# DSDetectedQuadsUnit
+
+The `DSDetectedQuadsUnit` class represents an intermediate result unit whose type is detected quads. It is inherited from the `DSIntermediateResultUnit` class.
+
+## Definition
+
+*Assembly:* DynamsoftDocumentNormalizer.framework
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+@interface DSDetectedQuadsUnit : DSIntermediateResultUnit
+```
+2.
+```swift
+class DetectedQuadsUnit : IntermediateResultUnit
+```
+
+## Attributes
+
+| Attributes | Type | Description |
+| ---------- | ---- | ----------- |
+| [`detectedQuads`](#detectedquads) | *NSArray \** | An array of `DSDetectedQuadElement`. Each `DSDetectedQuadElement` contains the information of a single detected quadrilateral. |
+
+### detectedQuads
+
+An array of `DSDetectedQuadElement`. Each `DSDetectedQuadElement` contains the information of a single detected quadrilateral.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+@property (nonatomic, nullable, copy) NSArray* detectedQuads;
+```
+2.
+```swift
+var detectedQuads: [DetectedQuadElement]? { get set }
+```
diff --git a/programming/ios/api-reference/detected-quads-unit.md b/programming/ios/api-reference/detected-quads-unit.md
index 808486c..790838e 100644
--- a/programming/ios/api-reference/detected-quads-unit.md
+++ b/programming/ios/api-reference/detected-quads-unit.md
@@ -29,15 +29,21 @@ The `DSDetectedQuadsUnit` class represents an intermediate result unit whose typ
class DetectedQuadsUnit : IntermediateResultUnit
```
-## Attributes
+## Methods
-| Attributes | Type | Description |
-| ---------- | ---- | ----------- |
-| [`detectedQuads`](#detectedquads) | *NSArray \** | An array of `DSDetectedQuadElement`. Each `DSDetectedQuadElement` contains the information of a single detected quadrilateral. |
+| Methods | Description |
+| ------- | ----------- |
+| [`getDetectedQuads`](#getdetectedquads) | Get an array of `DSDetectedQuadElement` that represent all the detected quadrilaterals. |
+| [`getCount`](#getcount) | Get the number of detected quadrilaterals. |
+| [`getDetectedQuad`](#getdetectedquad) | Get the `DSDetectedQuadElement` at the specified index. |
+| [`removeAllDetectedQuads`](#removealldetectedquads) | Remove all detected quadrilaterals. |
+| [`removeDetectedQuad`](#removedetectedquad) | Remove the `DSDetectedQuadElement` at the specified index. |
+| [`addDetectedQuad`](#adddetectedquad) | Add a new `DSDetectedQuadElement` to the unit. |
+| [`setDetectedQuad`](#setdetectedquad) | Set the `DSDetectedQuadElement` at the specified index. |
-### detectedQuads
+### getDetectedQuads
-An array of `DSDetectedQuadElement`. Each `DSDetectedQuadElement` contains the information of a single detected quadrilateral.
+Get an array of `DSDetectedQuadElement` that represent all the detected quadrilaterals.
>- Objective-C
@@ -45,9 +51,160 @@ An array of `DSDetectedQuadElement`. Each `DSDetectedQuadElement` contains the i
>
>1.
```objc
-@property (nonatomic, nullable, copy) NSArray* detectedQuads;
+-(nullable NSArray*)getDetectedQuads;
```
2.
```swift
-var detectedQuads: [DetectedQuadElement]? { get set }
+func getDetectedQuads() -> [DetectedQuadElement]?
```
+
+**Return Value**
+
+An array of `DSDetectedQuadElement` that represent all the detected quadrilaterals.
+
+### getCount
+
+Get the number of detected quadrilaterals.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(NSInteger)getCount;
+```
+2.
+```swift
+func getCount() -> Int
+```
+
+**Return Value**
+
+The number of detected quadrilaterals.
+
+### getDetectedQuad
+
+Get the `DSDetectedQuadElement` at the specified index.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(nullable DSDetectedQuadElement*)getDetectedQuad:(NSInteger)index;
+```
+2.
+```swift
+func getDetectedQuad(index: Int) -> DetectedQuadElement?
+```
+
+**Parameters**
+
+`[in] index`: The index of the detected quadrilateral.
+
+**Return Value**
+
+The `DSDetectedQuadElement` object at the specified index. If the index is out of range, `nil` will be returned.
+
+### removeAllDetectedQuads
+
+Remove all detected quadrilaterals.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(void)removeAllDetectedQuads;
+```
+2.
+```swift
+func removeAllDetectedQuads()
+```
+
+### removeDetectedQuad
+
+Remove the `DSDetectedQuadElement` at the specified index.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(NSInteger)removeDetectedQuad:(NSInteger)index;
+```
+2.
+```swift
+func removeDetectedQuad(_ index: Int) -> Int
+```
+
+**Parameters**
+
+`[in] index`: The index of the detected quadrilateral.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. Otherwise, returns 0.
+
+### addDetectedQuad
+
+Add a new `DSDetectedQuadElement` to the unit.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(NSInteger)addDetectedQuad:(DSDetectedQuadElement*)element
+ matrixToOriginalImage:(CGAffineTransform)matrixToOriginalImage;
+```
+2.
+```swift
+func addDetectedQuad(_ element: DetectedQuadElement, matrixToOriginalImage: CGAffineTransform) -> Int
+```
+
+**Parameters**
+
+`[in] element`: The detected quadrilateral to be added.
+
+`[in] matrixToOriginalImage`: The matrix to the original image.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. Otherwise, returns 0.
+
+### setDetectedQuad
+
+Set the `DSDetectedQuadElement` at the specified index.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(NSInteger)setDetectedQuad:(NSInteger)index
+ element:(DSDetectedQuadElement*)element
+ matrixToOriginalImage:(CGAffineTransform)matrixToOriginalImage;
+```
+2.
+```swift
+func setDetectedQuad(_ index: Int, element: DetectedQuadElement, matrixToOriginalImage: CGAffineTransform) -> Int
+```
+
+**Parameters**
+
+`[in] index`: The index of the detected quadrilateral.
+
+`[in] element`: The detected quadrilateral to be set.
+
+`[in] matrixToOriginalImage`: The matrix to the original image.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. Otherwise, returns 0.
diff --git a/programming/ios/api-reference/index-v2.0.20.md b/programming/ios/api-reference/index-v2.0.20.md
new file mode 100644
index 0000000..f6d3b83
--- /dev/null
+++ b/programming/ios/api-reference/index-v2.0.20.md
@@ -0,0 +1,176 @@
+---
+layout: default-layout
+title: Dynamsoft Document Normalizer iOS API Reference - Main Page
+description: This is the main page of Dynamsoft Document Normalizer SDK API Reference for iOS.
+keywords: api reference, iOS
+permalink: /programming/ios/api-reference/index-v2.0.20.html
+---
+
+# API Reference - iOS
+
+## DynamsoftCaptureVisionRouter
+
+### CaptureVisionRouter Class
+
+- [`DSCaptureVisionRouter`]({{ site.dcv_ios_api }}capture-vision-router/capture-vision-router.html)
+
+### Auxiliary Classes
+
+- [`DSCaptureVisionRouterModule`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/capture-vision-router-module.html)
+- [`DSSimplifiedCaptureVisionSettings`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/simplified-capture-vision-settings.html)
+
+### Interfaces
+
+- [`DSCaptureStateListener`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/capture-state-listener.html)
+- [`DSImageSourceStateListener`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/image-source-state-listener.html)
+
+### Enumerations
+
+- [`DSCaptureState`]({{ site.dcv_enumerations }}capture-vision-router/capture-state.html?lang=objc,swift)
+- [`DSPresetTemplate`]({{ site.dcv_enumerations }}capture-vision-router/preset-template.html?lang=objc,swift)
+
+## DynamsoftDocumentNormalizer
+
+### Classes
+
+- [`DSCandidateQuadEdgesUnit`]({{ site.ddn_ios_api }}candidate-quad-edges-unit.html)
+- [`DSCornersUnit`]({{ site.ddn_ios_api }}corners-unit.html)
+- [`DSDetectedQuadElement`]({{ site.ddn_ios_api }}detected-quad-element.html)
+- [`DSDetectedQuadResultItem`]({{ site.ddn_ios_api }}detected-quad-result-item.html)
+- [`DSDetectedQuadsResult`]({{ site.ddn_ios_api }}detected-quads-result.html)
+- [`DSDetectedQuadsUnit`]({{ site.ddn_ios_api }}detected-quads-unit.html)
+- [`DSDocumentNormalizerModule`]({{ site.ddn_ios_api }}document-normalizer-module.html)
+- [`DSLongLinesUnit`]({{ site.ddn_ios_api }}long-lines-unit.html)
+- [`DSNormalizedImageElement`]({{ site.ddn_ios_api }}normalized-image-element.html)
+- [`DSNormalizedImageResultItem`]({{ site.ddn_ios_api }}normalized-image-result-item.html)
+- [`DSNormalizedImagesResult`]({{ site.ddn_ios_api }}normalized-images-result.html)
+- [`DSNormalizedImageUnit`]({{ site.ddn_ios_api }}normalized-image-unit.html)
+
+## DynamsoftCore
+
+### Classes
+
+- [`DSBinaryImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/binary-image-unit.html)
+- [`DSCapturedResultFilter`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/captured-result-filter.html)
+- [`DSCapturedResultItem`]({{ site.dcv_ios_api }}core/basic-structures/captured-result-item.html)
+- [`DSCapturedResultReceiver`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/captured-result-receiver.html)
+- [`DSCapturedResult`]({{ site.dcv_ios_api }}core/basic-structures/captured-result.html)
+- [`DSColourImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/colour-image-unit.html)
+- [`DSContoursUnit`]({{ site.dcv_ios_api }}core/intermediate-results/contours-unit.html)
+- [`DSContour`]({{ site.dcv_ios_api }}core/basic-structures/contour.html)
+- [`DSCoreModule`]({{ site.dcv_ios_api }}core/basic-structures/core-module.html)
+- [`DSCorner`]({{ site.dcv_ios_api }}core/basic-structures/corner.html)
+- [`DSDSRect`]({{ site.dcv_ios_api }}core/basic-structures/rect.html)
+- [`DSEdge`]({{ site.dcv_ios_api }}core/basic-structures/edge.html)
+- [`DSEnhancedGrayscaleImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/enhanced-grayscale-image-unit.html)
+- [`DSFileImageTag`]({{ site.dcv_ios_api }}core/basic-structures/file-image-tag.html)
+- [`DSGrayscaleImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/grayscale-image-unit.html)
+- [`DSImageData`]({{ site.dcv_ios_api }}core/basic-structures/image-data.html)
+- [`DSImageSourceAdapter`]({{ site.dcv_ios_api }}core/basic-structures/image-source-adapter.html)
+- [`DSImageTag`]({{ site.dcv_ios_api }}core/basic-structures/image-tag.html)
+- [`DSIntermediateResultExtraInfo`]({{ site.dcv_ios_api }}core/intermediate-results/intermediate-result-extra-info.html)
+- [`DSIntermediateResultManager`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/intermediate-result-manager.html)
+- [`DSIntermediateResultReceiver`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/intermediate-result-receiver.html)
+- [`DSIntermediateResultUnit`]({{ site.dcv_ios_api }}core/intermediate-results/intermediate-result-unit.html)
+- [`DSIntermediateResult`]({{ site.dcv_ios_api }}core/intermediate-results/intermediate-result.html)
+- [`DSLineSegmentsUnit`]({{ site.dcv_ios_api }}core/intermediate-results/line-segments-unit.html)
+- [`DSLineSegment`]({{ site.dcv_ios_api }}core/basic-structures/line-segment.html)
+- [`DSObservationParameters`]({{ site.dcv_ios_api }}core/intermediate-results/observation-parameters.html)
+- [`DSOriginalImageResultItem`]({{ site.dcv_ios_api }}core/basic-structures/original-image-result-item.html)
+- [`DSPredetectedRegionElement`]({{ site.dcv_ios_api }}core/intermediate-results/predetected-region-element.html)
+- [`DSPredetectedRegionsUnit`]({{ site.dcv_ios_api }}core/intermediate-results/predetected-regions-unit.html)
+- [`DSQuadrilateral`]({{ site.dcv_ios_api }}core/basic-structures/quadrilateral.html)
+- [`DSRegionObjectElement`]({{ site.dcv_ios_api }}core/intermediate-results/region-object-element.html)
+- [`DSScaledDownColourImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/scaled-down-colour-image-unit.html)
+- [`DSTextRemovedBinaryImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/text-removed-binary-image-unit.html)
+- [`DSTextureDetectionResultUnit`]({{ site.dcv_ios_api }}core/intermediate-results/texture-detection-result-unit.html)
+- [`DSTextureRemovedBinaryImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/texture-removed-binary-image-unit.html)
+- [`DSTextureRemovedGrayscaleImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/texture-removed-grayscale-image-unit.html)
+- [`DSTextZonesUnit`]({{ site.dcv_ios_api }}core/intermediate-results/text-zones-unit.html)
+- [`DSTransformedGrayscaleImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/transformed-grayscale-image-unit.html)
+- [`DSVector4`]({{ site.dcv_ios_api }}core/basic-structures/vector4.html)
+- [`DSVideoFrameTag`]({{ site.dcv_ios_api }}core/basic-structures/video-frame-tag.html)
+
+### Interfaces
+
+- [`DSImageSourceErrorListener`]({{ site.dcv_ios_api }}core/basic-structures/image-source-error-listener.html)
+
+### Enumerations
+
+- [`DSBufferOverflowProtectionMode`]({{ site.dcv_enumerations }}core/buffer-overflow-protection-mode.html?lang=objc,swift)
+- [`DSCapturedResultItemType`]({{ site.dcv_enumerations }}core/captured-result-item-type.html?lang=objc,swift)
+- [`DSColourChannelUsageType`]({{ site.dcv_enumerations }}core/colour-channel-usage-type.html?lang=objc,swift)
+- [`DSCornerType`]({{ site.dcv_enumerations }}core/corner-type.html?lang=objc,swift)
+- [`DSErrorCode`]({{ site.dcv_enumerations }}core/error-code.html?lang=objc,swift)
+- [`DSGrayscaleEnhancementMode`]({{ site.dcv_enumerations }}core/grayscale-enhancement-mode.html?lang=objc,swift)
+- [`DSGrayscaleTransformationMode`]({{ site.dcv_enumerations }}core/grayscale-transformation-mode.html?lang=objc,swift)
+- [`DSImageCaptureDistanceMode`]({{ site.dcv_enumerations }}core/image-capture-distance-mode.html?lang=objc,swift)
+- [`DSImagePixelFormat`]({{ site.dcv_enumerations }}core/image-pixel-format.html?lang=objc,swift)
+- [`DSImageSourceState`]({{ site.dcv_enumerations }}core/image-source-state.html?lang=objc,swift)
+- [`DSImageTagType`]({{ site.dcv_enumerations }}core/image-tag-type.html?lang=objc,swift)
+- [`DSIntermediateResultUnitType`]({{ site.dcv_enumerations }}core/intermediate-result-unit-type.html?lang=objc,swift)
+- [`DSLogMode`]({{ site.dcv_enumerations }}core/log-mode.html?lang=objc,swift)
+- [`DSRegionObjectElementType`]({{ site.dcv_enumerations }}core/region-object-element-type.html?lang=objc,swift)
+- [`DSSectionType`]({{ site.dcv_enumerations }}core/section-type.html?lang=objc,swift)
+- [`DSTransformMatrixType`]({{ site.dcv_enumerations }}core/transform-matrix-type.html?lang=objc,swift)
+- [`DSVideoFrameQuality`]({{ site.dcv_enumerations }}core/video-frame-quality.html?lang=objc,swift)
+
+## DynamsoftUtility
+
+### Classes
+
+- [`DSDirectoryFetcher`]({{ site.dcv_ios_api }}utility/directory-fetcher.html)
+- [`DSFileFetcher`]({{ site.dcv_ios_api }}utility/file-fetcher.html)
+- [`DSMultiFrameResultCrossFilter`]({{ site.dcv_ios_api }}utility/multi-frame-result-cross-filter.html)
+- [`DSUtilityModule`]({{ site.dcv_ios_api }}utility/utility-module.html)
+
+## DynamsoftCameraEnhancer
+
+### Classes
+
+- [`DSCameraEnhancer`]({{ site.dce_ios_api }}primary-api/camera-enhancer.html)
+- [`DSCameraEnhancerModule`]({{ site.dce_ios_api }}auxiliary-api/camera-enhancer-module.html)
+- [`DSCameraView`]({{ site.dce_ios_api }}auxiliary-api/dcecameraview.html)
+- [`DSCapabilities`]({{ site.dce_ios_api }}auxiliary-api/capabilities.html)
+- [`DSDrawingItem`]({{ site.dce_ios_api }}auxiliary-api/drawingitem.html)
+- [`DSDrawingLayer`]({{ site.dce_ios_api }}auxiliary-api/dcedrawinglayer.html)
+- [`DSDrawingStyleManager`]({{ site.dce_ios_api }}auxiliary-api/drawingstylemanager.html)
+- [`DSDrawingStyle`]({{ site.dce_ios_api }}auxiliary-api/drawingstyle.html)
+- [`DSFeedback`]({{ site.dce_ios_api }}auxiliary-api/dcefeedback.html)
+- [`DSImageEditorView`]({{ site.dce_ios_api }}auxiliary-api/dceimageeditorview.html)
+- [`DSLineDrawingItem`]({{ site.dce_ios_api }}auxiliary-api/drawingitem-line.html)
+- [`DSNote`]({{ site.dce_ios_api }}auxiliary-api/note.html)
+- [`DSQuadDrawingItem`]({{ site.dce_ios_api }}auxiliary-api/drawingitem-quad.html)
+- [`DSRectDrawingItem`]({{ site.dce_ios_api }}auxiliary-api/drawingitem-rect.html)
+- [`DSTextDrawingItem`]({{ site.dce_ios_api }}auxiliary-api/drawingitem-text.html)
+- [`DSTipConfig`]({{ site.dce_ios_api }}auxiliary-api/tip-config.html)
+
+### Interfaces
+
+- [`DSCameraStateListener`]({{ site.dce_ios_api }}auxiliary-api/protocol-dcecamerastatelistener.html)
+- [`DSPhotoListener`]({{ site.dce_ios_api }}auxiliary-api/protocol-dcephotolistener.html)
+- [`DSVideoFrameListener`]({{ site.dce_ios_api }}auxiliary-api/protocol-dceframelistener.html)
+
+### Enumerations
+
+- [`DSCameraPosition`]({{ site.dcv_enumerations }}camera-position.html?lang=objc,swift)
+- [`DSCameraState`]({{ site.dcv_enumerations }}camera-state.html?lang=objc,swift)
+- [`DSCoordinateBase`]({{ site.dcv_enumerations }}coordinate-base.html?lang=objc,swift)
+- [`DSDrawingItemMediaType`]({{ site.dcv_enumerations }}drawing-item-media-type.html?lang=objc,swift)
+- [`DSDrawingItemState`]({{ site.dcv_enumerations }}drawing-item-state.html?lang=objc,swift)
+- [`DSEnhancedFeatures`]({{ site.dcv_enumerations }}enhanced-features.html?lang=objc,swift)
+- [`DSFocusMode`]({{ site.dcv_enumerations }}focus-mode.html?lang=objc,swift)
+- [`DSResolution`]({{ site.dcv_enumerations }}resolution.html?lang=objc,swift)
+
+## DynamsoftImageProcessing
+
+### Classes
+
+- [`DSImageProcessingModule`]({{ site.dcv_ios_api }}image-processing/image-processing-module.html)
+
+## DynamsoftLicense
+
+### Classes
+
+- [`DSLicenseManger`]({{ site.dcv_ios_api }}license/license-manager.html)
+- [`DSLicenseModule`]({{ site.dcv_ios_api }}license/license-module.html)
diff --git a/programming/ios/api-reference/index.md b/programming/ios/api-reference/index.md
index 3c84aad..c01bb63 100644
--- a/programming/ios/api-reference/index.md
+++ b/programming/ios/api-reference/index.md
@@ -1,6 +1,6 @@
---
layout: default-layout
-title: Dynamsoft Document Normalizer iOS API Reference - Main Page
+title: Dynamsoft Document Normalizer iOS API Reference - Main Page
description: This is the main page of Dynamsoft Document Normalizer SDK API Reference for iOS.
keywords: api reference, iOS
permalink: /programming/ios/api-reference/index.html
@@ -8,116 +8,170 @@ permalink: /programming/ios/api-reference/index.html
# API Reference - iOS
-## Primary Class
-
-- [`DSCaptureVisionRouter`]({{ site.dcv_ios_api }}capture-vision-router/capture-vision-router.html)
-
-## Input
-
-- [`DSCameraEnhancer`]({{ site.dce_ios }}primary-api/camera-enhancer.html)
-- [`DSImageSourceAdapter`]({{ site.dcv_ios_api }}core/basic-structures/image-source-adapter.html)
-- [`DSDirectoryFetcher`]({{ site.dcv_ios_api }}utility/directory-fetcher.html)
-- [`DSFileFetcher`]({{ site.dcv_ios_api }}utility/file-fetcher.html)
-
-## Final Results
-
-- [`DSCapturedResultReceiver`]({{ site.dcv_ios_api }}core/basic-structures/captured-result-receiver.html)
-- [`DSCapturedResultItem`]({{ site.dcv_ios_api }}core/basic-structures/captured-result-item.html)
-- [`DSCapturedResult`]({{ site.dcv_ios_api }}core/basic-structures/captured-result.html)
-- [`DSDetectedQuadResultItem`]({{ site.ios_api }}detected-quad-result-item.html)
-- [`DSDetectedQuadsResult`]({{ site.ios_api }}detected-quads-result.html)
-- [`DSNormalizedImageResultItem`]({{ site.ios_api }}normalized-image-result-item.html)
-- [`DSNormalizedImagesResult`]({{ site.ios_api }}normalized-images-result.html)
-- [`DSOriginalImageResultItem`]({{ site.dcv_ios_api }}core/basic-structures/original-image-result-item.html)
-
-## Final Results Filters
-
-- [`DSCapturedResultFilter`]({{ site.dcv_ios_api }}core/basic-structures/captured-result-filter.html)
-- [`DSMultiFrameResultCrossFilter`]({{ site.dcv_ios_api }}utility/multi-frame-result-cross-filter.html)
-
-## Intermediate Results
-
-- [`DSIntermediateResultManager`]({{ site.dcv_ios_api }}core/intermediate-results/intermediate-result-manager.html)
-- [`DSIntermediateResultReceiver`]({{ site.dcv_ios_api }}core/intermediate-results/intermediate-result-receiver.html)
-- [`DSObservationParameters`]({{ site.dcv_ios_api }}core/intermediate-results/observation-parameters.html)
-- [`DSIntermediateResultExtraInfo`]({{ site.dcv_ios_api }}core/intermediate-results/intermediate-result-extra-info.html)
-- [`DSIntermediateResult`]({{ site.dcv_ios_api }}core/intermediate-results/intermediate-result.html)
-- [`DSIntermediateResultUnit`]({{ site.dcv_ios_api }}core/intermediate-results/intermediate-result-unit.html)
-- [`DSPredetectedRegionsUnit`]({{ site.dcv_ios_api }}core/intermediate-results/predetected-regions-unit.html)
-- [`DSDetectedQuadsUnit`]({{ site.ios_api }}detected-quads-unit.html)
-- [`DSNormalizedImagesUnit`]({{ site.ios_api }}normalized-image-unit.html)
-- [`DSRegionObjectElement`]({{ site.dcv_ios_api }}core/intermediate-results/region-object-element.html)
-- [`DSPredetectedRegionElement`]({{ site.dcv_ios_api }}core/intermediate-results/predetected-region-element.html)
-- [`DSDetectedQuadElement`]({{ site.ios_api }}detected-quad-element.html)
-- [`DSNormalizedImageElement`]({{ site.ios_api }}normalized-image-element.html)
-- [`DSBinaryImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/binary-image-unit.html)
-- [`DSCandidateQuadEdgesUnit`]({{ site.ios_api }}candidate-quad-edges-unit.html)
-- [`DSColourImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/colour-image-unit.html)
-- [`DSContoursUnit`]({{ site.dcv_ios_api }}core/intermediate-results/contours-unit.html)
-- [`DSCornersUnit`]({{ site.ios_api }}corners-unit.html)
-- [`DSEnhancedGrayscaleImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/enhanced-grayscale-image-unit.html)
-- [`DSGrayscaleImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/grayscale-image-unit.html)
-- [`DSLineSegmentsUnit`]({{ site.dcv_ios_api }}core/intermediate-results/line-segments-unit.html)
-- [`DSLongLinesUnit`]({{ site.ios_api }}long-lines-unit.html)
-- [`DSScaledDownColourImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/scaled-down-colour-image-unit.html)
-- [`DSTextRemovedBinaryImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/text-removed-binary-image-unit.html)
-- [`DSTextZonesUnit`]({{ site.dcv_ios_api }}core/intermediate-results/text-zones-unit.html)
-- [`DSTextureDetectionResultUnit`]({{ site.dcv_ios_api }}core/intermediate-results/texture-detection-result-unit.html)
-- [`DSTextureRemovedBinaryImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/texture-removed-binary-image-unit.html)
-- [`DSTextureRemovedGrayscaleImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/texture-removed-grayscale-image-unit.html)
-- [`DSTransformedGrayscaleImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/transformed-grayscale-image-unit.html)
-
-## Settings
-
-- [`DSSimplifiedCaptureVisionSettings`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/simplified-capture-vision-settings.html)
-- [`DSPresetTemplate`]({{ site.dcv_enums }}capture-vision-router/preset-template.html?lang=objc&swift)
-
-## State Listener
-
-- [`DSCaptureStateListener`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/capture-state-listener.html)
-- [`DSImageSourceStateListener`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/image-source-state-listener.html)
-
-## License Manager
-
-- [`DSLicenseManager`]({{ site.dcv_ios_api }}license/license-manager.html)
-
-## Basic Structure
-
-- [`DSContour`]({{ site.dcv_ios_api }}core/basic-structures/contour.html)
-- [`DSCorner`]({{ site.dcv_ios_api }}core/basic-structures/corner.html)
-- [`DSEdge`]({{ site.dcv_ios_api }}core/basic-structures/edge.html)
-- [`DSFileImageTag`]({{ site.dcv_ios_api }}core/basic-structures/file-image-tag.html)
-- [`DSImageData`]({{ site.dcv_ios_api }}core/basic-structures/image-data.html)
-- [`DSImageTag`]({{ site.dcv_ios_api }}core/basic-structures/image-tag.html)
-- [`DSLineSegment`]({{ site.dcv_ios_api }}core/basic-structures/line-segment.html)
-- [`DSQuadrilateral`]({{ site.dcv_ios_api }}core/basic-structures/quadrilateral.html)
+## DynamsoftCaptureVisionRouter
+
+### CaptureVisionRouter Class
+
+- [`CaptureVisionRouter`]({{ site.dcv_ios_api }}capture-vision-router/capture-vision-router.html)
+
+### Auxiliary Classes
+
+- [`CaptureVisionRouterModule`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/capture-vision-router-module.html)
+- [`CapturedResultFilter`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/captured-result-filter.html)
+- [`CapturedResultReceiver`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/captured-result-receiver.html)
+- [`IntermediateResultManager`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/intermediate-result-manager.html)
+- [`IntermediateResultReceiver`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/intermediate-result-receiver.html)
+- [`SimplifiedCaptureVisionSettings`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/simplified-capture-vision-settings.html)
+
+### Interfaces
+
+- [`CaptureStateListener`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/capture-state-listener.html)
+- [`ImageSourceStateListener`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/image-source-state-listener.html)
+
+### Enumerations
+
+- [`EnumCaptureState`]({{ site.dcv_enumerations }}capture-vision-router/capture-state.html?lang=objc,swift)
+- [`EnumPresetTemplate`]({{ site.dcv_enumerations }}capture-vision-router/preset-template.html?lang=objc,swift)
+
+## DynamsoftDocumentNormalizer
+
+### Classes
+
+- [`CandidateQuadEdgesUnit`]({{ site.ddn_ios_api }}candidate-quad-edges-unit.html)
+- [`CornersUnit`]({{ site.ddn_ios_api }}corners-unit.html)
+- [`DetectedQuadElement`]({{ site.ddn_ios_api }}detected-quad-element.html)
+- [`DetectedQuadResultItem`]({{ site.ddn_ios_api }}detected-quad-result-item.html)
+- [`DetectedQuadsResult`]({{ site.ddn_ios_api }}detected-quads-result.html)
+- [`DetectedQuadsUnit`]({{ site.ddn_ios_api }}detected-quads-unit.html)
+- [`DocumentNormalizerModule`]({{ site.ddn_ios_api }}document-normalizer-module.html)
+- [`LongLinesUnit`]({{ site.ddn_ios_api }}long-lines-unit.html)
+- [`NormalizedImageElement`]({{ site.ddn_ios_api }}normalized-image-element.html)
+- [`NormalizedImageResultItem`]({{ site.ddn_ios_api }}normalized-image-result-item.html)
+- [`NormalizedImagesResult`]({{ site.ddn_ios_api }}normalized-images-result.html)
+- [`NormalizedImageUnit`]({{ site.ddn_ios_api }}normalized-image-unit.html)
+- [`SimplifiedDocumentNormalizerSettings`]({{ site.ddn_ios_api }}simplified-document-normalizer-settings.html)
+
+## DynamsoftCore
+
+### Classes
+
+- [`BinaryImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/binary-image-unit.html)
+- [`CapturedResultItem`]({{ site.dcv_ios_api }}core/basic-structures/captured-result-item.html)
+- [`CapturedResult`]({{ site.dcv_ios_api }}core/basic-structures/captured-result.html)
+- [`ColourImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/colour-image-unit.html)
+- [`ContoursUnit`]({{ site.dcv_ios_api }}core/intermediate-results/contours-unit.html)
+- [`Contour`]({{ site.dcv_ios_api }}core/basic-structures/contour.html)
+- [`CoreModule`]({{ site.dcv_ios_api }}core/basic-structures/core-module.html)
+- [`Corner`]({{ site.dcv_ios_api }}core/basic-structures/corner.html)
- [`DSRect`]({{ site.dcv_ios_api }}core/basic-structures/rect.html)
-- [`DSVideoFrameTag`]({{ site.dcv_ios_api }}core/basic-structures/video-frame-tag.html)
-
-## Modules
-
-- [`DSCaptureVisionRouterModule`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/capture-vision-router-module.html)
-- [`DSDocumentNormalizerModule`]({{ site.ios_api }}document-normalizer-module.html)
-- [`DSCoreModule`]({{ site.dcv_ios_api }}core/basic-structures/core-module.html)
-- [`DSLicenseModule`]({{ site.dcv_ios_api }}license/license-module.html)
-- [`DSUtilityModule`]({{ site.dcv_ios_api }}utility/utility-module.html)
-- [`DSImageProcessingModule`]({{ site.dcv_ios_api }}image-processing/image-processing-module.html)
-
-## Enumerations
-
-- [`DSBufferOverflowProtectionMode`]({{ site.dcv_enums }}core/buffer-overflow-protection-mode.html?lang=objc&swift)
-- [`DSCapturedResultItemType`]({{ site.dcv_enums }}core/captured-result-item-type.html?lang=objc&swift)
-- [`DSCornerType`]({{ site.dcv_enums }}core/corner-type.html?lang=objc&swift)
-- [`DSErrorCode`]({{ site.dcv_enums }}core/error-code.html?lang=objc&swift)
-- [`DSGrayscaleTransformationMode`]({{ site.dcv_enums }}core/grayscale-transformation-mode.html?lang=objc&swift)
-- [`DSImageCaptureDistanceMode`]({{ site.dcv_enums }}core/image-capture-distance-mode.html?lang=objc&swift)
-- [`DSImagePixelFormat`]({{ site.dcv_enums }}core/image-pixel-format.html?lang=objc&swift)
-- [`DSImageSourceState`]({{ site.dcv_enums }}core/image-source-state.html?lang=objc&swift)
-- [`DSImageTagType`]({{ site.dcv_enums }}core/image-tag-type.html?lang=objc&swift)
-- [`DSIntermediateResultUnitType`]({{ site.dcv_enums }}core/intermediate-result-unit-type.html?lang=objc&swift)
-- [`DSRegionObjectElementType`]({{ site.dcv_enums }}core/region-object-element-type.html?lang=objc&swift)
-- [`DSSectionType`]({{ site.dcv_enums }}core/section-type.html?lang=objc&swift)
-- [`DSRasterDataSource`]({{ site.dcv_enums }}core/raster-data-source.html?lang=objc&swift)
-- [`DSVideoFrameQuality`]({{ site.dcv_enums }}core/video-frame-quality.html?lang=objc&swift)
-- [`DSColourChannelUsageType`]({{ site.dcv_enums}}core/colour-channel-usage-type.html?lang=objc&swift)
-- [`DSTransformMatrixType`]({{ site.dcv_enums}}core/transform-matrix-type.html?lang=objc&swift)
+- [`Edge`]({{ site.dcv_ios_api }}core/basic-structures/edge.html)
+- [`EnhancedGrayscaleImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/enhanced-grayscale-image-unit.html)
+- [`FileImageTag`]({{ site.dcv_ios_api }}core/basic-structures/file-image-tag.html)
+- [`GrayscaleImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/grayscale-image-unit.html)
+- [`ImageData`]({{ site.dcv_ios_api }}core/basic-structures/image-data.html)
+- [`ImageSourceAdapter`]({{ site.dcv_ios_api }}core/basic-structures/image-source-adapter.html)
+- [`ImageTag`]({{ site.dcv_ios_api }}core/basic-structures/image-tag.html)
+- [`IntermediateResultExtraInfo`]({{ site.dcv_ios_api }}core/intermediate-results/intermediate-result-extra-info.html)
+- [`IntermediateResultUnit`]({{ site.dcv_ios_api }}core/intermediate-results/intermediate-result-unit.html)
+- [`IntermediateResult`]({{ site.dcv_ios_api }}core/intermediate-results/intermediate-result.html)
+- [`LineSegmentsUnit`]({{ site.dcv_ios_api }}core/intermediate-results/line-segments-unit.html)
+- [`LineSegment`]({{ site.dcv_ios_api }}core/basic-structures/line-segment.html)
+- [`ObservationParameters`]({{ site.dcv_ios_api }}core/intermediate-results/observation-parameters.html)
+- [`OriginalImageResultItem`]({{ site.dcv_ios_api }}core/basic-structures/original-image-result-item.html)
+- [`PredetectedRegionElement`]({{ site.dcv_ios_api }}core/intermediate-results/predetected-region-element.html)
+- [`PredetectedRegionsUnit`]({{ site.dcv_ios_api }}core/intermediate-results/predetected-regions-unit.html)
+- [`Quadrilateral`]({{ site.dcv_ios_api }}core/basic-structures/quadrilateral.html)
+- [`RegionObjectElement`]({{ site.dcv_ios_api }}core/intermediate-results/region-object-element.html)
+- [`ScaledDownColourImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/scaled-down-colour-image-unit.html)
+- [`TextRemovedBinaryImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/text-removed-binary-image-unit.html)
+- [`TextureDetectionResultUnit`]({{ site.dcv_ios_api }}core/intermediate-results/texture-detection-result-unit.html)
+- [`TextureRemovedBinaryImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/texture-removed-binary-image-unit.html)
+- [`TextureRemovedGrayscaleImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/texture-removed-grayscale-image-unit.html)
+- [`TextZonesUnit`]({{ site.dcv_ios_api }}core/intermediate-results/text-zones-unit.html)
+- [`TransformedGrayscaleImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/transformed-grayscale-image-unit.html)
+- [`Vector4`]({{ site.dcv_ios_api }}core/basic-structures/vector4.html)
+- [`VideoFrameTag`]({{ site.dcv_ios_api }}core/basic-structures/video-frame-tag.html)
+
+### Interfaces
+
+- [`ImageSourceErrorListener`]({{ site.dcv_ios_api }}core/basic-structures/image-source-error-listener.html)
+
+### Enumerations
+
+- [`BufferOverflowProtectionMode`]({{ site.dcv_enumerations }}core/buffer-overflow-protection-mode.html?lang=objc,swift)
+- [`CapturedResultItemType`]({{ site.dcv_enumerations }}core/captured-result-item-type.html?lang=objc,swift)
+- [`ColourChannelUsageType`]({{ site.dcv_enumerations }}core/colour-channel-usage-type.html?lang=objc,swift)
+- [`CornerType`]({{ site.dcv_enumerations }}core/corner-type.html?lang=objc,swift)
+- [`ErrorCode`]({{ site.dcv_enumerations }}core/error-code.html?lang=objc,swift)
+- [`GrayscaleEnhancementMode`]({{ site.dcv_enumerations }}core/grayscale-enhancement-mode.html?lang=objc,swift)
+- [`GrayscaleTransformationMode`]({{ site.dcv_enumerations }}core/grayscale-transformation-mode.html?lang=objc,swift)
+- [`ImageCaptureDistanceMode`]({{ site.dcv_enumerations }}core/image-capture-distance-mode.html?lang=objc,swift)
+- [`ImagePixelFormat`]({{ site.dcv_enumerations }}core/image-pixel-format.html?lang=objc,swift)
+- [`ImageSourceState`]({{ site.dcv_enumerations }}core/image-source-state.html?lang=objc,swift)
+- [`ImageTagType`]({{ site.dcv_enumerations }}core/image-tag-type.html?lang=objc,swift)
+- [`IntermediateResultUnitType`]({{ site.dcv_enumerations }}core/intermediate-result-unit-type.html?lang=objc,swift)
+- [`LogMode`]({{ site.dcv_enumerations }}core/log-mode.html?lang=objc,swift)
+- [`RegionObjectElementType`]({{ site.dcv_enumerations }}core/region-object-element-type.html?lang=objc,swift)
+- [`SectionType`]({{ site.dcv_enumerations }}core/section-type.html?lang=objc,swift)
+- [`TransformMatrixType`]({{ site.dcv_enumerations }}core/transform-matrix-type.html?lang=objc,swift)
+- [`VideoFrameQuality`]({{ site.dcv_enumerations }}core/video-frame-quality.html?lang=objc,swift)
+
+## DynamsoftUtility
+
+### Classes
+
+- [`DirectoryFetcher`]({{ site.dcv_ios_api }}utility/directory-fetcher.html)
+- [`FileFetcher`]({{ site.dcv_ios_api }}utility/file-fetcher.html)
+- [`MultiFrameResultCrossFilter`]({{ site.dcv_ios_api }}utility/multi-frame-result-cross-filter.html)
+- [`UtilityModule`]({{ site.dcv_ios_api }}utility/utility-module.html)
+
+## DynamsoftCameraEnhancer
+
+### Classes
+
+- [`CameraEnhancer`]({{ site.dce_ios_api }}primary-api/camera-enhancer.html)
+- [`CameraEnhancerModule`]({{ site.dce_ios_api }}auxiliary-api/camera-enhancer-module.html)
+- [`CameraView`]({{ site.dce_ios_api }}auxiliary-api/dcecameraview.html)
+- [`Capabilities`]({{ site.dce_ios_api }}auxiliary-api/capabilities.html)
+- [`DrawingItem`]({{ site.dce_ios_api }}auxiliary-api/drawingitem.html)
+- [`DrawingLayer`]({{ site.dce_ios_api }}auxiliary-api/dcedrawinglayer.html)
+- [`DrawingStyleManager`]({{ site.dce_ios_api }}auxiliary-api/drawingstylemanager.html)
+- [`DrawingStyle`]({{ site.dce_ios_api }}auxiliary-api/drawingstyle.html)
+- [`Feedback`]({{ site.dce_ios_api }}auxiliary-api/dcefeedback.html)
+- [`ImageEditorView`]({{ site.dce_ios_api }}auxiliary-api/dceimageeditorview.html)
+- [`LineDrawingItem`]({{ site.dce_ios_api }}auxiliary-api/drawingitem-line.html)
+- [`Note`]({{ site.dce_ios_api }}auxiliary-api/note.html)
+- [`QuadDrawingItem`]({{ site.dce_ios_api }}auxiliary-api/drawingitem-quad.html)
+- [`RectDrawingItem`]({{ site.dce_ios_api }}auxiliary-api/drawingitem-rect.html)
+- [`TextDrawingItem`]({{ site.dce_ios_api }}auxiliary-api/drawingitem-text.html)
+- [`TipConfig`]({{ site.dce_ios_api }}auxiliary-api/tip-config.html)
+
+### Interfaces
+
+- [`CameraStateListener`]({{ site.dce_ios_api }}auxiliary-api/protocol-dcecamerastatelistener.html)
+- [`PhotoListener`]({{ site.dce_ios_api }}auxiliary-api/protocol-dcephotolistener.html)
+- [`VideoFrameListener`]({{ site.dce_ios_api }}auxiliary-api/protocol-dceframelistener.html)
+
+### Enumerations
+
+- [`CameraPosition`]({{ site.dcv_enumerations }}camera-position.html?lang=objc,swift)
+- [`CameraState`]({{ site.dcv_enumerations }}camera-state.html?lang=objc,swift)
+- [`CoordinateBase`]({{ site.dcv_enumerations }}coordinate-base.html?lang=objc,swift)
+- [`DrawingItemMediaType`]({{ site.dcv_enumerations }}drawing-item-media-type.html?lang=objc,swift)
+- [`DrawingItemState`]({{ site.dcv_enumerations }}drawing-item-state.html?lang=objc,swift)
+- [`EnhancedFeatures`]({{ site.dcv_enumerations }}enhanced-features.html?lang=objc,swift)
+- [`FocusMode`]({{ site.dcv_enumerations }}focus-mode.html?lang=objc,swift)
+- [`Resolution`]({{ site.dcv_enumerations }}resolution.html?lang=objc,swift)
+
+## DynamsoftImageProcessing
+
+### Classes
+
+- [`ImageProcessingModule`]({{ site.dcv_ios_api }}image-processing/image-processing-module.html)
+
+## DynamsoftLicense
+
+### Classes
+
+- [`LicenseManger`]({{ site.dcv_ios_api }}license/license-manager.html)
+- [`LicenseModule`]({{ site.dcv_ios_api }}license/license-module.html)
diff --git a/programming/ios/api-reference/long-lines-unit-2.0.20.md b/programming/ios/api-reference/long-lines-unit-2.0.20.md
new file mode 100644
index 0000000..cfdc025
--- /dev/null
+++ b/programming/ios/api-reference/long-lines-unit-2.0.20.md
@@ -0,0 +1,53 @@
+---
+layout: default-layout
+title: DSLongLinesUnit - Dynamsoft Document Normalizer module iOS Edition API Reference
+description: The class DSLongLinesUnit of Dynamsoft Document Normalizer module represents an intermediate result unit whose type is long lines. Line segments that are located in the same line are extended and merged to form a long line.
+keywords: long lines, intermediate result unit, objective-c, swift
+needGenerateH3Content: true
+needAutoGenerateSidebar: true
+noTitleIndex: true
+---
+
+# DSLongLinesUnit
+
+The `DSLongLinesUnit` class represents an intermediate result unit whose type is long lines. Line segments that are located in the same line are extended and merged to form a long line.
+
+## Definition
+
+*Assembly:* DynamsoftDocumentNormalizer.framework
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+@interface DSLongLinesUnit: DSIntermediateResultUnit
+```
+2.
+```swift
+class LongLinesUnit: IntermediateResultUnit
+```
+
+## Attributes
+
+| Attributes | Type | Description |
+| ---------- | ---- | ----------- |
+| [`longLines`](#longlines) | *NSArray \** | An array of `DSLineSegments` as the long lines. |
+
+### longLines
+
+An array of `DSLineSegments` as the long lines.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+@property (nonatomic, nullable, copy) NSArray* longLines;
+```
+2.
+```swift
+var longLines: [LineSegment]? { get set }
+```
diff --git a/programming/ios/api-reference/long-lines-unit.md b/programming/ios/api-reference/long-lines-unit.md
index cfdc025..5f92361 100644
--- a/programming/ios/api-reference/long-lines-unit.md
+++ b/programming/ios/api-reference/long-lines-unit.md
@@ -29,15 +29,21 @@ The `DSLongLinesUnit` class represents an intermediate result unit whose type is
class LongLinesUnit: IntermediateResultUnit
```
-## Attributes
+## Methods
-| Attributes | Type | Description |
-| ---------- | ---- | ----------- |
-| [`longLines`](#longlines) | *NSArray \** | An array of `DSLineSegments` as the long lines. |
+| Methods | Description |
+| ---------- | ----------- |
+| [`getLongLines`](#getlonglines) | Get an array of `DSLineSegment` as the long lines. |
+| [`getCount`](#getcount) | Get the number of long lines. |
+| [`getLongLine`](#getlongline) | Get a long line. |
+| [`removeAllLongLines`](#removealllonglines) | Remove all long lines. |
+| [`removeLongLine`](#removelongline) | Remove a long line. |
+| [`addLongLine`](#addlongline) | Add a long line. |
+| [`setLongLine`](#setlongline) | Set a long line. |
-### longLines
+### getLongLines
-An array of `DSLineSegments` as the long lines.
+Get an array of `DSLineSegment` as the long lines.
>- Objective-C
@@ -45,9 +51,160 @@ An array of `DSLineSegments` as the long lines.
>
>1.
```objc
-@property (nonatomic, nullable, copy) NSArray* longLines;
+-(nullable NSArray*)getLongLines;
```
2.
```swift
-var longLines: [LineSegment]? { get set }
+func getLongLines() -> [LineSegment]?
```
+
+**Return Value**
+
+The array of `DSLineSegment` as the long lines.
+
+### getCount
+
+Get the number of long lines.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(NSInteger)getCount;
+```
+2.
+```swift
+func getCount() -> Int
+```
+
+**Return Value**
+
+The number of long lines.
+
+### getLongLine
+
+Get the long line at the specified index.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(nullable DSLineSegment*)getLongLine:(NSInteger)index;
+```
+2.
+```swift
+func getLongLine(_ index: Int) -> LineSegment?
+```
+
+**Parameters**
+
+`[in] index`: The index of the long line.
+
+**Return Value**
+
+A `DSLineSegment` object as the long line at the specified index.
+
+### removeAllLongLines
+
+Remove all long lines.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(void)removeAllLongLines;
+```
+2.
+```swift
+func removeAllLongLines()
+```
+
+### removeLongLine
+
+Remove the long line at the specified index.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(NSInteger)removeLongLine:(NSInteger)index;
+```
+2.
+```swift
+func removeLongLine(_ index: Int) -> Int
+```
+
+**Parameters**
+
+The index of the long line to be removed.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. Otherwise, returns 0.
+
+### addLongLine
+
+Add a long line.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(NSInteger)addLongLine:(DSLineSegment*)line
+ matrixToOriginalImage:(CGAffineTransform)matrixToOriginalImage;
+```
+2.
+```swift
+func addLongLine(_ line: LineSegment, matrixToOriginalImage: CGAffineTransform) -> Int
+```
+
+**Parameters**
+
+`[in] line`: The long line to be added.
+
+`[in] matrixToOriginalImage`: The transformation matrix of the original image.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. Otherwise, returns 0.
+
+### setLongLine
+
+Set the long line at the specified index.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(NSInteger)setLongLine:(NSInteger)index
+ line:(DSLineSegment*)line
+ matrixToOriginalImage:(CGAffineTransform)matrixToOriginalImage;
+```
+2.
+```swift
+func setLongLine(_ index: Int, line: LineSegment, matrixToOriginalImage: CGAffineTransform) -> Int
+```
+
+**Parameters**
+
+`[in] index`: The index of the long line.
+
+`[in] line`: The long line to be set.
+
+`[in] matrixToOriginalImage`: The transformation matrix of the original image.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. Otherwise, returns 0.
diff --git a/programming/ios/api-reference/normalized-image-unit-v2.0.20.md b/programming/ios/api-reference/normalized-image-unit-v2.0.20.md
new file mode 100644
index 0000000..edddc48
--- /dev/null
+++ b/programming/ios/api-reference/normalized-image-unit-v2.0.20.md
@@ -0,0 +1,53 @@
+---
+layout: default-layout
+title: DSNormalizedImagesUnit - Dynamsoft Document Normalizer module iOS Edition API Reference
+description: The class DSNormalizedImagesUnit of Dynamsoft Document Normalizer module represents an intermediate result unit whose type is normalized images.
+keywords: normalized images, objective-c, swift
+needGenerateH3Content: true
+needAutoGenerateSidebar: true
+noTitleIndex: true
+---
+
+# DSNormalizedImagesUnit
+
+The `DSNormalizedImagesUnit` class represents an intermediate result unit whose type is normalized images.
+
+## Definition
+
+*Assembly:* DynamsoftDocumentNormalizer.framework
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+@interface DSNormalizedImagesUnit: DSIntermediateResultUnit
+```
+2.
+```swift
+class NormalizedImagesUnit: IntermediateResultUnit
+```
+
+## Attributes
+
+| Attributes | Type | Description |
+| ---------- | ---- | ----------- |
+| [`normalizedImages`](#normalizedimages) | *NSArray* \* | An array of DSNormalizedImageElements. |
+
+### normalizedImages
+
+An array of `DSNormalizedImageElements`.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+@property(nonatomic, copy, nullable) NSArray* normalizedImages;
+```
+2.
+```swift
+var normalizedImages: [NormalizedImageElement]? { get set }
+```
diff --git a/programming/ios/api-reference/normalized-image-unit.md b/programming/ios/api-reference/normalized-image-unit.md
index edddc48..781e8ad 100644
--- a/programming/ios/api-reference/normalized-image-unit.md
+++ b/programming/ios/api-reference/normalized-image-unit.md
@@ -29,15 +29,19 @@ The `DSNormalizedImagesUnit` class represents an intermediate result unit whose
class NormalizedImagesUnit: IntermediateResultUnit
```
-## Attributes
+## Methods
-| Attributes | Type | Description |
-| ---------- | ---- | ----------- |
-| [`normalizedImages`](#normalizedimages) | *NSArray* \* | An array of DSNormalizedImageElements. |
+| Methods | Description |
+| ------- | ----------- |
+| [`getNormalizedImages`](#getnormalizedimages) | Get an array of [`DSNormalizedImageElement`](normalized-image-element.md) that represent all the normalized images. |
+| [`getCount`](#getcount) | Get the number of normalized images. |
+| [`getNormalizedImage`](#getnormalizedimage) | Get the [`DSNormalizedImageElement`](normalized-image-element.md) at the specified index. |
+| [`removeAllNormalizedImages`](#removeallnormalizedimages) | Remove all normalized images. |
+| [`setNormalizedImage`](#setnormalizedimage) | Set the [`DSNormalizedImageElement`](normalized-image-element.md) at the specified index. |
-### normalizedImages
+### getNormalizedImages
-An array of `DSNormalizedImageElements`.
+Get an array of [`DSNormalizedImageElement`](normalized-image-element.md) that represent all the normalized images.
>- Objective-C
@@ -45,9 +49,104 @@ An array of `DSNormalizedImageElements`.
>
>1.
```objc
-@property(nonatomic, copy, nullable) NSArray* normalizedImages;
+-(nullable NSArray*)getNormalizedImages;
```
2.
```swift
-var normalizedImages: [NormalizedImageElement]? { get set }
+func getNormalizedImages() -> [NormalizedImageElement]?
```
+
+**Return Value**
+
+An array of [`DSNormalizedImageElement`](normalized-image-element.md) that represent all the normalized images.
+
+### getCount
+
+Get the number of normalized images.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(NSInteger)getCount;
+```
+2.
+```swift
+func getCount() -> Int
+```
+
+**Return Value**
+
+The number of normalized images.
+
+### getNormalizedImage
+
+Get the [`DSNormalizedImageElement`](normalized-image-element.md) at the specified index.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(nullable DSNormalizedImageElement*)getNormalizedImage:(NSInteger)index;
+```
+2.
+```swift
+func getNormalizedImage(index: Int) -> NormalizedImageElement?
+```
+
+**Parameters**
+
+`[in] index`: The index of the normalized image.
+
+**Return Value**
+
+The [`DSNormalizedImageElement`](normalized-image-element.md) at the specified index.
+
+### removeAllNormalizedImages
+
+Remove all normalized images.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(void)removeAllNormalizedImages;
+```
+2.
+```swift
+func removeAllNormalizedImages()
+```
+
+### setNormalizedImage
+
+Set the [`DSNormalizedImageElement`](normalized-image-element.md) at the specified index.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+-(NSInteger)setNormalizedImage:(DSNormalizedImageElement*)element
+ matrixToOriginalImage:(CGAffineTransform)matrixToOriginalImage;
+```
+2.
+```swift
+func setNormalizedImage(element: NormalizedImageElement, matrixToOriginalImage: CGAffineTransform) -> Int
+```
+
+**Parameters**
+
+`[in] element`: The normalized image to be set.
+
+`[in] matrixToOriginalImage`: The matrix to the original image.
+
+**Return Value**
+
+Returns the `ErrorCode` if failed. Otherwise, returns 0.
diff --git a/programming/ios/api-reference/simplified-document-normalizer-settings.md b/programming/ios/api-reference/simplified-document-normalizer-settings.md
new file mode 100644
index 0000000..9eb34d2
--- /dev/null
+++ b/programming/ios/api-reference/simplified-document-normalizer-settings.md
@@ -0,0 +1,179 @@
+---
+layout: default-layout
+title: DSSimplifiedDocumentNormalizerSettings - Dynamsoft Document Normalizer module iOS Edition API Reference
+description: The class DSSimplifiedDocumentNormalizerSettings of Dynamsoft Document Normalizer module represents the simplified document normalizer settings.
+keywords: document normalizer settings, objective-c, swift
+needGenerateH3Content: true
+needAutoGenerateSidebar: true
+noTitleIndex: true
+---
+
+# DSSimplifiedDocumentNormalizerSettings
+
+The `DSSimplifiedDocumentNormalizerSettings` class represents the simplified document normalizer settings.
+
+## Definition
+
+*Assembly:* DynamsoftDocumentNormalizer.framework
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+@interface DSSimplifiedDocumentNormalizerSettings: NSObject
+```
+2.
+```swift
+class SimplifiedDocumentNormalizerSettings: NSObject
+```
+
+## Attributes
+
+| Attributes | Type | Description |
+| ---------- | ---- | ----------- |
+| [`grayscaleTransformationModes`](#grayscaletransformationmodes) | *NSArray* \* | An array of DSGrayscaleTransformationMode. It controls whether to detect the inverted document boundary. |
+| [`grayscaleEnhancementModes`](#grayscaleenhancementmodes) | *NSArray* \* | An array of DSGrayscaleEnhancementModes. |
+| [`colourMode`](#colourmode) | *DSImageColourMode \* | The grayscale transformation mode. It controls whether to decode the inverted text. |
+| [`pageSize`](#pagesize) | *CGSize \* | The page size. |
+| [`brightness`](#brightness) | *NSInteger \* | The brightness. |
+| [`contrast`](#contrast) | *NSInteger \* | The contrast. |
+| [`maxThreadsInOneTask`](#maxthreadsinonetask) | *NSInteger \* | The maximum number of threads in one task. |
+| [`scaleDownThreshold`](#scaledownthreshold) | *NSInteger \* | The scale down threshold. |
+
+### grayscaleTransformationModes
+
+Defines the grayscale transformation mode with an array of [`DSGrayscaleTransformationMode`]({{ site.dcv_enumerations }}core/grayscale-transformation-mode.html?lang=objc,swift). It controls whether to detect the inverted document boundary.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+@property (nonatomic, nullable, copy) NSArray* grayscaleTransformationModes;
+```
+2.
+```swift
+var grayscaleTransformationModes: [NSNumber]? { get set }
+```
+
+### grayscaleEnhancementModes
+
+Defines the grayscale enhancement mode with an array of [`DSGrayscaleEnhancementModes`]({{ site.dcv_enumerations }}core/grayscale-enhancement-modes.html?lang=objc,swift).
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+@property (nonatomic, nullable, copy) NSArray* grayscaleEnhancementModes;
+```
+2.
+```swift
+var grayscaleEnhancementModes: [NSNumber]? { get set }
+```
+
+### colourMode
+
+Defines the colour mode of the normalized image with a [`DSImageColourMode`]({{ site.dcv_enumerations }}core/image-colour-mode.html?lang=objc,swift) member.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+@property (nonatomic, assign) DSImageColourMode colourMode;
+```
+2.
+```swift
+var colourMode: ImageColourMode { get set }
+```
+
+### pageSize
+
+Defines the page size of the normalized image with a [`CGSize`]({{ site.dcv_structs }}core/size.html?lang=objc,swift) object.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+@property (nonatomic, assign) CGSize pageSize;
+```
+2.
+```swift
+var pageSize: CGSize { get set }
+```
+
+### brightness
+
+Defines the brightness of the normalized image with an integer.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+@property (nonatomic, assign) NSInteger brightness;
+```
+2.
+```swift
+var brightness: Int { get set }
+```
+
+### contrast
+
+Defines the contrast of the normalized image with an integer.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+@property (nonatomic, assign) NSInteger contrast;
+```
+2.
+```swift
+var contrast: Int { get set }
+```
+
+### maxThreadsInOneTask
+
+Defines the maximum number of threads in one task.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+@property (nonatomic, assign) NSInteger maxThreadsInOneTask;
+```
+2.
+```swift
+var maxThreadsInOneTask: Int { get set }
+```
+
+### scaleDownThreshold
+
+Defines the scale down threshold. If the image size is larger than the scale down threshold, the image is scaled down by half.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+@property (nonatomic, assign) NSInteger scaleDownThreshold;
+```
+2.
+```swift
+var scaleDownThreshold: Int { get set }
+```
diff --git a/programming/ios/index.md b/programming/ios/index.md
index 848b7e4..a3632b5 100644
--- a/programming/ios/index.md
+++ b/programming/ios/index.md
@@ -20,7 +20,7 @@ Furthermore, DDN provides a powerful parameter system in order to cope with vari
## Getting Started with DDN iOS Edition
-The best way to start with the Dynamsoft Document Normalizer iOS Edition, is following the [`User Guide`](user-guide.md) to build your first document normalization application.
+The best way to start with the Dynamsoft Document Normalizer iOS Edition, is following the [User Guide](user-guide.md) to build your first document normalization application.
## License Subscription
diff --git a/programming/ios/release-notes/index.md b/programming/ios/release-notes/index.md
index 72c066f..95c149d 100644
--- a/programming/ios/release-notes/index.md
+++ b/programming/ios/release-notes/index.md
@@ -10,6 +10,7 @@ permalink: /programming/ios/release-notes/index.html
# Release Notes - iOS Edition
+- [2.2.10 (03/07/2024)]({{ site.ios_release_notes }}ios-2.html#2210-03072024)
- [2.0.20 (12/12/2023)]({{ site.ios_release_notes }}ios-2.html#2020-12122023)
- [2.0.10 (08/10/2023)]({{ site.ios_release_notes }}ios-2.html#2010-08102023)
- [1.0.30 (06/07/2023)]({{ site.ios_release_notes }}ios-1.html#1030-06072023)
diff --git a/programming/ios/release-notes/ios-2.md b/programming/ios/release-notes/ios-2.md
index 276aea4..2e83927 100644
--- a/programming/ios/release-notes/ios-2.md
+++ b/programming/ios/release-notes/ios-2.md
@@ -11,6 +11,92 @@ permalink: /programming/ios/release-notes/ios-2.html
# Release Notes for iOS SDK - v2.x
+## 2.2.10 (03/07/2024)
+
+### New
+
+- Updated the template system
+ - Added `ReferenceTaskNameArray` under [`Location.ReferenceObjectFilter`]({{ site.parameters }}reference/target-roi-def/location.html) to filter the reference objects generated by the task name.
+ - Added the support of the [`OutputTaskSetting`]({{ site.parameters }}reference/output-task-setting/index.html) definition. The following subparameters are available in `OutputTaskSetting` object:
+ - [`OutputCondition`]({{ site.parameters }}reference/output-task-setting/output-condition.html)
+ - [`TaskResultArray`]({{ site.parameters }}reference/output-task-setting/output-condition.html#taskresultarray)
+ - [`TargetROIDefName`]({{ site.parameters }}reference/target-roi-def/index.html#targetroidefname)
+ - [`TaskSettingNameArray`]({{ site.parameters }}reference/output-task-setting/output-condition.html#tasksettingnamearray)
+ - [`BackwardReferenceOutput`]({{ site.parameters }}reference/output-task-setting/output-condition.html#backwardreferenceoutput)
+ - `ReferenceTaskNameArray`
+ - `ReferenceResultTypeArray`
+ - [`Operator`]({{ site.parameters }}reference/output-task-setting/output-condition.html)
+ - [`Name`]({{ site.parameters }}reference/output-task-setting/name.html)
+ - [`Offset`]({{ site.parameters }}reference/target-roi-def/location.html#offset) parameter is optimized.
+ - Added `ReferenceObjectType` to specify whether the reference object is an atomic object or the whole image.
+ - Added `ReferenceXAxis` & `ReferenceYAxis` to define the X & Y axis.
+ - Modified `FirstPoint`, `SecondPoint`, `ThirdPoint` & `FourthPoint`. You can specify whether the X or Y coordinate of the point is measured by percentage.
+ - Deprecated `ReferenceObjectSize` Type.
+- The following classes are migrated from `DynamsoftCore.framework` into `DynamsoftCaptureVision.framework`:
+ - [`DSCapturedResult`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/captured-result.html)
+ - [`DSIntermediateResultReceiver`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/intermediate-result-receiver.html)
+ - [`DSCapturedResultReceiver`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/captured-result-receiver.html)
+ - [`DSCapturedResultFilter`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/captured-result-filter.html)
+ - [`DSIntermediateResultManager`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/intermediate-result-manager.html)
+- Added a new call back method [`onShortLinesUnitReceived`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/intermediate-result-receiver.html#onshortlinesunitreceived) to the [`DSIntermediateResultReceiver`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/intermediate-result-receiver.html) class.
+- Added methods [`pauseCapturing`]({{ site.dcv_ios_api }}capture-vision-router/multiple-file-processing.html#pausecapturing) and [`resumeCapturing`]({{ site.dcv_ios_api }}capture-vision-router/multiple-file-processing.html#resumecapturing). Two new enumeration members, `CapturedStatePaused` and `CapturedStateResumed`, are added to [`DSCapturedState`]({{ site.dcv_enumerations }}capture-vision-router/capture-state.html?lang=objc,swift) as well.
+- Added a new property [`documentSettings`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/simplified-capture-vision-settings.html#documentsettings) to class [`DSSimplifiedCaptureVisionSettings`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/simplified-capture-vision-settings.html). The corresponding class [`DSSimplifiedDocumentNormalizerSettings`]({{ site.ddn_ios_api }}simplified-document-normalizer-settings.html) is added to the `DynamsoftDocumentNormalizer.framework` to store the `documentSettings`.
+- Added a new property [`resultUnitTypesOnlyForInput`]({{ site.dcv_ios_api }}core/intermediate-results/observation-parameters.html#resultunittypesonlyforinput) to the `ObservationParameters` class to specify the `input only` result unit.
+- Added the following methods to the [`RegionObjectElement`]({{ site.dcv_ios_api }}core/intermediate-results/region-object-element.html) class to support the intermediate result modification.
+ - `setLocation`
+ - `clone`
+ - `retain`
+ - `release`
+- Added a new method `replace` to the [`DSIntermediateResultUnit`]({{ site.dcv_ios_api }}core/intermediate-results/intermediate-result-unit.html) class to support the replacement of intermediate result units.
+- Added `setImageData` methods to the following classes:
+ - [`DSColourImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/colour-image-unit.html)
+ - [`DSScaledDownColourImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/scaled-down-colour-image-unit.html)
+ - [`DSGrayscaleImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/grayscale-image-unit.html)
+ - [`DSTransformedGrayscaleImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/transformed-grayscale-image-unit.html)
+ - [`DSEnhancedGrayscaleImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/enhanced-grayscale-image-unit.html)
+ - [`DSBinaryImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/binary-image-unit.html)
+ - [`DSTextureRemovedGrayscaleImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/texture-removed-grayscale-image-unit.html)
+ - [`DSTextureRemovedBinaryImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/texture-removed-binary-image-unit.html)
+ - [`DSTextRemovedBinaryImageUnit`]({{ site.dcv_ios_api }}core/intermediate-results/text-removed-binary-image-unit.html)
+- Added new methods to the [`DSPredetectedRegionsUnit`]({{ site.dcv_ios_api }}core/intermediate-results/predetected-regions-unit.html) class to add, remove or set the predetected regions.
+- Added new methods to the [`DSLineSegmentsUnit`]({{ site.dcv_ios_api }}core/intermediate-results/line-segments-unit.html) class to add, remove or set the line segments.
+- Added new methods to the [`DSTextZonesUnit`]({{ site.dcv_ios_api }}core/intermediate-results/text-zones-unit.html) class to add, remove or set the text zones. Added a new class CTextZone to store the information of a single text zone.
+- Added a new method `setContours` to the [`DSContourUnit`]({{ site.dcv_ios_api }}core/intermediate-results/contour-unit.html) class.
+- Added new methods to the [`DSTextureDetectionResultUnit`]({{ site.dcv_ios_api }}core/intermediate-results/texture-detection-result-unit.html) class to set the X & Y spacing.
+- Added a new intermediate result unit, [`DSShortLinesUnit`]({{ site.dcv_ios_api }}core/intermediate-results/short-lines-unit.html), to output the detected short lines. The corresponding enumeration member `DSIntermediateResultUnitTypeShortLines` is added to the [`DSIntermediateResultUnitType`]({{ site.dcv_enumerations }}core/intermediate-result-unit-type.html?lang=objc,swift).
+- Added the following methods to the [`DSCapturedResultItem`]({{ site.dcv_ios_api }}core/basic-structures/captured-result-item.html) class
+ - `getTargetROIDefName`
+ - `getTaskName`
+ - `retain`
+ - `release`
+- Added the following new error codes
+ - `DSErrorImageSizeNotMatch`
+ - `DSErrorImagePixelFormatNotMatch`
+ - `DSErrorSectionLevelResultIrreplaceable`
+ - `DSErrorAxisDefinitionIncorrect`
+ - `DSErrorTextLineGroupLayoutConflict`
+ - `DSErrorTextLineGroupRegexConflict`
+- Added the following methods to the [`DSCapturedResult`]({{ site.dcv_ios_api }}core/basic-structures/captured-result.html) class.
+ - `retain`
+ - `release`
+- Added a new supported image pixel format, binary 8 inverted. The corresponding enumeration member is added to the [`DSImagePixelFormat`]({{ site.dcv_enumerations }}core/image-pixel-format.html?lang=objc,swift).
+- Added return value for the `retain` method of the [`DSIntermediateResultUnit`]({{ site.dcv_ios_api }}core/intermediate-results/intermediate-result-unit.html) class. The method will return the pointer of the current `DSIntermediateResultUnit`.
+
+### Break Changes
+
+- Changed the logic of the [`stopCapturing`]({{ site.dcv_ios_api }}capture-vision-router/multiple-file-processing.html#stopCapturing) method.
+ - [`DSCaptureResultReceiver`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/captured-result-receiver.html) will not receive results after `stopCapturing` is triggered with `waitForRemainingTasks` false.
+ - Support stop capturing after the [`pauseCapturing`]({{ site.dcv_ios_api }}capture-vision-router/multiple-file-processing.html#pauseCapturing) method is triggered.
+- Changed the logic of the [`capturedResultItemTypes`]({{ site.dcv_ios_api }}capture-vision-router/auxiliary-classes/simplified-capture-vision-settings.html#capturedresultitemtypes) setting of `DSSimplifiedCaptureVisionSettings`:
+ - If the result item types don't match the specified template, the method [`updateSettings`]({{ site.dcv_ios_api }}capture-vision-router/settings.html#updatesettings) will return the error code `DSErrorParameterValueInvalid` with the message "The captured result item types do not match the task configurations in the template".
+ - Based on the `capturedResultItemTypes` setting, the irrelevant tasks will be removed from the template.
+ - The `capturedResultItemTypes` should include at least one of the `DSCapturedResultItemTypeBarcode`, `DSCapturedResultItemTypeTextLine`, `DSCapturedResultItemTypeDetectedQuad`, `DSCapturedResultItemTypeNormalizedImage`. Otherwise, the method `updateSettings` will return the error code `DSErrorParameterValueInvalid` with the message "The captured result item types should contain at least one task result type".
+- Refactored the [`DSContour`]({{ site.dcv_ios_api }}core/basic-structures/contour.html) class. Please view API reference - [`DSContour`]({{ site.dcv_ios_api }}core/basic-structures/contour.html) class for more information.
+
+### Fixed
+
+- Fixed a crash bug that might happen when triggering the [`setNextImageToReturn`]({{ site.dcv_ios_api }}core/basic-structures/image-source-adapter.html#setnextimagetoreturn) method of the `DSImageSourceAdapter` class.
+
## 2.0.20 (12/12/2023)
### New
diff --git a/programming/ios/user-guide-v2.0.10.md b/programming/ios/user-guide-v2.0.10.md
index 79cf037..26b3b3b 100644
--- a/programming/ios/user-guide-v2.0.10.md
+++ b/programming/ios/user-guide-v2.0.10.md
@@ -8,7 +8,7 @@ needGenerateH4Content: true
noTitleIndex: true
multiProgrammingLanguage: true
enableLanguageSelection: true
-permalink: /programming/ios/user-guide.html
+permalink: /programming/ios/user-guide-v2.0.10.html
---
# Getting Started with iOS
@@ -27,8 +27,8 @@ In this section, let's see how to create a HelloWorld app for normalizing docume
>
> - Xcode 14.0 is used here in this guide.
> - You can get the source code of the HelloWord app from the following link
-> - [Objective-C](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/ios/Objective-C/HelloWorld){:target="_blank"}.
-> - [Swift](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/ios/Swift/HelloWorld){:target="_blank"}.
+> - [Objective-C](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/ios/HelloWorld/AutoNormalizeObjc){:target="_blank"}.
+> - [Swift](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/ios/HelloWorld/AutoNormalize){:target="_blank"}.
### Create a New Project
@@ -98,32 +98,7 @@ There are three ways to add the SDK into your project - **Manually**, via **Coco
-### Main ViewController for Realtime Detection of Quads
-
-In the main view controller, your app will scan documents via video streaming and display the detect quadrilateral area on the screen. First of all, import the headers in the ViewController file.
-
-
- >- Objective-C
- >- Swift
- >
- >1.
- ```objc
- #import
- #import
- #import
- #import
- #import
- ```
- 2.
- ```swift
- import DynamsoftCore
- import DynamsoftCaptureVisionRouter
- import DynamsoftDocumentNormalizer
- import DynamsoftUtility
- import DynamsoftCameraEnhancer
- ```
-
-#### Initialize License
+### Initialize License
Initialize the license first. It is suggested to initialize the license in `AppDelegate` file.
@@ -177,6 +152,33 @@ class AppDelegate: UIResponder, UIApplicationDelegate, LicenseVerificationListen
>- The license string here will grant you a time-limited trial license.
>- If the license has expired, you can go to the customer portal to request for an extension.
+
+
+### Main ViewController for Realtime Detection of Quads
+
+In the main view controller, your app will scan documents via video streaming and display the detect quadrilateral area on the screen. First of all, import the headers in the ViewController file.
+
+
+ >- Objective-C
+ >- Swift
+ >
+ >1.
+ ```objc
+ #import
+ #import
+ #import
+ #import
+ #import
+ ```
+ 2.
+ ```swift
+ import DynamsoftCore
+ import DynamsoftCaptureVisionRouter
+ import DynamsoftDocumentNormalizer
+ import DynamsoftUtility
+ import DynamsoftCameraEnhancer
+ ```
+
#### Get Prepared with the Camera Module
Create the instances of `CameraEnhancer` and `CameraView`.
@@ -524,6 +526,42 @@ override func viewWillDisappear(_ animated: Bool) {
+### Configure Camera Permissions
+
+Add **Privacy - Camera Usage Description** to the `info.plist` of your project to request camera permission. An easy way to do this is to access your project settings, go to *Info* and then add this Privacy property to the iOS target properties list.
+
+
+
+### Additional Steps for iOS 12.x or Lower Versions
+
+If your iOS version is 12.x or lower, please add the following additional steps:
+
+1. Remove the methods `application:didDiscardSceneSessions:` and `application:configurationForConnectingSceneSession:options:` from your `AppDelegate` file.
+2. Remove the `SceneDelegate.Swift` file (`SceneDelegate.h` & `SceneDelegate.m` for Objective-C).
+3. Remove the `Application Scene Manifest` from your info.plist file.
+4. Declaire the window in your `AppDelegate.Swift` file (`AppDelegate.h` for Objective-C).
+
+
+ >- Objective-C
+ >- Swift
+ >
+ >1.
+ ```objc
+ @interface AppDelegate : UIResponder
+ @property (strong, nonatomic) UIWindow *window;
+ @end
+ ```
+ 2.
+ ```swift
+ import UIKit
+ @main
+ class AppDelegate: UIResponder, UIApplicationDelegate {
+ var window: UIWindow?
+ }
+ ```
+
+
+
### Build and Run the Project
1. Select the device that you want to run your app on.
@@ -532,5 +570,5 @@ override func viewWillDisappear(_ animated: Bool) {
> Note:
>
> - You can get the source code of the HelloWord app from the following link
-> - [Objective-C](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/ios/Objective-C/HelloWorld){:target="_blank"}.
-> - [Swift](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/ios/Swift/HelloWorld){:target="_blank"}.
+> - [Objective-C](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/ios/HelloWorld/AutoNormalizeObjc){:target="_blank"}.
+> - [Swift](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/ios/HelloWorld/AutoNormalize){:target="_blank"}.
diff --git a/programming/ios/user-guide-v2.0.20.md b/programming/ios/user-guide-v2.0.20.md
new file mode 100644
index 0000000..d2fcd5e
--- /dev/null
+++ b/programming/ios/user-guide-v2.0.20.md
@@ -0,0 +1,575 @@
+---
+layout: default-layout
+title: Dynamsoft Document Normalizer for iOS - User Guide
+description: This is the user guide of Dynamsoft Document Normalizer for iOS SDK.
+keywords: user guide, iOS
+needAutoGenerateSidebar: true
+needGenerateH4Content: true
+noTitleIndex: true
+multiProgrammingLanguage: true
+enableLanguageSelection: true
+permalink: /programming/ios/user-guide-v2.0.20.html
+---
+
+# Getting Started with iOS
+
+## Requirements
+
+- Supported OS: **iOS 11.0** or higher.
+- Supported ABI: **arm64** and **x86_64**.
+- Development Environment: Xcode 13.0 and above (Xcode 14.1+ recommended).
+
+## Build Your First Application
+
+In this section, let's see how to create a HelloWorld app for normalizing documents from camera video input.
+
+>Note:
+>
+> - Xcode 14.0 is used here in this guide.
+> - You can get the source code of the HelloWord app from the following link
+> - [Objective-C](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/ios/HelloWorld/AutoNormalizeObjc){:target="_blank"}.
+> - [Swift](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/ios/HelloWorld/AutoNormalize){:target="_blank"}.
+
+### Create a New Project
+
+1. Open Xcode and select create a new project.
+
+2. Select **iOS -> App** for your application.
+
+3. Input your product name (HelloWorld), interface (StoryBoard) and language (Objective-C/Swift).
+
+4. Click on the **Next** button and select the location to save the project.
+
+5. Click on the **Create** button to finish.
+
+### Add the SDK
+
+There are three ways to add the SDK into your project - **Manually**, via **CocoaPods**, or via **Swift Package Manager**.
+
+#### Add the Frameworks Manually
+
+1. Download the SDK package from the Dynamsoft website. After unzipping, you can find the following **xcframeworks** under the **Dynamsoft\Frameworks** directory:
+
+ | File | Description |
+ | ---- | ----------- |
+ | `DynamsoftDocumentNormalizer.xcframework` | The Dynamsoft Document Normalizer SDK, including document normalizer related APIs. |
+ | `DynamsoftCore.xcframework` | The core library of Dynamsoft's capture vision SDKs, including basic structures and intermediate result related APIs. |
+ | `DynamsoftCaptureVisionRouter.xcframework` | The CaptureVisionRouter is what a user uses to interact with image-processing and semantic-processing products in their applications. It accepts an image source and returns processing results which may contain Final results or Intermediate Results. |
+ | `DynamsoftImageProcessing.xcframework` | The image processing library of Dynamsoft's capture vision SDKs, including image processing algorithms and APIs. |
+ | `DynamsoftLicense.xcframework` | The module includes the licensing APIs. |
+ | `DynamsoftCameraEnhancer.xcframework` | The Dynamsoft Camera Enhancer SDK, including camera control and frame preprocessing APIs. |
+ | `DynamsoftUtility.xcframework (Optional)` | The module includes functional APIs that support you to integrate the input, filtering the results, generating result images, etc. |
+
+2. Drag and drop the above five **xcframeworks** into your Xcode project. Make sure to check Copy items if needed and Create groups to copy the framework into your project's folder.
+
+3. Click on the project settings then go to **General –> Frameworks, Libraries, and Embedded Content**. Set the **Embed** field to **Embed & Sign** for all above **xcframeworks**.
+
+#### Add the Frameworks via CocoaPods
+
+1. Add the frameworks in your **Podfile**.
+
+ ```sh
+ target 'HelloWorld' do
+ use_frameworks!
+
+ pod 'DynamsoftCaptureVisionRouter','2.0.21'
+ pod 'DynamsoftDocumentNormalizer','2.0.20'
+ pod 'DynamsoftCameraEnhancer','4.0.2'
+ pod 'DynamsoftCore','3.0.20'
+ pod 'DynamsoftLicense','3.0.30'
+ pod 'DynamsoftImageProcessing','2.0.21'
+ pod 'DynamsoftUtility','1.0.21'
+
+ end
+ ```
+
+2. Execute the pod command to install the frameworks and generate workspace(**HelloWorld.xcworkspace**):
+
+ ```sh
+ pod install
+ ```
+
+### Add the xcframeworks via Swift Package Manager
+
+1. In your Xcode project, go to **File --> AddPackages**.
+
+2. In the top-right section of the window, search "https://github.com/Dynamsoft/document-normalizer-spm"
+
+3. Select `document-normalizer-spm`, then click **Add Package**.
+
+4. Check all the frameworks and add.
+
+
+
+### Initialize License
+
+Initialize the license first. It is suggested to initialize the license in `AppDelegate` file.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+// Import the DynamsoftLicense module to init license
+#import
+// Add LicenseVerificationListener to the interface
+@interface AppDelegate ()
+@end
+@implementation AppDelegate
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
+ // Override point for customization after application launch.
+ [DSLicenseManager initLicense:@"Put your" verificationDelegate:self];
+ return YES;
+}
+-(void)onLicenseVerified:(BOOL)isSuccess error:(NSError *)error
+{
+ // Add your code to do when license server returns.
+}
+...
+@end
+```
+2.
+```swift
+// Import the DynamsoftLicense module to init license
+import DynamsoftLicense
+// Add LicenseVerificationListener to the interface
+class AppDelegate: UIResponder, UIApplicationDelegate, LicenseVerificationListener {
+ var window: UIWindow?
+ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+ // Override point for customization after application launch.
+ LicenseManager.initLicense("Put your license key here.", verificationDelegate: self)
+ return true
+ }
+ // Implement the callback method of LicenseVerificationListener.
+ func onLicenseVerified(_ isSuccess: Bool, error: Error?) {
+ // Add your code to do when license server returns.
+ }
+ ...
+}
+```
+
+>Note:
+>
+>- Network connection is required for the license to work.
+>- The license string here will grant you a time-limited trial license.
+>- If the license has expired, you can go to the customer portal to request for an extension.
+
+### Main ViewController for Realtime Detection of Quads
+
+In the main view controller, your app will scan documents via video streaming and display the detect quadrilateral area on the screen. First of all, import the headers in the ViewController file.
+
+
+ >- Objective-C
+ >- Swift
+ >
+ >1.
+ ```objc
+ #import
+ #import
+ #import
+ #import
+ #import
+ ```
+ 2.
+ ```swift
+ import DynamsoftCore
+ import DynamsoftCaptureVisionRouter
+ import DynamsoftDocumentNormalizer
+ import DynamsoftUtility
+ import DynamsoftCameraEnhancer
+ ```
+
+#### Get Prepared with the Camera Module
+
+Create the instances of `CameraEnhancer` and `CameraView`.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+@property (nonatomic, strong) DSCameraEnhancer *dce;
+@property (nonatomic, strong) DSCameraView *cameraView;
+...
+- (void)setUpCamera
+{
+ _cameraView = [[DSCameraView alloc] initWithFrame:self.view.bounds];
+ [_cameraView setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
+ [self.view addSubview:_cameraView];
+ [_cameraView addSubview:_captureButton];
+ _dce = [[DSCameraEnhancer alloc] init];
+ [_dce setCameraView:_cameraView];
+ DSDrawingLayer * layer = [_cameraView getDrawingLayer:DSDrawingLayerIdDDN];
+ [layer setVisible:true];
+ // You can enable the frame filter feature of Dynamsoft Camera Enhancer.
+ //[_dce enableEnhancedFeatures:DSEnhancerFeatureFrameFilter];
+}
+```
+2.
+```swift
+var cameraView:CameraView!
+let dce:CameraEnhancer!
+...
+func setUpCamera() {
+ // Create a camera view and add it as a sub view of the current view.
+ cameraView = .init(frame: view.bounds)
+ cameraView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
+ view.insertSubview(cameraView, at: 0)
+ // Bind the camera enhancer with the camera view.
+ dce = CameraEnhancer()
+ dce.cameraView = cameraView
+ // Additional step: Highlight the detected document boundary.
+ let layer = cameraView.getDrawingLayer(DrawingLayerId.DDN.rawValue)
+ layer?.visible = true
+ // You can enable the frame filter feature of Dynamsoft Camera Enhancer.
+ // dce.enableEnhancedFeatures(.frameFilter)
+}
+```
+
+#### Initialize Capture Vision Router
+
+Declare and create an instance of `CaptureVisionRouter`.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+@property (nonatomic, strong) DSCaptureVisionRouter *cvr;
+...
+- (void)setUpCvr
+{
+ _cvr = [[DSCaptureVisionRouter alloc] init];
+}
+```
+2.
+```swift
+let cvr:CaptureVisionRouter!
+func setUpDCV() {
+ cvr = CaptureVisionRouter()
+}
+```
+
+#### Set the CameraEnhancer as the Input
+
+Include and initialize the `DynamsoftDocumentNormalizer`, bind to the created `CameraEnhancer` instance.
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+- (void)setUpCvr
+{
+ ...
+ NSError *cvrError;
+ [_cvr setInput:_dce error:&cvrError];
+}
+```
+2.
+```swift
+func setUpCvr() {
+ try? cvr.setInput(dce)
+}
+```
+
+#### Set up Result Receiver
+
+1. Add `CapturedResultReceiver` to your ViewController.
+
+
+ >- Objective-C
+ >- Swift
+ >
+ >1.
+ ```objc
+ @interface ViewController ()
+ ```
+ 2.
+ ```swift
+ class ViewController: UIViewController, CapturedResultReceiver {
+ ...
+ }
+ ```
+
+2. Implement `onNormalizedImagesReceived` method to receive the normalized images as the captured results.
+
+
+ >- Objective-C
+ >- Swift
+ >
+ >1.
+ ```objc
+ -(void)onNormalizedImagesReceived:(DSNormalizedImagesResult *)result
+ {
+ if (_implementCapture && result!=nil && result.items[0].imageData!=nil)
+ {
+ _implementCapture = false;
+ ImageViewController *imageViewController = [[ImageViewController alloc] init];
+ NSError * error;
+ imageViewController.resultUIImage = [result.items[0].imageData toUIImage:&error];
+ dispatch_async(dispatch_get_main_queue(), ^{ [self.navigationController pushViewController:imageViewController animated:YES];
+ });
+ }
+ }
+ ```
+ 2.
+ ```swift
+ func onNormalizedImagesReceived(_ result: NormalizedImagesResult) {
+ print("Normalized image received")
+ if let items = result.items, items.count > 0 {
+ guard let data = items[0].imageData else {
+ return
+ }
+ let resultView = ImageViewController()
+ resultView.data = data
+ if implementCapture
+ {
+ DispatchQueue.main.async {
+ self.present(resultView, animated: true)
+ }
+ }
+ }
+ }
+ ```
+
+3. Add the result receiver to the `CaptureVisionRouter`.
+
+
+ >- Objective-C
+ >- Swift
+ >
+ >1.
+ ```objc
+ - (void)setUpCvr
+ {
+ ...
+ NSError *cvrError;
+ [_cvr addResultReceiver:self error:&cvrError];
+ DSMultiFrameResultCrossFilter *filter = [[DSMultiFrameResultCrossFilter alloc] init];
+ [filter enableResultCrossVerification:DSCapturedResultItemTypeNormalizedImage isEnabled:true];
+ [_cvr addResultFilter:filter error:&cvrError];
+ }
+ ```
+ 2.
+ ```swift
+ func setUpCvr() {
+ try? cvr.addResultReceiver(self)
+ let filter = MultiFrameResultCrossFilter.init()
+ filter.enableResultCrossVerification(.normalizedImage, isEnabled: true)
+ try? cvr.addResultFilter(filter)
+ }
+ ```
+
+4. Add a `confirmCapture` button to confirm the result.
+
+
+ >- Objective-C
+ >- Swift
+ >
+ >1.
+ ```objc
+ @property (nonatomic, strong) UIButton *captureButton;
+ ...
+ - (void)addCaptureButton {
+ [self.view addSubview:self.captureButton];
+ }
+ - (UIButton *)captureButton {
+ NSLog(@"Start adding button");
+ CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;
+ CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;
+ if (!_captureButton) {
+ _captureButton = [UIButton buttonWithType:UIButtonTypeCustom];
+ _captureButton.frame = CGRectMake((screenWidth - 150) / 2.0, screenHeight - 100, 150, 50);
+ _captureButton.backgroundColor = [UIColor grayColor];
+ _captureButton.layer.cornerRadius = 10;
+ _captureButton.layer.borderColor = [UIColor darkGrayColor].CGColor;
+ [_captureButton setTitle:@"Capture" forState:UIControlStateNormal];
+ [_captureButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
+ [_captureButton addTarget:self action:@selector(setCapture) forControlEvents:UIControlEventTouchUpInside];
+ }
+ return _captureButton;
+ }
+ ```
+ 2.
+ ```swift
+ var captureButton:UIButton!
+ var implementCapture:Bool = false
+ ...
+ func addCaptureButton()
+ {
+ let w = UIScreen.main.bounds.size.width
+ let h = UIScreen.main.bounds.size.height
+ let SafeAreaBottomHeight: CGFloat = UIApplication.shared.statusBarFrame.size.height > 20 ? 34 : 0
+ let photoButton = UIButton(frame: CGRect(x: w / 2 - 60, y: h - 100 - SafeAreaBottomHeight, width: 120, height: 60))
+ photoButton.setTitle("Capture", for: .normal)
+ photoButton.backgroundColor = UIColor.green
+ photoButton.addTarget(self, action: #selector(confirmCapture), for: .touchUpInside)
+ DispatchQueue.main.async(execute: { [self] in
+ view.addSubview(photoButton)
+ })
+ }
+ @objc func confirmCapture()
+ {
+ implementCapture = true
+ }
+ ```
+
+#### Configure the methods viewDidLoad, viewWillAppear, and viewWillDisappear
+
+
+>- Objective-C
+>- Swift
+>
+>1.
+```objc
+- (void)viewDidLoad {
+ [super viewDidLoad];
+ [self setUpCamera];
+ [self setUpCvr];
+ [self addCaptureButton];
+}
+- (void)viewWillAppear:(BOOL)animated
+{
+ [super viewWillAppear:animated];
+ [_dce open];
+ NSError *cvrError;
+ [_cvr startCapturing:DSPresetTemplateDetectAndNormalizeDocument error:&cvrError];
+}
+- (void)viewWillDisappear:(BOOL)animated
+{
+ [super viewWillAppear:animated];
+ [_dce close];
+}
+```
+2.
+```swift
+override func viewDidLoad() {
+ super.viewDidLoad()
+ setUpCamera()
+ setUpCvr()
+ addCaptureButton()
+}
+override func viewWillAppear(_ animated: Bool) {
+ super.viewWillAppear(animated)
+ dce.open()
+ try? cvr.startCapturing(PresetTemplate.detectAndNormalizeDocument.rawValue)
+}
+override func viewWillDisappear(_ animated: Bool) {
+ super.viewWillDisappear(animated)
+ dce.close()
+}
+```
+
+#### Display the Normalized Image
+
+1. Create a new `UIViewController` class `ImageViewController`.
+
+2. Add a property `normalizedImage` to the header file of `ImageViewController` (Objective-C only).
+
+ ```objc
+ @property (nonatomic, strong) UIImage * normalizedImage;
+ ```
+
+2. Configure the `ImageViewController` to display the normalized image..
+
+
+ >- Objective-C
+ >- Swift
+ >
+ >1.
+ ```objc
+ #import "ImageViewController.h"
+ #import
+ @interface ImageViewController()
+ @property (nonatomic, strong) UIImageView *imageView;
+ @end
+ @implementation ImageViewController
+ -(void)viewDidLoad
+ {
+ NSLog(@"ImageViewController loaded");
+ [super viewDidLoad];
+ [self setUpView];
+ }
+ - (void)setUpView
+ {
+ _imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
+ [self.view addSubview:_imageView];
+ NSError *coreError;
+ [_imageView setContentMode:UIViewContentModeScaleAspectFit];
+ [_imageView setImage:self.normalizedImage];
+ }
+ @end
+ ```
+ 2.
+ ```swift
+ class ImageViewController: UIViewController{
+ var normalizedImage:UIImage!
+ var imageView:UIImageView!
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ setUpView()
+ }
+ func setUpView() {
+ imageView = UIImageView.init(frame: view.bounds)
+ imageView.contentMode = .scaleAspectFit
+ view.addSubview(imageView)
+ DispatchQueue.main.async { [self] in
+ imageView.image = normalizedImage
+ }
+ }
+ }
+ ```
+
+
+
+### Configure Camera Permissions
+
+Add **Privacy - Camera Usage Description** to the `info.plist` of your project to request camera permission. An easy way to do this is to access your project settings, go to *Info* and then add this Privacy property to the iOS target properties list.
+
+
+
+### Additional Steps for iOS 12.x or Lower Versions
+
+If your iOS version is 12.x or lower, please add the following additional steps:
+
+1. Remove the methods `application:didDiscardSceneSessions:` and `application:configurationForConnectingSceneSession:options:` from your `AppDelegate` file.
+2. Remove the `SceneDelegate.Swift` file (`SceneDelegate.h` & `SceneDelegate.m` for Objective-C).
+3. Remove the `Application Scene Manifest` from your info.plist file.
+4. Declaire the window in your `AppDelegate.Swift` file (`AppDelegate.h` for Objective-C).
+
+
+ >- Objective-C
+ >- Swift
+ >
+ >1.
+ ```objc
+ @interface AppDelegate : UIResponder
+ @property (strong, nonatomic) UIWindow *window;
+ @end
+ ```
+ 2.
+ ```swift
+ import UIKit
+ @main
+ class AppDelegate: UIResponder, UIApplicationDelegate {
+ var window: UIWindow?
+ }
+ ```
+
+
+
+### Build and Run the Project
+
+1. Select the device that you want to run your app on.
+2. Run the project, then your app will be installed on your device.
+
+> Note:
+>
+> - You can get the source code of the HelloWord app from the following link
+> - [Objective-C](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/ios/HelloWorld/AutoNormalizeObjc){:target="_blank"}.
+> - [Swift](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/ios/HelloWorld/AutoNormalize){:target="_blank"}.
diff --git a/programming/ios/user-guide.md b/programming/ios/user-guide.md
index 9070769..7c2a8e9 100644
--- a/programming/ios/user-guide.md
+++ b/programming/ios/user-guide.md
@@ -13,22 +13,38 @@ permalink: /programming/ios/user-guide.html
# Getting Started with iOS
-## Requirements
-
-- Supported OS: **iOS 11.0** or higher.
-- Supported ABI: **arm64** and **x86_64**.
-- Development Environment: Xcode 13.0 and above (Xcode 14.1+ recommended).
+- [System Requirements](#system-requirements)
+- [Build Your First Application](#build-your-first-application)
+ - [Create a New Project](#create-a-new-project)
+ - [Add the SDK](#add-the-sdk)
+ - [Add the Frameworks Manually](#add-the-frameworks-manually)
+ - [Add the Frameworks via CocoaPods](#add-the-frameworks-via-cocoapods)
+ - [Add the Frameworks via Swift Package Manager](#add-the-xcframeworks-via-swift-package-manager)
+ - [Main ViewController for Realtime Document Normalization](#main-viewcontroller-for-realtime-detection-of-quads)
+ - [Initialize License](#initialize-license)
+ - [Get Prepared with the Camera Module](#get-prepared-with-the-camera-module)
+ - [Initialize Capture Vision Router](#initialize-capture-vision-router)
+ - [Set up Result Receiver](#set-up-result-receiver)
+ - [Configure the methods viewDidLoad, viewWillAppear, and viewWillDisappear](#configure-the-methods-viewdidload-viewwillappear-and-viewwilldisappear)
+ - [Display the Normalized Image](#display-the-normalized-image)
+ - [Build and Run the Project](#build-and-run-the-project)
+
+## System Requirements
+
+- Supported OS: iOS 11 or higher (iOS 13 and higher recommended).
+- Supported ABI: arm64 and x86_64.
+- Development Environment: Xcode 13 and above (Xcode 14.1+ recommended).
## Build Your First Application
-In this section, let's see how to create a HelloWorld app for normalizing documents from camera video input.
+This guide will walk you through the process of creating a HelloWorld app for normalizing documents via a camera video input.
>Note:
>
-> - Xcode 14.0 is used here in this guide.
+> - Xcode 14.0 is used in this guide.
> - You can get the source code of the HelloWord app from the following link
-> - [Objective-C](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/ios/Objective-C/HelloWorld){:target="_blank"}.
-> - [Swift](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/ios/Swift/HelloWorld){:target="_blank"}.
+> - [Objective-C](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/ios/HelloWorld/AutoNormalizeObjc){:target="_blank"}.
+> - [Swift](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/ios/HelloWorld/AutoNormalize){:target="_blank"}.
### Create a New Project
@@ -48,21 +64,21 @@ There are three ways to add the SDK into your project - **Manually**, via **Coco
#### Add the Frameworks Manually
-1. Download the SDK package from the Dynamsoft website. After unzipping, you can find the following **xcframeworks** under the **Dynamsoft\Frameworks** directory:
+1. Download the SDK package from the Dynamsoft website. After unzipping, you can find the following **xcframeworks** under the **Dynamsoft\Frameworks** directory:
| File | Description |
| ---- | ----------- |
- | `DynamsoftDocumentNormalizer.xcframework` | The Dynamsoft Document Normalizer SDK, including document normalizer related APIs. |
- | `DynamsoftCore.xcframework` | The core library of Dynamsoft's capture vision SDKs, including basic structures and intermediate result related APIs. |
- | `DynamsoftCaptureVisionRouter.xcframework` | The CaptureVisionRouter is what a user uses to interact with image-processing and semantic-processing products in their applications. It accepts an image source and returns processing results which may contain Final results or Intermediate Results. |
- | `DynamsoftImageProcessing.xcframework` | The image processing library of Dynamsoft's capture vision SDKs, including image processing algorithms and APIs. |
- | `DynamsoftLicense.xcframework` | The module includes the licensing APIs. |
- | `DynamsoftCameraEnhancer.xcframework` | The Dynamsoft Camera Enhancer SDK, including camera control and frame preprocessing APIs. |
+ | `DynamsoftDocumentNormalizer.xcframework` | The Dynamsoft Document Normalizer SDK which includes the document normalizer related APIs. |
+ | `DynamsoftCore.xcframework` | The core library of the Dynamsoft Capture Vision SDK which includes basic structures and intermediate result related APIs. |
+ | `DynamsoftCaptureVisionRouter.xcframework` | The CaptureVisionRouter is used to coordinate the image-processing and semantic-processing products that are being used in the application. It accepts an image source and returns processing results which may contain final results or intermediate results. |
+ | `DynamsoftImageProcessing.xcframework` | The image processing library of the Dynamsoft Capture Vision SDK, and so includes the image processing algorithms and APIs. |
+ | `DynamsoftLicense.xcframework` | This module includes the licensing API. |
+ | `DynamsoftCameraEnhancer.xcframework` | The [Dynamsoft Camera Enhancer SDK]({{ site.dce_ios_api }}) defines the camera control and frame preprocessing API. |
| `DynamsoftUtility.xcframework (Optional)` | The module includes functional APIs that support you to integrate the input, filtering the results, generating result images, etc. |
-2. Drag and drop the above five **xcframeworks** into your Xcode project. Make sure to check Copy items if needed and Create groups to copy the framework into your project's folder.
+2. Drag and drop the above six (seven if the Utility framework is included) **xcframeworks** into your Xcode project. Make sure to check *Copy items if needed* and *Create groups* to properly copy the framework into your project's folder.
-3. Click on the project settings then go to **General –> Frameworks, Libraries, and Embedded Content**. Set the **Embed** field to **Embed & Sign** for all above **xcframeworks**.
+3. Click on the project settings then go to **General –> Frameworks, Libraries, and Embedded Content**. Set the **Embed** field to **Embed & Sign** for all included **xcframeworks**.
#### Add the Frameworks via CocoaPods
@@ -72,13 +88,13 @@ There are three ways to add the SDK into your project - **Manually**, via **Coco
target 'HelloWorld' do
use_frameworks!
- pod 'DynamsoftCaptureVisionRouter','2.0.21'
- pod 'DynamsoftDocumentNormalizer','2.0.20'
- pod 'DynamsoftCameraEnhancer','4.0.2'
- pod 'DynamsoftCore','3.0.20'
- pod 'DynamsoftLicense','3.0.30'
- pod 'DynamsoftImageProcessing','2.0.21'
- pod 'DynamsoftUtility','1.0.21'
+ pod 'DynamsoftCaptureVisionRouter','2.2.10'
+ pod 'DynamsoftDocumentNormalizer','2.2.10'
+ pod 'DynamsoftCameraEnhancer','4.2.0'
+ pod 'DynamsoftCore','3.2.10'
+ pod 'DynamsoftLicense','3.2.10'
+ pod 'DynamsoftImageProcessing','2.2.10'
+ pod 'DynamsoftUtility','1.2.10'
end
```
@@ -89,7 +105,7 @@ There are three ways to add the SDK into your project - **Manually**, via **Coco
pod install
```
-### Add the xcframeworks via Swift Package Manager
+#### Add the xcframeworks via Swift Package Manager
1. In your Xcode project, go to **File --> AddPackages**.
@@ -101,32 +117,7 @@ There are three ways to add the SDK into your project - **Manually**, via **Coco
-### Main ViewController for Realtime Detection of Quads
-
-In the main view controller, your app will scan documents via video streaming and display the detect quadrilateral area on the screen. First of all, import the headers in the ViewController file.
-
-
- >- Objective-C
- >- Swift
- >
- >1.
- ```objc
- #import
- #import
- #import
- #import
- #import
- ```
- 2.
- ```swift
- import DynamsoftCore
- import DynamsoftCaptureVisionRouter
- import DynamsoftDocumentNormalizer
- import DynamsoftUtility
- import DynamsoftCameraEnhancer
- ```
-
-#### Initialize License
+### Initialize License
Initialize the license first. It is suggested to initialize the license in `AppDelegate` file.
@@ -178,7 +169,34 @@ class AppDelegate: UIResponder, UIApplicationDelegate, LicenseVerificationListen
>
>- Network connection is required for the license to work.
>- The license string here will grant you a time-limited trial license.
->- If the license has expired, you can go to the customer portal to request for an extension.
+>- If the license has expired, you can go to the customer portal to request for an extension.
+
+
+
+### Main ViewController for Realtime Detection of Quads
+
+In the main view controller, your app will scan documents via video streaming and display the detect quadrilateral area on the screen. First of all, import the headers in the ViewController file.
+
+
+ >- Objective-C
+ >- Swift
+ >
+ >1.
+ ```objc
+ #import
+ #import
+ #import
+ #import
+ #import
+ ```
+ 2.
+ ```swift
+ import DynamsoftCore
+ import DynamsoftCaptureVisionRouter
+ import DynamsoftDocumentNormalizer
+ import DynamsoftUtility
+ import DynamsoftCameraEnhancer
+ ```
#### Get Prepared with the Camera Module
@@ -230,7 +248,7 @@ func setUpCamera() {
#### Initialize Capture Vision Router
-Declare and create an instance of `CaptureVisionRouter`.
+Once the camera component is set up, declare and create an instance of `CaptureVisionRouter` and set its input to the Camera Enhancer object you created in the last step.
>- Objective-C
@@ -253,9 +271,7 @@ func setUpDCV() {
}
```
-#### Set the CameraEnhancer as the Input
-
-Include and initialize the `DynamsoftDocumentNormalizer`, bind to the created `CameraEnhancer` instance.
+Bind your `CaptureVisionRouter` instance with the created `CameraEnhancer` instance.
>- Objective-C
@@ -527,6 +543,38 @@ override func viewWillDisappear(_ animated: Bool) {
+### Configure Camera Permissions
+
+Add **Privacy - Camera Usage Description** to the `info.plist` of your project to request camera permission. An easy way to do this is to access your project settings, go to *Info* and then add this Privacy property to the iOS target properties list.
+
+### Additional Steps for iOS 12.x or Lower Versions
+
+If your iOS version is 12.x or lower, please add the following additional steps:
+
+1. Remove the methods `application:didDiscardSceneSessions:` and `application:configurationForConnectingSceneSession:options:` from your `AppDelegate` file.
+2. Remove the `SceneDelegate.Swift` file (`SceneDelegate.h` & `SceneDelegate.m` for Objective-C).
+3. Remove the `Application Scene Manifest` from your info.plist file.
+4. Declaire the window in your `AppDelegate.Swift` file (`AppDelegate.h` for Objective-C).
+
+
+ >- Objective-C
+ >- Swift
+ >
+ >1.
+ ```objc
+ @interface AppDelegate : UIResponder
+ @property (strong, nonatomic) UIWindow *window;
+ @end
+ ```
+ 2.
+ ```swift
+ import UIKit
+ @main
+ class AppDelegate: UIResponder, UIApplicationDelegate {
+ var window: UIWindow?
+ }
+ ```
+
### Build and Run the Project
1. Select the device that you want to run your app on.
@@ -535,5 +583,5 @@ override func viewWillDisappear(_ animated: Bool) {
> Note:
>
> - You can get the source code of the HelloWord app from the following link
-> - [Objective-C](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/ios/Objective-C/HelloWorld){:target="_blank"}.
-> - [Swift](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/ios/Swift/HelloWorld){:target="_blank"}.
+> - [Objective-C](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/ios/HelloWorld/AutoNormalizeObjc){:target="_blank"}.
+> - [Swift](https://github.com/Dynamsoft/document-normalizer-mobile-samples/tree/main/ios/HelloWorld/AutoNormalize){:target="_blank"}.