@exige/web-scanner-sdk 0.2.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +330 -0
- package/dist/assets/document-worker.js +2 -0
- package/dist/assets/document-worker.js.map +1 -0
- package/dist/assets/ort-wasm-simd-threaded.jsep.mjs +108 -0
- package/dist/assets/ort-wasm-simd-threaded.jsep.wasm +0 -0
- package/dist/assets/ort.min.js +2937 -0
- package/dist/assets/ort.min.js.map +1 -0
- package/dist/assets/tesseract/eng.traineddata.LICENSE +201 -0
- package/dist/assets/tesseract/eng.traineddata.NOTICE +9 -0
- package/dist/assets/tesseract/eng.traineddata.gz +0 -0
- package/dist/assets/tesseract/tesseract-core-lstm.wasm.js +191 -0
- package/dist/assets/tesseract/tesseract-core-relaxedsimd-lstm.wasm.js +191 -0
- package/dist/assets/tesseract/tesseract-core-simd-lstm.wasm.js +191 -0
- package/dist/assets/tesseract/tesseract.js-core.LICENSE +202 -0
- package/dist/assets/tesseract/tesseract.js.LICENSE +201 -0
- package/dist/assets/tesseract/worker.min.js +3 -0
- package/dist/assets/tesseract/worker.min.js.LICENSE.txt +12 -0
- package/dist/assets-manifest.json +11 -0
- package/dist/components/ModelDownloadRing.d.ts +4 -0
- package/dist/components/scanner-camera-overlay.css +2 -0
- package/dist/finder-DFueuWuS.js +1225 -0
- package/dist/finder-DFueuWuS.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/live-overlay-geometry.d.ts +11 -0
- package/dist/react/context.d.ts +2 -0
- package/dist/react/hooks.d.ts +3 -0
- package/dist/react/parts.d.ts +16 -0
- package/dist/react/scanner-context.d.ts +5 -0
- package/dist/react/types.d.ts +113 -0
- package/dist/react.d.ts +4 -0
- package/dist/react.js +594 -0
- package/dist/react.js.map +1 -0
- package/dist/scanner-sdk.js +1001 -0
- package/dist/scanner-sdk.js.map +1 -0
- package/dist/sdk/camera.d.ts +150 -0
- package/dist/sdk/display-quad.d.ts +23 -0
- package/dist/sdk/errors.d.ts +14 -0
- package/dist/sdk/face-model.d.ts +22 -0
- package/dist/sdk/field-model.d.ts +29 -0
- package/dist/sdk/finder-simulator.d.ts +17 -0
- package/dist/sdk/finder.d.ts +174 -0
- package/dist/sdk/frame-geometry.d.ts +6 -0
- package/dist/sdk/image.d.ts +18 -0
- package/dist/sdk/license-codec.d.ts +2 -0
- package/dist/sdk/license-public-key.d.ts +9 -0
- package/dist/sdk/license-runtime.d.ts +2 -0
- package/dist/sdk/license.d.ts +84 -0
- package/dist/sdk/lighting.d.ts +22 -0
- package/dist/sdk/model-download.d.ts +25 -0
- package/dist/sdk/ocr-runtime.d.ts +27 -0
- package/dist/sdk/ocr.d.ts +104 -0
- package/dist/sdk/ort-runtime.d.ts +23 -0
- package/dist/sdk/programmatic-redaction.d.ts +151 -0
- package/dist/sdk/redact.d.ts +17 -0
- package/dist/sdk/scan.d.ts +61 -0
- package/dist/sdk/types.d.ts +80 -0
- package/package.json +93 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { type OrtWasmPaths } from './ort-runtime';
|
|
2
|
+
import type { DocumentCorners, DocumentDetectionResult, ImageSource, ScanResult } from './types';
|
|
3
|
+
export interface ScanOptions {
|
|
4
|
+
minDimension?: number;
|
|
5
|
+
minConfidence?: number;
|
|
6
|
+
maxAnalysisDimension?: number;
|
|
7
|
+
maxOutputDimension?: number;
|
|
8
|
+
useWorker?: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* DocAligner checkpoint URL. Omit this. The default is the Exige CDN
|
|
11
|
+
* DocAligner model (`DEFAULT_DOCUMENT_MODEL_URL`).
|
|
12
|
+
*/
|
|
13
|
+
modelUrl?: string;
|
|
14
|
+
/** Heatmap threshold used before largest-component corner centroids. */
|
|
15
|
+
heatmapThreshold?: number;
|
|
16
|
+
/** Reuse model bytes through the browser HTTP cache. */
|
|
17
|
+
cacheModel?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* ONNX Runtime wasm override. Omit this. The default is the packaged
|
|
20
|
+
* `ort-wasm-simd-threaded.jsep.wasm` and `.mjs` files.
|
|
21
|
+
* A string is a directory that contains both files. An object sets each URL.
|
|
22
|
+
*/
|
|
23
|
+
ortWasmPaths?: OrtWasmPaths;
|
|
24
|
+
}
|
|
25
|
+
export declare const DEFAULT_DOCUMENT_MODEL_URL = "https://exige-scanner-sdk.vercel.app/models/docaligner-lcnet100-f4117b78.onnx";
|
|
26
|
+
export declare function resolveDocumentModelUrl(modelUrl?: string): string;
|
|
27
|
+
export declare function perspectiveOutputSize(corners: DocumentCorners, maxDimension: number): {
|
|
28
|
+
width: number;
|
|
29
|
+
height: number;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Finds document corners. Returns `success`, `no-document`, `low-confidence`,
|
|
33
|
+
* or `low-quality`. A bad image is one of those statuses and does not throw.
|
|
34
|
+
* Inference or geometry failure is `modelStatus: 'failed'`, not a throw.
|
|
35
|
+
*
|
|
36
|
+
* @throws {LicenseError} LicenseError when the scan feature is not licensed. Detection does not start.
|
|
37
|
+
* @throws {ScannerError} ScannerError `canvas` when canvas 2D is unavailable.
|
|
38
|
+
* `worker` when the document worker cannot start.
|
|
39
|
+
* `model-http` when the DocAligner file returns a failed HTTP response.
|
|
40
|
+
*/
|
|
41
|
+
export declare function detectDocument(source: ImageSource, options?: ScanOptions): Promise<DocumentDetectionResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Perspective-crops `corners` onto a new canvas.
|
|
44
|
+
* Resolves with `status: 'success'`. It does not score image quality.
|
|
45
|
+
*
|
|
46
|
+
* @throws {LicenseError} LicenseError when the scan feature is not licensed.
|
|
47
|
+
* @throws {ScannerError} ScannerError `canvas` when canvas 2D is unavailable.
|
|
48
|
+
*/
|
|
49
|
+
export declare function cropDocument(source: ImageSource, corners: DocumentCorners, options?: Pick<ScanOptions, 'maxOutputDimension'>): Promise<ScanResult>;
|
|
50
|
+
/**
|
|
51
|
+
* Detects a document and perspective-crops it.
|
|
52
|
+
* Returns `success`, `no-document`, `low-confidence`, or `low-quality`.
|
|
53
|
+
* A bad image is one of those statuses and does not throw.
|
|
54
|
+
* Inference or geometry failure is `modelStatus: 'failed'`, not a throw.
|
|
55
|
+
*
|
|
56
|
+
* @throws {LicenseError} LicenseError when the scan feature is not licensed. Detection does not start.
|
|
57
|
+
* @throws {ScannerError} ScannerError `canvas` when canvas 2D is unavailable.
|
|
58
|
+
* `worker` when the document worker cannot start.
|
|
59
|
+
* `model-http` when the DocAligner file returns a failed HTTP response.
|
|
60
|
+
*/
|
|
61
|
+
export declare function scanDocument(source: ImageSource, options?: ScanOptions): Promise<ScanResult>;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export type ImageSource = Blob | HTMLImageElement | HTMLCanvasElement | ImageBitmap;
|
|
2
|
+
export interface Point {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
}
|
|
6
|
+
export interface Box {
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
width: number;
|
|
10
|
+
height: number;
|
|
11
|
+
}
|
|
12
|
+
export interface DocumentCorners {
|
|
13
|
+
topLeft: Point;
|
|
14
|
+
topRight: Point;
|
|
15
|
+
bottomRight: Point;
|
|
16
|
+
bottomLeft: Point;
|
|
17
|
+
}
|
|
18
|
+
export interface DocumentEdge {
|
|
19
|
+
start: Point;
|
|
20
|
+
end: Point;
|
|
21
|
+
}
|
|
22
|
+
export interface DocumentQuad extends DocumentCorners {
|
|
23
|
+
edges: {
|
|
24
|
+
top: DocumentEdge;
|
|
25
|
+
right: DocumentEdge;
|
|
26
|
+
bottom: DocumentEdge;
|
|
27
|
+
left: DocumentEdge;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export type DocumentDetectionStatus = 'success' | 'no-document' | 'low-confidence' | 'low-quality';
|
|
31
|
+
export type DocumentModelStatus = 'loading' | 'ready' | 'failed';
|
|
32
|
+
export interface DocumentDetectionResult {
|
|
33
|
+
status: DocumentDetectionStatus;
|
|
34
|
+
quad?: DocumentQuad;
|
|
35
|
+
corners?: DocumentCorners;
|
|
36
|
+
confidence: number;
|
|
37
|
+
message: string;
|
|
38
|
+
sourceWidth: number;
|
|
39
|
+
sourceHeight: number;
|
|
40
|
+
detector?: 'ml';
|
|
41
|
+
modelStatus?: DocumentModelStatus;
|
|
42
|
+
modelProvider?: 'webgpu' | 'wasm';
|
|
43
|
+
modelError?: string;
|
|
44
|
+
inferenceMs?: number;
|
|
45
|
+
}
|
|
46
|
+
export interface ScanResult extends DocumentDetectionResult {
|
|
47
|
+
canvas?: HTMLCanvasElement;
|
|
48
|
+
}
|
|
49
|
+
export interface OcrResult {
|
|
50
|
+
/** Text rebuilt from words that meet OcrOptions.minConfidence. */
|
|
51
|
+
text: string;
|
|
52
|
+
/** Arithmetic mean of retained word confidence, normalized 0–1; 0 when empty. */
|
|
53
|
+
confidence: number;
|
|
54
|
+
language: string;
|
|
55
|
+
imageWidth: number;
|
|
56
|
+
imageHeight: number;
|
|
57
|
+
diagnostics?: OcrDiagnostics;
|
|
58
|
+
words?: OcrBox[];
|
|
59
|
+
characters?: OcrBox[];
|
|
60
|
+
}
|
|
61
|
+
export interface OcrDiagnostics {
|
|
62
|
+
shadowPassUsed: boolean;
|
|
63
|
+
castShadowStrength: number;
|
|
64
|
+
shadowRegion?: Box;
|
|
65
|
+
}
|
|
66
|
+
export interface OcrBox {
|
|
67
|
+
text: string;
|
|
68
|
+
/** Token confidence normalized to 0–1. */
|
|
69
|
+
confidence: number;
|
|
70
|
+
bbox: Box;
|
|
71
|
+
}
|
|
72
|
+
export interface RedactionRegion extends Box {
|
|
73
|
+
mode?: 'blackout' | 'blur';
|
|
74
|
+
}
|
|
75
|
+
export interface RedactOptions {
|
|
76
|
+
mode?: 'blackout' | 'blur';
|
|
77
|
+
blurRadius?: number;
|
|
78
|
+
mimeType?: 'image/png' | 'image/jpeg' | 'image/webp';
|
|
79
|
+
quality?: number;
|
|
80
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@exige/web-scanner-sdk",
|
|
3
|
+
"version": "0.2.9",
|
|
4
|
+
"description": "@exige/web-scanner-sdk is a client-side web document scanner SDK. ML document finding, OCR, and redaction run in the browser. The public demo is the only path that does not need an account. A hostname you control needs a signed license key.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"sideEffects": [
|
|
8
|
+
"**/*.css"
|
|
9
|
+
],
|
|
10
|
+
"publishConfig": {
|
|
11
|
+
"access": "public"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist"
|
|
15
|
+
],
|
|
16
|
+
"main": "./dist/scanner-sdk.js",
|
|
17
|
+
"module": "./dist/scanner-sdk.js",
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"import": "./dist/scanner-sdk.js"
|
|
23
|
+
},
|
|
24
|
+
"./react": {
|
|
25
|
+
"types": "./dist/react.d.ts",
|
|
26
|
+
"import": "./dist/react.js"
|
|
27
|
+
},
|
|
28
|
+
"./camera-overlay.css": "./dist/components/scanner-camera-overlay.css",
|
|
29
|
+
"./assets/document-worker.js": "./dist/assets/document-worker.js",
|
|
30
|
+
"./assets/ort.min.js": "./dist/assets/ort.min.js",
|
|
31
|
+
"./assets/ort-wasm-simd-threaded.jsep.wasm": "./dist/assets/ort-wasm-simd-threaded.jsep.wasm",
|
|
32
|
+
"./assets/ort-wasm-simd-threaded.jsep.mjs": "./dist/assets/ort-wasm-simd-threaded.jsep.mjs",
|
|
33
|
+
"./assets/tesseract/worker.min.js": "./dist/assets/tesseract/worker.min.js",
|
|
34
|
+
"./assets/tesseract/tesseract-core-lstm.wasm.js": "./dist/assets/tesseract/tesseract-core-lstm.wasm.js",
|
|
35
|
+
"./assets/tesseract/tesseract-core-simd-lstm.wasm.js": "./dist/assets/tesseract/tesseract-core-simd-lstm.wasm.js",
|
|
36
|
+
"./assets/tesseract/tesseract-core-relaxedsimd-lstm.wasm.js": "./dist/assets/tesseract/tesseract-core-relaxedsimd-lstm.wasm.js",
|
|
37
|
+
"./assets/tesseract/eng.traineddata.gz": "./dist/assets/tesseract/eng.traineddata.gz",
|
|
38
|
+
"./assets-manifest.json": "./dist/assets-manifest.json"
|
|
39
|
+
},
|
|
40
|
+
"scripts": {
|
|
41
|
+
"dev": "vite --config vite.config.app.ts",
|
|
42
|
+
"build": "npm run build:lib && npm run build:demo",
|
|
43
|
+
"build:wasm": "node scripts/build-scanner-wasm.mjs",
|
|
44
|
+
"prepare": "node scripts/copy-runtime-assets.mjs && node scripts/build-scanner-wasm.mjs",
|
|
45
|
+
"build:lib": "node scripts/copy-runtime-assets.mjs && tsc -b && vite build && tsc -p tsconfig.lib.json",
|
|
46
|
+
"build:demo": "node scripts/copy-runtime-assets.mjs && tsc -b && vite build --config vite.config.app.ts",
|
|
47
|
+
"vercel-build": "npm run build:demo",
|
|
48
|
+
"typecheck": "tsc -b",
|
|
49
|
+
"test": "node scripts/copy-runtime-assets.mjs && vitest run && node --test native/wasm/decode.test.mjs",
|
|
50
|
+
"test:wasm": "node --test native/wasm/decode.test.mjs",
|
|
51
|
+
"lint": "oxlint",
|
|
52
|
+
"preview": "vite preview --config vite.config.app.ts",
|
|
53
|
+
"docs:api": "typedoc",
|
|
54
|
+
"docs:dev": "npm run docs:api && vitepress dev site --host 0.0.0.0 --port 43261",
|
|
55
|
+
"docs:build": "npm run docs:api && vitepress build site",
|
|
56
|
+
"docs:preview": "vitepress preview site --host 0.0.0.0 --port 43261",
|
|
57
|
+
"docs:vercel": "npm run docs:build && node docs-mcp/assemble-vercel-output.mjs",
|
|
58
|
+
"docs:mcp": "node docs-mcp/server.mjs",
|
|
59
|
+
"docs:mcp:http": "node docs-mcp/server.mjs --http --host 127.0.0.1 --port 8787",
|
|
60
|
+
"dev:portal": "npm --prefix license-portal run dev",
|
|
61
|
+
"test:portal": "npm --prefix license-portal test"
|
|
62
|
+
},
|
|
63
|
+
"dependencies": {
|
|
64
|
+
"onnxruntime-web": "^1.30.0",
|
|
65
|
+
"tesseract.js": "^7.0.0"
|
|
66
|
+
},
|
|
67
|
+
"peerDependencies": {
|
|
68
|
+
"react": ">=18"
|
|
69
|
+
},
|
|
70
|
+
"peerDependenciesMeta": {
|
|
71
|
+
"react": {
|
|
72
|
+
"optional": true
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
"devDependencies": {
|
|
76
|
+
"@tesseract.js-data/eng": "1.0.0",
|
|
77
|
+
"@types/node": "^24.13.3",
|
|
78
|
+
"@types/react": "^19.2.18",
|
|
79
|
+
"@types/react-dom": "^19.2.7",
|
|
80
|
+
"@vitejs/plugin-react": "^6.1.1",
|
|
81
|
+
"happy-dom": "^20.14.5",
|
|
82
|
+
"oxlint": "^1.81.0",
|
|
83
|
+
"react": "^19.2.8",
|
|
84
|
+
"react-dom": "^19.2.8",
|
|
85
|
+
"typedoc": "^0.28.20",
|
|
86
|
+
"typedoc-plugin-markdown": "^4.13.1",
|
|
87
|
+
"typescript": "~6.0.2",
|
|
88
|
+
"vite": "^8.3.0",
|
|
89
|
+
"vitepress": "^1.6.4",
|
|
90
|
+
"vitepress-plugin-llms": "^1.14.0",
|
|
91
|
+
"vitest": "^5.0.1"
|
|
92
|
+
}
|
|
93
|
+
}
|