@jaak.ai/stamps 1.0.0-dev.8 → 1.0.0-dev.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 CHANGED
@@ -3,112 +3,83 @@
3
3
  ![Versión NPM](https://img.shields.io/npm/v/@jaak.ai/stamps)
4
4
  ![Licencia](https://img.shields.io/npm/l/@jaak.ai/stamps)
5
5
 
6
- Un componente web potente y personalizable para la identificación de documentos en aplicaciones web modernas. Construido con Stencil.js para un escaneo e identificación de documentos confiable.
7
-
8
- ## Características
9
-
10
- - Escaneo e identificación de documentos con alta precisión
11
- - Funciona tanto con cámara como con carga de imágenes
12
- - Interfaz y comportamiento personalizables
13
- - Eventos para una integración completa con el flujo de tu aplicación
14
- - Compatibilidad con múltiples navegadores
15
- - Paquete ligero
16
-
17
6
  ## Instalación
18
7
 
19
8
  ```bash
20
9
  npm install @jaak.ai/stamps
21
10
  ```
22
11
 
23
- ## Uso
24
-
25
- ### Integración Básica
12
+ ## Uso Básico
26
13
 
27
- #### HTML
14
+ ### HTML
28
15
 
29
16
  ```html
30
17
  <!DOCTYPE html>
31
- <html lang="es">
18
+ <html>
32
19
  <head>
33
- <meta charset="UTF-8">
34
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
20
+ <meta charset="utf-8">
35
21
  <title>Ejemplo de Detector de Documentos</title>
36
- <script type="module" src="https://unpkg.com/@jaak.ai/stamps/dist/stamps/stamps.esm.js"></script>
37
- <script nomodule src="https://unpkg.com/@jaak.ai/stamps/dist/stamps/stamps.js"></script>
22
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@jaak.ai/stamps/dist/stamps/stamps.esm.js"></script>
23
+ <script nomodule src="https://cdn.jsdelivr.net/npm/@jaak.ai/stamps/dist/stamps/stamps.js"></script>
38
24
  </head>
39
25
  <body>
40
26
  <document-detector
41
- license-key="TU_CLAVE_DE_LICENCIA"
42
- engine-location="https://storage.googleapis.com/jaak-storage/models/web/document-detector/v2.0.0"
43
- worker-location="https://storage.googleapis.com/jaak-storage/models/web/document-detector/v2.0.0/BlinkIDWasmSDK.worker.min.js">
27
+ license-key="TU_CLAVE_DE_LICENCIA">
44
28
  </document-detector>
45
29
 
46
30
  <script>
47
31
  const detector = document.querySelector('document-detector');
48
-
49
- detector.addEventListener('ready', (ev) => {
50
- console.log('El detector de documentos está listo');
51
- });
52
32
 
53
- detector.addEventListener('scanSuccess', (ev) => {
54
- console.log('Escaneo completado con éxito', ev.detail);
33
+ // Escuchar los eventos emitidos directamente por el componente
34
+ detector.addEventListener('status', (ev) => {
35
+ console.log('Estado del detector:', ev.detail);
55
36
  });
56
37
 
57
- detector.addEventListener('scanError', (ev) => {
58
- console.error('Error de escaneo', ev.detail);
38
+ detector.addEventListener('results', (ev) => {
39
+ console.log('Resultados del escaneo:', ev.detail);
59
40
  });
60
41
 
61
- detector.addEventListener('fatalError', (ev) => {
62
- console.error('Error fatal', ev.detail);
63
- });
42
+ // Iniciar el escaneo por cámara cuando el componente esté listo
43
+ setTimeout(() => {
44
+ detector.startCameraScan();
45
+ }, 1000);
64
46
  </script>
65
47
  </body>
66
48
  </html>
67
49
  ```
68
50
 
69
- #### Frameworks de JavaScript
70
-
71
- ##### React
51
+ ### React
72
52
 
73
53
  ```jsx
74
54
  import React, { useEffect, useRef } from 'react';
75
- import { defineCustomElements } from '@jaak.ai/stamps/loader';
55
+ import '@jaak.ai/stamps';
76
56
 
77
- // Registrar los componentes web
78
- defineCustomElements();
79
-
80
- function ComponenteEscánerDocumento() {
57
+ function DocumentDetectorComponent() {
81
58
  const detectorRef = useRef(null);
82
59
 
83
60
  useEffect(() => {
84
61
  const detector = detectorRef.current;
85
-
86
- const handleReady = (ev) => {
87
- console.log('El detector de documentos está listo');
88
- };
89
62
 
90
- const handleScanSuccess = (ev) => {
91
- console.log('Escaneo completado con éxito', ev.detail);
63
+ // Escuchar los eventos emitidos directamente por el componente
64
+ const handleStatus = (ev) => {
65
+ console.log('Estado del detector:', ev.detail);
92
66
  };
93
67
 
94
- const handleScanError = (ev) => {
95
- console.error('Error de escaneo', ev.detail);
68
+ const handleResults = (ev) => {
69
+ console.log('Resultados del escaneo:', ev.detail);
96
70
  };
97
71
 
98
- const handleFatalError = (ev) => {
99
- console.error('Error fatal', ev.detail);
100
- };
72
+ detector.addEventListener('status', handleStatus);
73
+ detector.addEventListener('results', handleResults);
101
74
 
102
- detector.addEventListener('ready', handleReady);
103
- detector.addEventListener('scanSuccess', handleScanSuccess);
104
- detector.addEventListener('scanError', handleScanError);
105
- detector.addEventListener('fatalError', handleFatalError);
75
+ // Iniciar el escaneo por cámara cuando el componente esté listo
76
+ setTimeout(() => {
77
+ detector.startCameraScan();
78
+ }, 1000);
106
79
 
107
80
  return () => {
108
- detector.removeEventListener('ready', handleReady);
109
- detector.removeEventListener('scanSuccess', handleScanSuccess);
110
- detector.removeEventListener('scanError', handleScanError);
111
- detector.removeEventListener('fatalError', handleFatalError);
81
+ detector.removeEventListener('status', handleStatus);
82
+ detector.removeEventListener('results', handleResults);
112
83
  };
113
84
  }, []);
114
85
 
@@ -116,270 +87,386 @@ function ComponenteEscánerDocumento() {
116
87
  <document-detector
117
88
  ref={detectorRef}
118
89
  license-key="TU_CLAVE_DE_LICENCIA"
119
- engine-location="https://storage.googleapis.com/jaak-storage/models/web/document-detector/v2.0.0"
120
- worker-location="https://storage.googleapis.com/jaak-storage/models/web/document-detector/v2.0.0/BlinkIDWasmSDK.worker.min.js">
121
- </document-detector>
90
+ />
122
91
  );
123
92
  }
124
93
 
125
- export default ComponenteEscánerDocumento;
94
+ export default DocumentDetectorComponent;
126
95
  ```
127
96
 
128
- ##### Vue.js
129
-
130
- ```javascript
131
- // main.js
132
- import { defineCustomElements } from '@jaak.ai/stamps/loader';
133
-
134
- // Registrar los componentes web
135
- defineCustomElements();
136
- ```
97
+ ### Vue.js
137
98
 
138
99
  ```vue
139
- <!-- EscánerDocumento.vue -->
140
100
  <template>
141
101
  <document-detector
142
102
  ref="detector"
143
103
  :license-key="licenseKey"
144
- :engine-location="engineLocation"
145
- :worker-location="workerLocation">
146
- </document-detector>
104
+ />
147
105
  </template>
148
106
 
149
107
  <script>
108
+ import '@jaak.ai/stamps';
109
+
150
110
  export default {
151
- name: 'EscánerDocumento',
111
+ name: 'DocumentDetectorComponent',
152
112
  data() {
153
113
  return {
154
- licenseKey: 'TU_CLAVE_DE_LICENCIA',
155
- engineLocation: 'https://storage.googleapis.com/jaak-storage/models/web/document-detector/v2.0.0',
156
- workerLocation: 'https://storage.googleapis.com/jaak-storage/models/web/document-detector/v2.0.0/BlinkIDWasmSDK.worker.min.js'
114
+ licenseKey: 'TU_CLAVE_DE_LICENCIA'
157
115
  };
158
116
  },
117
+ methods: {
118
+ // Métodos para manejar los eventos emitidos directamente por el componente
119
+ handleStatus(ev) {
120
+ console.log('Estado del detector:', ev.detail);
121
+ },
122
+ handleResults(ev) {
123
+ console.log('Resultados del escaneo:', ev.detail);
124
+ }
125
+ },
159
126
  mounted() {
160
127
  const detector = this.$refs.detector;
161
-
162
- detector.addEventListener('ready', this.handleReady);
163
- detector.addEventListener('scanSuccess', this.handleScanSuccess);
164
- detector.addEventListener('scanError', this.handleScanError);
165
- detector.addEventListener('fatalError', this.handleFatalError);
128
+
129
+ // Escuchar los eventos emitidos directamente por el componente
130
+ detector.addEventListener('status', this.handleStatus);
131
+ detector.addEventListener('results', this.handleResults);
132
+
133
+ // Iniciar el escaneo por cámara cuando el componente esté listo
134
+ setTimeout(() => {
135
+ detector.startCameraScan();
136
+ }, 1000);
166
137
  },
167
138
  beforeUnmount() {
168
139
  const detector = this.$refs.detector;
169
-
170
- detector.removeEventListener('ready', this.handleReady);
171
- detector.removeEventListener('scanSuccess', this.handleScanSuccess);
172
- detector.removeEventListener('scanError', this.handleScanError);
173
- detector.removeEventListener('fatalError', this.handleFatalError);
174
- },
175
- methods: {
176
- handleReady(ev) {
177
- console.log('El detector de documentos está listo');
178
- },
179
- handleScanSuccess(ev) {
180
- console.log('Escaneo completado con éxito', ev.detail);
181
- this.$emit('scan-success', ev.detail);
182
- },
183
- handleScanError(ev) {
184
- console.error('Error de escaneo', ev.detail);
185
- this.$emit('scan-error', ev.detail);
186
- },
187
- handleFatalError(ev) {
188
- console.error('Error fatal', ev.detail);
189
- this.$emit('fatal-error', ev.detail);
190
- }
140
+
141
+ // Eliminar los event listeners
142
+ detector.removeEventListener('status', this.handleStatus);
143
+ detector.removeEventListener('results', this.handleResults);
191
144
  }
192
145
  };
193
146
  </script>
194
147
  ```
195
148
 
196
- ##### Angular
197
-
198
- ```typescript
199
- // app.module.ts
200
- import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
201
- import { BrowserModule } from '@angular/platform-browser';
202
- import { AppComponent } from './app.component';
203
-
204
- // Importar el cargador
205
- import { defineCustomElements } from '@jaak.ai/stamps/loader';
206
-
207
- // Registrar los componentes web
208
- defineCustomElements();
209
-
210
- @NgModule({
211
- declarations: [AppComponent],
212
- imports: [BrowserModule],
213
- providers: [],
214
- bootstrap: [AppComponent],
215
- schemas: [CUSTOM_ELEMENTS_SCHEMA] // Necesario para usar componentes web
216
- })
217
- export class AppModule {}
218
- ```
149
+ ### Angular
219
150
 
220
151
  ```typescript
221
- // escaner-documento.component.ts
222
- import { Component, ElementRef, EventEmitter, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';
152
+ // Asegúrate de configurar el esquema CUSTOM_ELEMENTS_SCHEMA en tu módulo
153
+ import { Component, ViewChild, ElementRef, AfterViewInit, OnDestroy } from '@angular/core';
154
+ import '@jaak.ai/stamps';
223
155
 
224
156
  @Component({
225
- selector: 'app-escaner-documento',
157
+ selector: 'app-document-detector',
226
158
  template: `
227
159
  <document-detector
228
160
  #detector
229
- license-key="TU_CLAVE_DE_LICENCIA"
230
- engine-location="https://storage.googleapis.com/jaak-storage/models/web/document-detector/v2.0.0"
231
- worker-location="https://storage.googleapis.com/jaak-storage/models/web/document-detector/v2.0.0/BlinkIDWasmSDK.worker.min.js">
232
- </document-detector>
161
+ [attr.license-key]="licenseKey"
162
+ ></document-detector>
233
163
  `
234
164
  })
235
- export class EscanerDocumentoComponent implements OnInit, OnDestroy {
165
+ export class DocumentDetectorComponent implements AfterViewInit, OnDestroy {
236
166
  @ViewChild('detector') detectorRef: ElementRef;
237
- @Output() ready = new EventEmitter<any>();
238
- @Output() scanSuccess = new EventEmitter<any>();
239
- @Output() scanError = new EventEmitter<any>();
240
- @Output() fatalError = new EventEmitter<any>();
167
+ licenseKey = 'TU_CLAVE_DE_LICENCIA';
241
168
 
242
- ngOnInit() {}
169
+ // Métodos para manejar los eventos emitidos directamente por el componente
170
+ handleStatus(ev) {
171
+ console.log('Estado del detector:', ev.detail);
172
+ }
173
+
174
+ handleResults(ev) {
175
+ console.log('Resultados del escaneo:', ev.detail);
176
+ }
243
177
 
244
178
  ngAfterViewInit() {
245
179
  const detector = this.detectorRef.nativeElement;
246
-
247
- detector.addEventListener('ready', this.handleReady.bind(this));
248
- detector.addEventListener('scanSuccess', this.handleScanSuccess.bind(this));
249
- detector.addEventListener('scanError', this.handleScanError.bind(this));
250
- detector.addEventListener('fatalError', this.handleFatalError.bind(this));
180
+
181
+ // Escuchar los eventos emitidos directamente por el componente
182
+ detector.addEventListener('status', this.handleStatus.bind(this));
183
+ detector.addEventListener('results', this.handleResults.bind(this));
184
+
185
+ // Iniciar el escaneo por cámara cuando el componente esté listo
186
+ setTimeout(() => {
187
+ detector.startCameraScan();
188
+ }, 1000);
251
189
  }
252
190
 
253
191
  ngOnDestroy() {
254
192
  const detector = this.detectorRef.nativeElement;
255
-
256
- detector.removeEventListener('ready', this.handleReady.bind(this));
257
- detector.removeEventListener('scanSuccess', this.handleScanSuccess.bind(this));
258
- detector.removeEventListener('scanError', this.handleScanError.bind(this));
259
- detector.removeEventListener('fatalError', this.handleFatalError.bind(this));
193
+
194
+ // Eliminar los event listeners
195
+ detector.removeEventListener('status', this.handleStatus.bind(this));
196
+ detector.removeEventListener('results', this.handleResults.bind(this));
260
197
  }
198
+ }
199
+ ```
200
+
201
+ ### Stencil.js
261
202
 
262
- handleReady(ev) {
263
- console.log('El detector de documentos está listo');
264
- this.ready.emit(ev.detail);
203
+ ```tsx
204
+ import { Component, h, State, Listen, Element } from '@stencil/core';
205
+ import '@jaak.ai/stamps';
206
+
207
+ @Component({
208
+ tag: 'app-document-detector',
209
+ styleUrl: 'app-document-detector.css',
210
+ shadow: true
211
+ })
212
+ export class AppDocumentDetector {
213
+ @Element() el: HTMLElement;
214
+ @State() results: any = null;
215
+ @State() status: string = '';
216
+
217
+ // Escuchar los eventos emitidos directamente por el componente
218
+ @Listen('status')
219
+ handleStatus(ev: CustomEvent) {
220
+ this.status = ev.detail;
221
+ console.log('Estado del detector:', this.status);
265
222
  }
266
223
 
267
- handleScanSuccess(ev) {
268
- console.log('Escaneo completado con éxito', ev.detail);
269
- this.scanSuccess.emit(ev.detail);
224
+ @Listen('results')
225
+ handleResults(ev: CustomEvent) {
226
+ this.results = ev.detail;
227
+ console.log('Resultados del escaneo:', this.results);
270
228
  }
271
229
 
272
- handleScanError(ev) {
273
- console.error('Error de escaneo', ev.detail);
274
- this.scanError.emit(ev.detail);
230
+ componentDidLoad() {
231
+ // Iniciar el escaneo por cámara cuando el componente esté listo
232
+ const detector = this.el.shadowRoot.querySelector('document-detector');
233
+ setTimeout(() => {
234
+ detector.startCameraScan();
235
+ }, 1000);
275
236
  }
276
237
 
277
- handleFatalError(ev) {
278
- console.error('Error fatal', ev.detail);
279
- this.fatalError.emit(ev.detail);
238
+ render() {
239
+ return (
240
+ <div>
241
+ <document-detector
242
+ license-key="TU_CLAVE_DE_LICENCIA"
243
+ />
244
+ </div>
245
+ );
280
246
  }
281
247
  }
282
248
  ```
283
249
 
284
- ## Referencia de API
250
+ ## Componente Document-Detector
285
251
 
286
- ### Propiedades
252
+ El componente `document-detector` es el elemento principal de esta librería, diseñado para proporcionar una experiencia completa de escaneo e identificación de documentos en aplicaciones web.
253
+
254
+ ### Descripción General
255
+
256
+ El `document-detector` es un componente web que utiliza tecnología de reconocimiento óptico avanzada para escanear y extraer información de documentos de identidad. Está construido sobre el SDK BlinkID y ofrece una interfaz fácil de usar para integrar capacidades de escaneo de documentos en cualquier aplicación web.
257
+
258
+ ### Características Principales
259
+
260
+ - **Escaneo en tiempo real**: Captura documentos de identidad a través de la cámara del dispositivo.
261
+ - **Procesamiento de imágenes**: Permite cargar imágenes de documentos para su análisis.
262
+ - **Soporte para documentos de doble cara**: Puede procesar ambos lados de documentos como identificaciones o licencias de conducir.
263
+ - **Extracción de datos**: Obtiene automáticamente información como nombre, fecha de nacimiento, número de documento, etc.
264
+ - **Captura de imágenes**: Guarda imágenes del documento, rostro y firma cuando están disponibles.
265
+ - **Interfaz personalizable**: Permite adaptar la apariencia y comportamiento a las necesidades de tu aplicación.
266
+ - **Eventos detallados**: Proporciona eventos para cada etapa del proceso de escaneo.
267
+
268
+ ### Ciclo de Vida del Componente
269
+
270
+ 1. **Inicialización**: El componente carga el SDK y prepara los reconocedores.
271
+ 2. **Detección**: Busca un documento en el campo visual de la cámara o en la imagen proporcionada.
272
+ 3. **Análisis**: Procesa el documento detectado para extraer la información.
273
+ 4. **Resultados**: Emite los datos extraídos y las imágenes capturadas.
274
+
275
+ ### Casos de Uso Comunes
276
+
277
+ - **Verificación de identidad**: Para procesos de onboarding digital o KYC (Know Your Customer).
278
+ - **Registro de usuarios**: Automatización de la captura de datos personales.
279
+ - **Check-in digital**: En hoteles, eventos o instalaciones que requieren identificación.
280
+ - **Servicios financieros**: Para apertura de cuentas o solicitudes de crédito.
281
+ - **Servicios de salud**: Registro de pacientes y verificación de seguros.
282
+
283
+ ### Ejemplo de Implementación Básica
284
+
285
+ ```html
286
+ <document-detector
287
+ license-key="TU_CLAVE_DE_LICENCIA">
288
+ </document-detector>
289
+
290
+ <!-- O usando la propiedad config -->
291
+ <document-detector
292
+ config='{"key": "TU_CLAVE_DE_LICENCIA"}'>
293
+ </document-detector>
294
+ ```
295
+
296
+ ### Manejo de Eventos
287
297
 
288
- | Propiedad | Tipo | Valor por defecto | Descripción |
289
- |-------------------------|--------------------------|------------------------------------------------|---------------------------------------------------|
290
- | `license-key` | string | - | **Requerido** Clave de licencia |
291
- | `engine-location` | string | "https://storage.googleapis.com/jaak-storage/models/web/document-detector/v2.0.0" | Ruta a los archivos del motor WASM |
292
- | `worker-location` | string | "https://storage.googleapis.com/jaak-storage/models/web/document-detector/v2.0.0/BlinkIDWasmSDK.worker.min.js" | Ruta al archivo worker |
293
- | `allow-hello-message` | boolean | false | Habilitar mensaje de Hello a la API |
294
- | `wasm-type` | string | "ADVANCE" | Tipo de WASM a utilizar (ADVANCE, BASIC, etc.) |
295
- | `blink-id-variant` | string | "lightweight" | Variante a utilizar |
296
- | `raw-recognizers` | string | - | String JSON de reconocedores |
297
- | `recognizers` | array | ['BlinkIdMultiSideRecognizer'] | Array de nombres de reconocedores a utilizar |
298
- | `recognizer-options` | object | *Ver abajo* | Opciones de configuración para reconocedores |
299
- | `recognition-timeout` | number | - | Tiempo límite para reconocimiento en milisegundos |
300
- | `recognition-pause-timeout` | number | 3800 | Tiempo de pausa entre reconocimientos |
301
- | `enable-drag` | boolean | false | Permitir arrastrar y soltar imágenes |
302
- | `hide-feedback` | boolean | true | Ocultar mensajes de retroalimentación |
303
- | `hide-loading-and-error-ui` | boolean | false | Ocultar elementos UI de carga y error |
304
- | `scan-from-camera` | boolean | true | Permitir escaneo desde cámara |
305
- | `scan-from-image` | boolean | false | Permitir escaneo desde carga de imagen |
306
- | `thorough-scan-from-image` | boolean | false | Realizar escaneo exhaustivo para imágenes |
307
- | `gallery-overlay-type` | "FULLSCREEN" \| "INLINE" | "INLINE" | Tipo de visualización del overlay de galería |
308
- | `gallery-drop-type` | "FULLSCREEN" \| "INLINE" | "INLINE" | Tipo de visualización del área de drop de galería |
309
- | `show-action-labels` | boolean | false | Mostrar etiquetas de texto para acciones |
310
- | `show-modal-windows` | boolean | false | Mostrar ventanas modales para mensajes |
311
- | `show-scanning-line` | boolean | - | Mostrar animación de línea de escaneo |
312
-
313
- Opciones por defecto del reconocedor:
314
298
  ```javascript
315
- {
316
- BlinkIdMultiSideRecognizer: {
317
- returnEncodedFullDocumentImage: true,
318
- returnEncodedFaceImage: true,
319
- returnEncodedSignatureImage: true,
320
- fullDocumentImageExtensionFactors: {
321
- upFactor: 0.1,
322
- downFactor: 0.1,
323
- leftFactor: 0.1,
324
- rightFactor: 0.1
325
- },
326
- fullDocumentImageDpi: 300
299
+ const detector = document.querySelector('document-detector');
300
+
301
+ // Escuchar el evento de cambio de estado
302
+ detector.addEventListener('status', (event) => {
303
+ console.log('Estado del detector:', event.detail);
304
+
305
+ // Puedes reaccionar a diferentes estados
306
+ switch(event.detail) {
307
+ case 'INITIALIZING':
308
+ console.log('El detector se está inicializando');
309
+ break;
310
+ case 'READY':
311
+ console.log('El detector está listo para escanear');
312
+ break;
313
+ case 'RECORDING':
314
+ console.log('La cámara está activa y grabando');
315
+ break;
316
+ case 'RESULTS_SUCCESS':
317
+ console.log('Se han obtenido resultados exitosamente');
318
+ break;
319
+ case 'ERROR':
320
+ console.log('Ha ocurrido un error en el detector');
321
+ break;
327
322
  }
323
+ });
324
+
325
+ // Escuchar el evento de resultados
326
+ detector.addEventListener('results', (event) => {
327
+ const resultados = event.detail;
328
+ console.log('Datos del documento:', resultados);
329
+
330
+ // Acceder a imágenes del documento (si están disponibles)
331
+ if (resultados.generalData && resultados.generalData.documentImage) {
332
+ const imagenFrente = resultados.generalData.documentImage.front;
333
+ const imagenReverso = resultados.generalData.documentImage.back;
334
+ const imagenRostro = resultados.generalData.documentImage.face;
335
+
336
+ // Hacer algo con las imágenes...
337
+ }
338
+ });
339
+ ```
340
+
341
+ ### Control Programático
342
+
343
+ ```javascript
344
+ const detector = document.querySelector('document-detector');
345
+
346
+ // Iniciar escaneo por cámara
347
+ function iniciarEscaneoCamara() {
348
+ detector.startCameraScan();
349
+ }
350
+
351
+ // Iniciar escaneo desde archivo de imagen
352
+ function escanearDesdeImagen(archivo) {
353
+ detector.startImageScan(archivo);
354
+ }
355
+
356
+ // Reiniciar el componente (útil cuando se necesita resetear el estado)
357
+ function reiniciarEscaneo() {
358
+ detector.restartComponent();
359
+ }
360
+
361
+ // Ejemplo de uso con un input de archivo
362
+ document.getElementById('inputImagen').addEventListener('change', (event) => {
363
+ if (event.target.files && event.target.files[0]) {
364
+ escanearDesdeImagen(event.target.files[0]);
365
+ }
366
+ });
367
+ ```
368
+
369
+ ### Personalización de la Apariencia
370
+
371
+ El componente puede personalizarse mediante CSS utilizando las partes expuestas a través de Shadow DOM:
372
+
373
+ ```css
374
+ document-detector::part(mb-camera-video) {
375
+ border-radius: 16px;
376
+ border: 2px solid #3498db;
328
377
  }
329
378
  ```
330
379
 
380
+ ### Consideraciones Importantes
381
+
382
+ - **Permisos de cámara**: El navegador solicitará permiso para acceder a la cámara del dispositivo.
383
+ - **HTTPS**: Para usar la funcionalidad de cámara, tu aplicación debe servirse a través de HTTPS.
384
+ - **Compatibilidad**: Verifica la compatibilidad con navegadores móviles si tu aplicación está orientada a dispositivos móviles.
385
+ - **Licencia**: Se requiere una clave de licencia válida para el funcionamiento del componente.
386
+
387
+ ## Referencia de API
388
+
389
+ ### Propiedades
390
+
391
+ > **Nota**: Solo las siguientes propiedades pueden ser configuradas directamente en el componente.
392
+
393
+ | Propiedad | Tipo | Descripción |
394
+ |--------------------------|-------------------------------------------|--------------------------------------------|
395
+ | `license-key` | string | Clave de licencia para el SDK |
396
+ | `config` | { key: string } | Configuración del componente (incluye la clave de licencia) |
397
+
331
398
  ### Eventos
332
399
 
333
- | Nombre del Evento | Descripción | Detalle del Evento |
334
- |----------------------|--------------------------------------------------|--------------------------------------------------|
335
- | `ready` | Emitido cuando el componente está listo para escanear | Objeto `EventReady` con instancia del SDK |
336
- | `scanSuccess` | Emitido al escanear un documento con éxito | Objeto `EventScanSuccess` con resultados del escaneo |
337
- | `scanError` | Emitido cuando ocurre un error durante el escaneo | Objeto `EventScanError` con detalles del error |
338
- | `fatalError` | Emitido cuando ocurre un error fatal | Objeto `SDKError` con detalles del error |
339
- | `cameraScanStarted` | Emitido cuando comienza el escaneo con cámara | null |
340
- | `imageScanStarted` | Emitido cuando comienza el escaneo de imagen | null |
400
+ > **Nota**: Solo los siguientes eventos son emitidos directamente por el componente.
401
+
402
+ | Evento | Detalle | Descripción |
403
+ |----------------------|-------------------------------------------|--------------------------------------------|
404
+ | `status` | StatusDocumentDetector | Cambio de estado del detector |
405
+ | `results` | any | Resultados del escaneo |
341
406
 
342
407
  ### Métodos
343
408
 
344
- | Método | Parámetros | Tipo de Retorno | Descripción |
345
- |-------------------------|-----------------------------------------------|----------------------|--------------------------------------------|
346
- | `setUiState` | state: "ERROR" \| "LOADING" \| "NONE" \| "SUCCESS" | Promise<any> | Establecer el estado UI del componente |
347
- | `setUiMessage` | state: "FEEDBACK_ERROR" \| "FEEDBACK_INFO" \| "FEEDBACK_OK", message: string | Promise<any> | Establecer un mensaje UI |
409
+ > **Nota**: Solo los siguientes métodos pueden ser llamados directamente en el componente.
410
+
411
+ | Método | Parámetros | Retorno | Descripción |
412
+ |-------------------------|--------------------------------------------|--------------------- |-------------------------------------------|
413
+ | `setUiState` | state: "ERROR" \| "LOADING" \| "NONE" \| "SUCCESS" | Promise<void> | Establecer el estado UI del componente |
414
+ | `startCameraScan` | Ninguno | Promise<void> | Inicia el escaneo utilizando la cámara |
415
+ | `startImageScan` | file: File | Promise<void> | Inicia el escaneo utilizando una imagen |
416
+ | `startMultiSideImageScan` | firstFile: File, secondFile: File | Promise<void> | Inicia el escaneo utilizando dos imágenes para documentos de doble cara |
417
+ | `setUiMessage` | state: "FEEDBACK_ERROR" \| "FEEDBACK_INFO" \| "FEEDBACK_OK", message: string | Promise<void> | Establecer un mensaje UI |
348
418
  | `getProductIntegrationInfo` | Ninguno | Promise<ProductIntegrationInfo> | Obtener información de integración del producto |
419
+ | `restartComponent` | Ninguno | Promise<void> | Reinicia el componente y vuelve a iniciar el escaneo por cámara |
349
420
 
350
421
  ## Tipos de Objetos de Eventos
351
422
 
352
- ### EventReady
423
+ > **Nota**: A continuación se describen los tipos de datos para los eventos emitidos por el componente.
353
424
 
354
- ```typescript
355
- {
356
- sdk: WasmSDK; // Instancia del SDK
357
- }
358
- ```
359
-
360
- ### EventScanSuccess
425
+ ### StatusDocumentDetector
361
426
 
362
427
  ```typescript
363
- {
364
- recognizer: string; // Nombre del reconocedor que produjo el resultado
365
- recognizerResult: any; // El objeto resultado del reconocedor
366
- resultDocument: any; // Datos del documento procesado
367
- resultImages: any; // Imágenes resultantes (documento, cara, etc.)
428
+ enum StatusDocumentDetector {
429
+ INITIALIZING = "INITIALIZING",
430
+ READY = "READY",
431
+ RECORDING = "RECORDING",
432
+ RUNNING = "RUNNING",
433
+ RESULTS_SUCCESS = "RESULTS_SUCCESS",
434
+ DETECTION_FAILED = "DETECTION_FAILED",
435
+ ERROR = "ERROR"
368
436
  }
369
437
  ```
370
438
 
371
- ### EventScanError
439
+ ### Resultados (results)
440
+
441
+ El evento `results` emite un objeto con los datos extraídos del documento escaneado, que incluye:
372
442
 
373
443
  ```typescript
374
- {
375
- code: Code; // Código de error
376
- fatal: boolean; // Si el error es fatal
377
- message: string; // Mensaje de error
378
- recognizerName: string; // Nombre del reconocedor que produjo el error
379
- details?: any; // Detalles adicionales del error si están disponibles
444
+ interface DocumentData {
445
+ generalData: {
446
+ type: string;
447
+ nationality: string;
448
+ name: string;
449
+ surname: string;
450
+ address: string;
451
+ birthDate: string;
452
+ gender: string;
453
+ documentImage: {
454
+ frontFull: string; // Imagen base64
455
+ backFull: string; // Imagen base64
456
+ front: string; // Imagen base64
457
+ back: string; // Imagen base64
458
+ signature: string; // Imagen base64
459
+ face: string; // Imagen base64
460
+ }
461
+ };
462
+ mechanicalReadingZone: string;
463
+ specificData: Array<{
464
+ label: string;
465
+ value: string;
466
+ }>;
380
467
  }
381
468
  ```
382
469
 
383
470
  ## Licencia
384
471
 
385
- MIT
472
+ MIT