dytools-capture-engine 1.0.0 → 1.0.1

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.
@@ -0,0 +1,560 @@
1
+ import { Rectangle, InteractiveObject, Size, Point, Polygon, Vector } from 'dytools-canvas-engine';
2
+ import { Result } from 'dytools-result';
3
+
4
+ type ExternalZoneType = "TemplateSimpleZone" | "TemplateAnchorZone" | "TemplateAnchorZoneChild";
5
+ interface ExternalTemplateZone {
6
+ TemplateZoneId: string;
7
+ Name: string;
8
+ Type: ExternalZoneType;
9
+ X: number;
10
+ Y: number;
11
+ Width: number;
12
+ Height: number;
13
+ XAbsolute?: number;
14
+ YAbsolute?: number;
15
+ WidthAbsolute?: number;
16
+ HeightAbsolute?: number;
17
+ AnchorLocationXAbsoluteHint?: number;
18
+ AnchorLocationYAbsoluteHint?: number;
19
+ RegExFilter?: string | null;
20
+ RegExOutput?: string | null;
21
+ RegExReplacement?: string | null;
22
+ Required?: boolean;
23
+ DataType?: string | null;
24
+ ExcludeFromOutput?: boolean;
25
+ DefaultValueIfEmpty?: string | null;
26
+ AnchorLocation?: string;
27
+ GroupChildrenInSubRecord?: boolean;
28
+ ChildZones?: ExternalTemplateZone[];
29
+ }
30
+ interface ExternalTemplate {
31
+ Name: string;
32
+ DocumentWidth?: number;
33
+ DocumentHeight?: number;
34
+ Zones: ExternalTemplateZone[];
35
+ }
36
+ declare const CapturePublicEventType: {
37
+ readonly ZonePositionChanged: "zone:position_changed";
38
+ readonly ZoneNameChanged: "zone:name_changed";
39
+ readonly ZoneFilterRegexChanged: "zone:filter_regex_changed";
40
+ readonly ZoneExampleChanged: "zone:example_changed";
41
+ readonly ZoneHiddenChanged: "zone:hidden_changed";
42
+ readonly ZoneChanged: "zone:changed";
43
+ readonly TemplateChanged: "template:changed";
44
+ readonly ZoneSelected: "zone:selected";
45
+ readonly ZoneDeselected: "zone:deselected";
46
+ readonly ZoneFlagsAdded: "zone:flags_added";
47
+ readonly ZoneFlagsRemoved: "zone:flags_removed";
48
+ readonly ZoneAdded: "capture:zone_added";
49
+ readonly ZoneRemoved: "capture:zone_removed";
50
+ readonly ViewportChanged: "capture:viewport_changed";
51
+ readonly DrawingCompleted: "capture:drawing_completed";
52
+ readonly OcrShown: "capture:ocr_shown";
53
+ readonly OcrHidden: "capture:ocr_hidden";
54
+ readonly OcrReadLoaded: "capture:api_ocr_loaded";
55
+ readonly OcrMatchesLoaded: "capture:api_ocr_matches_loaded";
56
+ readonly CaptureStarted: "capture:started";
57
+ readonly CaptureError: "capture:error";
58
+ readonly CaptureBackgroundChanged: "capture:background_changed";
59
+ readonly CaptureRenderStarted: "capture:render_started";
60
+ readonly CaptureRenderCompleted: "capture:render_completed";
61
+ };
62
+ type CapturePublicEventType = typeof CapturePublicEventType[keyof typeof CapturePublicEventType];
63
+ interface CapturePublicEventPayloads {
64
+ [CapturePublicEventType.ZonePositionChanged]: {
65
+ zone: TemplateZoneBase;
66
+ oldPosition: Rectangle;
67
+ newPosition: Rectangle;
68
+ };
69
+ [CapturePublicEventType.ZoneNameChanged]: {
70
+ zone: TemplateZoneBase;
71
+ oldName: string;
72
+ newName: string;
73
+ };
74
+ [CapturePublicEventType.ZoneFilterRegexChanged]: {
75
+ zone: TemplateZoneBase;
76
+ oldFilterRegex: number;
77
+ newFilterRegex: number;
78
+ };
79
+ [CapturePublicEventType.ZoneExampleChanged]: {
80
+ zone: TemplateZoneBase;
81
+ oldExample: string;
82
+ newExample: string;
83
+ };
84
+ [CapturePublicEventType.ZoneHiddenChanged]: {
85
+ zone: TemplateZoneBase;
86
+ oldHidden: boolean;
87
+ newHidden: boolean;
88
+ };
89
+ [CapturePublicEventType.ZoneChanged]: {
90
+ zone: TemplateZoneBase;
91
+ propertiesChanged: string[];
92
+ };
93
+ [CapturePublicEventType.TemplateChanged]: {};
94
+ [CapturePublicEventType.ZoneSelected]: {
95
+ zone: TemplateZoneBase;
96
+ };
97
+ [CapturePublicEventType.ZoneDeselected]: {
98
+ zone: TemplateZoneBase;
99
+ };
100
+ [CapturePublicEventType.ZoneFlagsAdded]: {
101
+ zone: TemplateZoneBase;
102
+ addedFlags: string[];
103
+ currentFlags: string[];
104
+ };
105
+ [CapturePublicEventType.ZoneFlagsRemoved]: {
106
+ zone: TemplateZoneBase;
107
+ removedFlags: string[];
108
+ currentFlags: string[];
109
+ };
110
+ [CapturePublicEventType.ZoneAdded]: {
111
+ newZone: TemplateZoneBase;
112
+ parentZone?: TemplateZoneBase;
113
+ isChildZone?: boolean;
114
+ };
115
+ [CapturePublicEventType.ZoneRemoved]: {
116
+ id: string;
117
+ removedZone?: TemplateZoneBase;
118
+ parentZone?: TemplateZoneBase;
119
+ isChildZone?: boolean;
120
+ };
121
+ [CapturePublicEventType.ViewportChanged]: {
122
+ oldPan: Vector;
123
+ newPan: Vector;
124
+ oldZoom: number;
125
+ newZoom: number;
126
+ };
127
+ [CapturePublicEventType.DrawingCompleted]: {
128
+ rect: Rectangle;
129
+ maxZ: number;
130
+ };
131
+ [CapturePublicEventType.OcrShown]: {};
132
+ [CapturePublicEventType.OcrHidden]: {};
133
+ [CapturePublicEventType.OcrReadLoaded]: {
134
+ ocr: OcrRead | null;
135
+ };
136
+ [CapturePublicEventType.OcrMatchesLoaded]: {
137
+ matches: ZoneOcrMatch[];
138
+ };
139
+ [CapturePublicEventType.CaptureStarted]: {};
140
+ [CapturePublicEventType.CaptureError]: {
141
+ error?: Error;
142
+ message: string;
143
+ };
144
+ [CapturePublicEventType.CaptureBackgroundChanged]: {
145
+ newImage: Blob;
146
+ newWidth: number;
147
+ newHeight: number;
148
+ oldWidth: number;
149
+ oldHeight: number;
150
+ };
151
+ [CapturePublicEventType.CaptureRenderStarted]: {};
152
+ [CapturePublicEventType.CaptureRenderCompleted]: {};
153
+ }
154
+ declare const CaptureZoneEventType: {
155
+ readonly ZoneCanvasManagerSet: "zone_internal:canvas_manager_set";
156
+ readonly ZonePositionChanged: "zone_internal:position_changed";
157
+ readonly ZoneColorChanged: "zone_internal:color_changed";
158
+ readonly ZoneNameChanged: "zone_internal:name_changed";
159
+ readonly ZoneExampleChanged: "zone_internal:example_changed";
160
+ readonly ZoneHiddenChanged: "zone_internal:hidden_changed";
161
+ readonly ZoneFilterRegexChanged: "zone_internal:filter_regex_changed";
162
+ readonly ZoneOutputRegexChanged: "zone_internal:output_regex_changed";
163
+ readonly ZoneOutputReplacementChanged: "zone_internal:output_replacement_changed";
164
+ readonly ZoneRequiredChanged: "zone_internal:required_changed";
165
+ readonly ZoneDataTypeChanged: "zone_internal:data_type_changed";
166
+ readonly ZoneExcludeFromOutputChanged: "zone_internal:exclude_from_output_changed";
167
+ readonly ZoneDefaultValueIfEmptyChanged: "zone_internal:default_value_if_empty_changed";
168
+ readonly ZoneOcrMatchesChanged: "zone_internal:ocr_matches_changed";
169
+ readonly ZoneGroupChildrenChanged: "zone_internal:group_children_changed";
170
+ readonly ZoneAnchorLocationChanged: "zone_internal:anchor_location_changed";
171
+ };
172
+ type CaptureZoneEventType = typeof CaptureZoneEventType[keyof typeof CaptureZoneEventType];
173
+ interface CaptureZoneEventPayloads {
174
+ [CaptureZoneEventType.ZonePositionChanged]: {
175
+ oldPosition: Rectangle;
176
+ newPosition: Rectangle;
177
+ };
178
+ [CaptureZoneEventType.ZoneColorChanged]: {
179
+ oldColor: string;
180
+ newColor: string;
181
+ };
182
+ [CaptureZoneEventType.ZoneNameChanged]: {
183
+ oldName: string;
184
+ newName: string;
185
+ };
186
+ [CaptureZoneEventType.ZoneExampleChanged]: {
187
+ oldExample: string | null;
188
+ newExample: string | null;
189
+ };
190
+ [CaptureZoneEventType.ZoneHiddenChanged]: {
191
+ oldHidden: boolean;
192
+ newHidden: boolean;
193
+ };
194
+ [CaptureZoneEventType.ZoneFilterRegexChanged]: {
195
+ oldFilterRegex: string | null;
196
+ newFilterRegex: string | null;
197
+ };
198
+ [CaptureZoneEventType.ZoneOutputRegexChanged]: {
199
+ oldOutputRegex: string | null;
200
+ newOutputRegex: string | null;
201
+ };
202
+ [CaptureZoneEventType.ZoneOutputReplacementChanged]: {
203
+ oldOutputReplacement: string | null;
204
+ newOutputReplacement: string | null;
205
+ };
206
+ [CaptureZoneEventType.ZoneRequiredChanged]: {
207
+ oldRequired: boolean;
208
+ newRequired: boolean;
209
+ };
210
+ [CaptureZoneEventType.ZoneDataTypeChanged]: {
211
+ oldDataType: string | null;
212
+ newDataType: string | null;
213
+ };
214
+ [CaptureZoneEventType.ZoneExcludeFromOutputChanged]: {
215
+ oldExcludeFromOutput: boolean;
216
+ newExcludeFromOutput: boolean;
217
+ };
218
+ [CaptureZoneEventType.ZoneDefaultValueIfEmptyChanged]: {
219
+ oldDefaultValueIfEmpty: string | null;
220
+ newDefaultValueIfEmpty: string | null;
221
+ };
222
+ [CaptureZoneEventType.ZoneCanvasManagerSet]: {
223
+ canvasManager: ZoneCanvasManager;
224
+ };
225
+ [CaptureZoneEventType.ZoneOcrMatchesChanged]: {
226
+ matches: InternalZoneOcrMatch[] | null;
227
+ };
228
+ [CaptureZoneEventType.ZoneGroupChildrenChanged]: {
229
+ newGroupChildren: boolean;
230
+ oldGroupChildren: boolean;
231
+ };
232
+ [CaptureZoneEventType.ZoneAnchorLocationChanged]: {
233
+ oldAnchorLocation: AnchorLocation;
234
+ newAnchorLocation: AnchorLocation;
235
+ };
236
+ }
237
+ declare const CaptureEngineToZoneEventType: {
238
+ readonly CanvasObjectPositionChanged: "canvas:object_position_changed";
239
+ readonly CanvasObjectResized: "canvas:object_resized";
240
+ readonly CanvasObjectMoved: "canvas:object_moved";
241
+ readonly ZoneSelected: "zone:selected";
242
+ readonly ZoneDeselected: "zone:deselected";
243
+ readonly ZoneFlagsAdded: "zone:flags_added";
244
+ readonly ZoneFlagsRemoved: "zone:flags_removed";
245
+ readonly CaptureOcrReadLoaded: "capture:ocr_read_loaded";
246
+ readonly CaptureOcrMatchesLoaded: "capture:ocr_matches_loaded";
247
+ };
248
+ type CaptureEngineToZoneEventType = typeof CaptureEngineToZoneEventType[keyof typeof CaptureEngineToZoneEventType];
249
+ interface CaptureEngineToZoneEventPayloads {
250
+ [CaptureEngineToZoneEventType.CanvasObjectPositionChanged]: {
251
+ object: InteractiveObject;
252
+ oldPosition: Rectangle;
253
+ newPosition: Rectangle;
254
+ };
255
+ [CaptureEngineToZoneEventType.CanvasObjectResized]: {
256
+ object: InteractiveObject;
257
+ oldSize: Size;
258
+ newSize: Size;
259
+ };
260
+ [CaptureEngineToZoneEventType.CanvasObjectMoved]: {
261
+ object: InteractiveObject;
262
+ oldPoint: Point;
263
+ newPoint: Point;
264
+ };
265
+ [CaptureEngineToZoneEventType.ZoneSelected]: {};
266
+ [CaptureEngineToZoneEventType.ZoneDeselected]: {};
267
+ [CaptureEngineToZoneEventType.ZoneFlagsAdded]: {
268
+ addedFlags: string[];
269
+ currentFlags: string[];
270
+ };
271
+ [CaptureEngineToZoneEventType.ZoneFlagsRemoved]: {
272
+ removedFlags: string[];
273
+ currentFlags: string[];
274
+ };
275
+ [CaptureEngineToZoneEventType.CaptureOcrReadLoaded]: {
276
+ ocrRead: OcrRead | null;
277
+ };
278
+ [CaptureEngineToZoneEventType.CaptureOcrMatchesLoaded]: {
279
+ ocrMatches: InternalZoneOcrMatch[] | null;
280
+ };
281
+ }
282
+ declare const CaptureToEngineEventType: {
283
+ readonly ZonePositionChanged: "zone:position_changed";
284
+ readonly ZoneNameChanged: "zone:name_changed";
285
+ readonly ZoneFilterRegexChanged: "zone:filter_regex_changed";
286
+ readonly ZoneOutputRegexChanged: "zone:output_regex_changed";
287
+ readonly ZoneOutputReplacementChanged: "zone:output_replacement_changed";
288
+ readonly ZoneRequiredChanged: "zone:required_changed";
289
+ readonly ZoneDataTypeChanged: "zone:data_type_changed";
290
+ readonly ZoneExcludeFromOutputChanged: "zone:exclude_from_output_changed";
291
+ readonly ZoneDefaultValueIfEmptyChanged: "zone:default_value_if_empty_changed";
292
+ readonly ZoneExampleChanged: "zone:example_changed";
293
+ readonly ZoneHiddenChanged: "zone:hidden_changed";
294
+ readonly ZoneChanged: "zone:changed";
295
+ readonly ZoneAnchorLocationChanged: "zone:anchor_location_changed";
296
+ readonly ZoneGroupChildrenChanged: "zone:group_children_changed";
297
+ readonly ZoneChildZoneAdded: "zone:child_zone_added";
298
+ readonly ZoneChildZoneRemoved: "zone:child_zone_removed";
299
+ readonly ZoneChildZonesChanged: "zone:child_zone_changed";
300
+ readonly ZoneError: "zone:error";
301
+ };
302
+ type CaptureToEngineEventType = typeof CaptureToEngineEventType[keyof typeof CaptureToEngineEventType];
303
+ interface CaptureToEngineEventPayloads {
304
+ [CaptureToEngineEventType.ZonePositionChanged]: {
305
+ zone: TemplateZoneBase;
306
+ oldPosition: Rectangle;
307
+ newPosition: Rectangle;
308
+ };
309
+ [CaptureToEngineEventType.ZoneNameChanged]: {
310
+ zone: TemplateZoneBase;
311
+ oldName: string;
312
+ newName: string;
313
+ };
314
+ [CaptureToEngineEventType.ZoneFilterRegexChanged]: {
315
+ zone: TemplateZoneBase;
316
+ oldFilterRegex: string | null;
317
+ newFilterRegex: string | null;
318
+ };
319
+ [CaptureToEngineEventType.ZoneOutputRegexChanged]: {
320
+ zone: TemplateZoneBase;
321
+ oldOutputRegex: string | null;
322
+ newOutputRegex: string | null;
323
+ };
324
+ [CaptureToEngineEventType.ZoneOutputReplacementChanged]: {
325
+ zone: TemplateZoneBase;
326
+ oldOutputReplacement: string | null;
327
+ newOutputReplacement: string | null;
328
+ };
329
+ [CaptureToEngineEventType.ZoneRequiredChanged]: {
330
+ zone: TemplateZoneBase;
331
+ oldRequired: boolean;
332
+ newRequired: boolean;
333
+ };
334
+ [CaptureToEngineEventType.ZoneDataTypeChanged]: {
335
+ zone: TemplateZoneBase;
336
+ oldDataType: string | null;
337
+ newDataType: string | null;
338
+ };
339
+ [CaptureToEngineEventType.ZoneExcludeFromOutputChanged]: {
340
+ zone: TemplateZoneBase;
341
+ oldExcludeFromOutput: boolean;
342
+ newExcludeFromOutput: boolean;
343
+ };
344
+ [CaptureToEngineEventType.ZoneDefaultValueIfEmptyChanged]: {
345
+ zone: TemplateZoneBase;
346
+ oldDefaultValueIfEmpty: string | null;
347
+ newDefaultValueIfEmpty: string | null;
348
+ };
349
+ [CaptureToEngineEventType.ZoneExampleChanged]: {
350
+ zone: TemplateZoneBase;
351
+ oldExample: string | null;
352
+ newExample: string | null;
353
+ };
354
+ [CaptureToEngineEventType.ZoneHiddenChanged]: {
355
+ zone: TemplateZoneBase;
356
+ oldHidden: boolean;
357
+ newHidden: boolean;
358
+ };
359
+ [CaptureToEngineEventType.ZoneChanged]: {
360
+ zone: TemplateZoneBase;
361
+ propertiesChanged: string[];
362
+ };
363
+ [CaptureToEngineEventType.ZoneAnchorLocationChanged]: {
364
+ zone: TemplateZoneBase;
365
+ oldAnchorLocation: AnchorLocation;
366
+ newAnchorLocation: AnchorLocation;
367
+ };
368
+ [CaptureToEngineEventType.ZoneGroupChildrenChanged]: {
369
+ zone: TemplateZoneBase;
370
+ newGroupChildren: boolean;
371
+ oldGroupChildren: boolean;
372
+ };
373
+ [CaptureToEngineEventType.ZoneChildZoneAdded]: {
374
+ parentZone: TemplateZoneBase;
375
+ newChildZone: TemplateZoneBase;
376
+ };
377
+ [CaptureToEngineEventType.ZoneChildZoneRemoved]: {
378
+ parentZone: TemplateZoneBase;
379
+ removedChildZone: TemplateZoneBase;
380
+ };
381
+ [CaptureToEngineEventType.ZoneChildZonesChanged]: {
382
+ parentZone: TemplateZoneBase;
383
+ };
384
+ [CaptureToEngineEventType.ZoneError]: {
385
+ zone: TemplateZoneBase;
386
+ error?: Error;
387
+ message: string;
388
+ };
389
+ }
390
+ type ZoneKind = "simple" | "anchor" | "anchor-child";
391
+ type AnchorLocation = "TopLeft" | "TopRight" | "BottomLeft" | "BottomRight" | "Center";
392
+ interface TemplateZoneBase {
393
+ id: string;
394
+ name: string;
395
+ type: ZoneKind;
396
+ example: string | null;
397
+ needsAnchorReposition: boolean;
398
+ rect: Rectangle;
399
+ hidden?: boolean;
400
+ filterRegex: string | null;
401
+ outputRegex: string | null;
402
+ outputReplacement: string | null;
403
+ required: boolean;
404
+ dataType: string | null;
405
+ excludeFromOutput: boolean;
406
+ defaultValueIfEmpty: string | null;
407
+ anchorLocation?: AnchorLocation;
408
+ groupChildren?: boolean;
409
+ children?: TemplateZoneBase[];
410
+ handleEvent?<T extends CaptureEngineToZoneEventType>(id: string, type: T, payload: CaptureEngineToZoneEventPayloads[T]): void;
411
+ setCanvasManager?(cm?: ZoneCanvasManager): void;
412
+ toExternal(docWidth: number, docHeight: number): ExternalTemplateZone;
413
+ setEngineEventSink?(callback?: (type: CaptureToEngineEventType, payload?: CaptureToEngineEventPayloads[CaptureToEngineEventType]) => void): void;
414
+ }
415
+ interface ZoneCanvasManager {
416
+ readonly zoneId: string;
417
+ addPolygon(points: Point[], color: string, isSelectable: boolean): string;
418
+ addRectangle(rect: Rectangle, name: string | null, color: string, isResizable: boolean, isSelectable: boolean): string;
419
+ addCircle(center: Point, radius: number, color: string, isResizable: boolean, isSelectable: boolean): string;
420
+ setName(id: string, name: string | null): void;
421
+ setColor(id: string, color: string): void;
422
+ setSelectable(id: string, isSelectable: boolean): void;
423
+ setResizable(id: string, isResizable: boolean): void;
424
+ setRectangleSize(id: string, rect: Rectangle): void;
425
+ setVisibility(id: string, isVisible: boolean): void;
426
+ removeObject(id: string): void;
427
+ /** convenience for “wipe all visuals for this zone” */
428
+ clearAll(): void;
429
+ }
430
+ declare class CaptureEngine {
431
+ private readonly engine;
432
+ private listeners;
433
+ private serverApi?;
434
+ private _name;
435
+ zones: TemplateZoneBase[];
436
+ private ocrRead;
437
+ private zoneOcrMatches;
438
+ private ocrOverlayIds;
439
+ private flags;
440
+ private zoneCounter;
441
+ constructor(selector: string, serverApi?: CaptureEngineServerApi);
442
+ private setupEngine;
443
+ on<T extends CapturePublicEventType>(event: T, handler: (payload: CapturePublicEventPayloads[T]) => void, options?: {
444
+ once?: boolean;
445
+ }): void;
446
+ off<T extends CapturePublicEventType>(event: T, handler: (payload: CapturePublicEventPayloads[T]) => void): void;
447
+ private emitExternal;
448
+ private emitToZone;
449
+ private refreshMatches;
450
+ private engineEventHandler;
451
+ private onZoneAdded;
452
+ private onZoneRemoved;
453
+ private getZoneByCanvasEngineId;
454
+ private doRender;
455
+ private createMeteredFn;
456
+ loadExternalTemplate(external: ExternalTemplate, reapplyZonePositioning: boolean): void;
457
+ getExternalTemplate(): ExternalTemplate;
458
+ private rectFromExternal;
459
+ private zoneFromExternal;
460
+ get name(): string;
461
+ set name(value: string);
462
+ get allZonesFlattened(): TemplateZoneBase[];
463
+ getZoneById(id: string): TemplateZoneBase | undefined;
464
+ /**
465
+ * Add a new simple zone
466
+ * @param bounds Rectangle
467
+ */
468
+ addSimpleZone(bounds: Rectangle): void;
469
+ /**
470
+ * Add a new anchor zone
471
+ * @param bounds Rectangle
472
+ */
473
+ addAnchorZone(bounds: Rectangle): void;
474
+ /**
475
+ * Add a child zone linked to an anchor
476
+ * @param anchorId string
477
+ * @param bounds Rectangle
478
+ */
479
+ addAnchorChildZone(anchorId: string, bounds: Rectangle): void;
480
+ /**
481
+ * Remove a zone and its canvas representation by id
482
+ * @param id string
483
+ */
484
+ removeZoneById(id: string): boolean;
485
+ updateZone(id: string, patch: Partial<TemplateZoneBase>): void;
486
+ private setFlag;
487
+ private clearFlag;
488
+ hasFlag(objOrId: string | TemplateZoneBase, flag: string): boolean;
489
+ private clearAllFlags;
490
+ getObjectsWithFlag(flag: string): TemplateZoneBase[];
491
+ setSelectedZones(objOrIds: (string | TemplateZoneBase)[]): void;
492
+ getSelectedZones(): TemplateZoneBase[];
493
+ get pan(): Vector;
494
+ get zoom(): number;
495
+ setZoom(zoom: number, center?: Point): void;
496
+ setPan(x: number, y: number): void;
497
+ get width(): number;
498
+ get height(): number;
499
+ setBackgroundImage(imageOrUrl: string | File | Blob): Promise<void>;
500
+ switchMode(name: string): void;
501
+ get mode(): string;
502
+ /**
503
+ * Render the current OCR snapshot as non-interactive polygons on the canvas.
504
+ */
505
+ showOcr(): void;
506
+ /**
507
+ * Remove OCR overlay polygons from the canvas.
508
+ */
509
+ hideOcr(): void;
510
+ get isOcrShown(): boolean;
511
+ setOcrSnapshot(ocrRead: OcrRead | null): void;
512
+ getOcrSnapshot(): OcrRead | null;
513
+ setOcrMatchesSnapshot(matches: ZoneOcrMatch[]): void;
514
+ getOcrMatchesSnapshot(): ZoneOcrMatch[];
515
+ setServerApi(api: CaptureEngineServerApi): void;
516
+ private loadOcrFromImage;
517
+ private getZoneMatchesFromServer;
518
+ }
519
+ interface OcrRead {
520
+ documentWidth: number;
521
+ documentHeight: number;
522
+ lines: OcrWord[];
523
+ }
524
+ interface OcrWord {
525
+ ocrTextResultId: string;
526
+ text: string;
527
+ confidence: number;
528
+ polygonPercent: Polygon;
529
+ bounds: Rectangle;
530
+ center: Point;
531
+ }
532
+ interface ZoneOcrMatch {
533
+ templateZoneId: string;
534
+ ocrTextResultId: number;
535
+ originalText: string;
536
+ processedText: string;
537
+ polygonPercent: Polygon;
538
+ anchorPoint?: Point | null;
539
+ }
540
+ interface InternalZoneOcrMatch {
541
+ templateZoneId: string;
542
+ ocrTextResultId: number;
543
+ originalText: string;
544
+ processedText: string;
545
+ polygonPercent: Polygon;
546
+ polygonAbsolute: Polygon;
547
+ anchorPointPercent?: Point | null;
548
+ anchorPointAbsolute?: Point | null;
549
+ }
550
+ interface CaptureEngineServerApi {
551
+ /** 1) /api/v1/ocr/readimage */
552
+ readImage(file: File | Blob): Promise<Result<OcrRead>>;
553
+ /** 2) /api/v1/ocr/matchocrtozones */
554
+ matchOcrToZones(req: {
555
+ captureTemplate: ExternalTemplate;
556
+ ocr: OcrRead;
557
+ }): Promise<Result<ZoneOcrMatch[]>>;
558
+ }
559
+
560
+ export { CaptureEngine, type CaptureEngineServerApi, type CaptureEngineToZoneEventPayloads, CaptureEngineToZoneEventType, type CapturePublicEventPayloads, CapturePublicEventType, type CaptureToEngineEventPayloads, CaptureToEngineEventType, type CaptureZoneEventPayloads, type ExternalTemplate, type ExternalTemplateZone, type ExternalZoneType, type OcrRead, type OcrWord, type TemplateZoneBase, type ZoneCanvasManager, type ZoneKind, type ZoneOcrMatch };
@@ -0,0 +1,560 @@
1
+ import { Rectangle, InteractiveObject, Size, Point, Polygon, Vector } from 'dytools-canvas-engine';
2
+ import { Result } from 'dytools-result';
3
+
4
+ type ExternalZoneType = "TemplateSimpleZone" | "TemplateAnchorZone" | "TemplateAnchorZoneChild";
5
+ interface ExternalTemplateZone {
6
+ TemplateZoneId: string;
7
+ Name: string;
8
+ Type: ExternalZoneType;
9
+ X: number;
10
+ Y: number;
11
+ Width: number;
12
+ Height: number;
13
+ XAbsolute?: number;
14
+ YAbsolute?: number;
15
+ WidthAbsolute?: number;
16
+ HeightAbsolute?: number;
17
+ AnchorLocationXAbsoluteHint?: number;
18
+ AnchorLocationYAbsoluteHint?: number;
19
+ RegExFilter?: string | null;
20
+ RegExOutput?: string | null;
21
+ RegExReplacement?: string | null;
22
+ Required?: boolean;
23
+ DataType?: string | null;
24
+ ExcludeFromOutput?: boolean;
25
+ DefaultValueIfEmpty?: string | null;
26
+ AnchorLocation?: string;
27
+ GroupChildrenInSubRecord?: boolean;
28
+ ChildZones?: ExternalTemplateZone[];
29
+ }
30
+ interface ExternalTemplate {
31
+ Name: string;
32
+ DocumentWidth?: number;
33
+ DocumentHeight?: number;
34
+ Zones: ExternalTemplateZone[];
35
+ }
36
+ declare const CapturePublicEventType: {
37
+ readonly ZonePositionChanged: "zone:position_changed";
38
+ readonly ZoneNameChanged: "zone:name_changed";
39
+ readonly ZoneFilterRegexChanged: "zone:filter_regex_changed";
40
+ readonly ZoneExampleChanged: "zone:example_changed";
41
+ readonly ZoneHiddenChanged: "zone:hidden_changed";
42
+ readonly ZoneChanged: "zone:changed";
43
+ readonly TemplateChanged: "template:changed";
44
+ readonly ZoneSelected: "zone:selected";
45
+ readonly ZoneDeselected: "zone:deselected";
46
+ readonly ZoneFlagsAdded: "zone:flags_added";
47
+ readonly ZoneFlagsRemoved: "zone:flags_removed";
48
+ readonly ZoneAdded: "capture:zone_added";
49
+ readonly ZoneRemoved: "capture:zone_removed";
50
+ readonly ViewportChanged: "capture:viewport_changed";
51
+ readonly DrawingCompleted: "capture:drawing_completed";
52
+ readonly OcrShown: "capture:ocr_shown";
53
+ readonly OcrHidden: "capture:ocr_hidden";
54
+ readonly OcrReadLoaded: "capture:api_ocr_loaded";
55
+ readonly OcrMatchesLoaded: "capture:api_ocr_matches_loaded";
56
+ readonly CaptureStarted: "capture:started";
57
+ readonly CaptureError: "capture:error";
58
+ readonly CaptureBackgroundChanged: "capture:background_changed";
59
+ readonly CaptureRenderStarted: "capture:render_started";
60
+ readonly CaptureRenderCompleted: "capture:render_completed";
61
+ };
62
+ type CapturePublicEventType = typeof CapturePublicEventType[keyof typeof CapturePublicEventType];
63
+ interface CapturePublicEventPayloads {
64
+ [CapturePublicEventType.ZonePositionChanged]: {
65
+ zone: TemplateZoneBase;
66
+ oldPosition: Rectangle;
67
+ newPosition: Rectangle;
68
+ };
69
+ [CapturePublicEventType.ZoneNameChanged]: {
70
+ zone: TemplateZoneBase;
71
+ oldName: string;
72
+ newName: string;
73
+ };
74
+ [CapturePublicEventType.ZoneFilterRegexChanged]: {
75
+ zone: TemplateZoneBase;
76
+ oldFilterRegex: number;
77
+ newFilterRegex: number;
78
+ };
79
+ [CapturePublicEventType.ZoneExampleChanged]: {
80
+ zone: TemplateZoneBase;
81
+ oldExample: string;
82
+ newExample: string;
83
+ };
84
+ [CapturePublicEventType.ZoneHiddenChanged]: {
85
+ zone: TemplateZoneBase;
86
+ oldHidden: boolean;
87
+ newHidden: boolean;
88
+ };
89
+ [CapturePublicEventType.ZoneChanged]: {
90
+ zone: TemplateZoneBase;
91
+ propertiesChanged: string[];
92
+ };
93
+ [CapturePublicEventType.TemplateChanged]: {};
94
+ [CapturePublicEventType.ZoneSelected]: {
95
+ zone: TemplateZoneBase;
96
+ };
97
+ [CapturePublicEventType.ZoneDeselected]: {
98
+ zone: TemplateZoneBase;
99
+ };
100
+ [CapturePublicEventType.ZoneFlagsAdded]: {
101
+ zone: TemplateZoneBase;
102
+ addedFlags: string[];
103
+ currentFlags: string[];
104
+ };
105
+ [CapturePublicEventType.ZoneFlagsRemoved]: {
106
+ zone: TemplateZoneBase;
107
+ removedFlags: string[];
108
+ currentFlags: string[];
109
+ };
110
+ [CapturePublicEventType.ZoneAdded]: {
111
+ newZone: TemplateZoneBase;
112
+ parentZone?: TemplateZoneBase;
113
+ isChildZone?: boolean;
114
+ };
115
+ [CapturePublicEventType.ZoneRemoved]: {
116
+ id: string;
117
+ removedZone?: TemplateZoneBase;
118
+ parentZone?: TemplateZoneBase;
119
+ isChildZone?: boolean;
120
+ };
121
+ [CapturePublicEventType.ViewportChanged]: {
122
+ oldPan: Vector;
123
+ newPan: Vector;
124
+ oldZoom: number;
125
+ newZoom: number;
126
+ };
127
+ [CapturePublicEventType.DrawingCompleted]: {
128
+ rect: Rectangle;
129
+ maxZ: number;
130
+ };
131
+ [CapturePublicEventType.OcrShown]: {};
132
+ [CapturePublicEventType.OcrHidden]: {};
133
+ [CapturePublicEventType.OcrReadLoaded]: {
134
+ ocr: OcrRead | null;
135
+ };
136
+ [CapturePublicEventType.OcrMatchesLoaded]: {
137
+ matches: ZoneOcrMatch[];
138
+ };
139
+ [CapturePublicEventType.CaptureStarted]: {};
140
+ [CapturePublicEventType.CaptureError]: {
141
+ error?: Error;
142
+ message: string;
143
+ };
144
+ [CapturePublicEventType.CaptureBackgroundChanged]: {
145
+ newImage: Blob;
146
+ newWidth: number;
147
+ newHeight: number;
148
+ oldWidth: number;
149
+ oldHeight: number;
150
+ };
151
+ [CapturePublicEventType.CaptureRenderStarted]: {};
152
+ [CapturePublicEventType.CaptureRenderCompleted]: {};
153
+ }
154
+ declare const CaptureZoneEventType: {
155
+ readonly ZoneCanvasManagerSet: "zone_internal:canvas_manager_set";
156
+ readonly ZonePositionChanged: "zone_internal:position_changed";
157
+ readonly ZoneColorChanged: "zone_internal:color_changed";
158
+ readonly ZoneNameChanged: "zone_internal:name_changed";
159
+ readonly ZoneExampleChanged: "zone_internal:example_changed";
160
+ readonly ZoneHiddenChanged: "zone_internal:hidden_changed";
161
+ readonly ZoneFilterRegexChanged: "zone_internal:filter_regex_changed";
162
+ readonly ZoneOutputRegexChanged: "zone_internal:output_regex_changed";
163
+ readonly ZoneOutputReplacementChanged: "zone_internal:output_replacement_changed";
164
+ readonly ZoneRequiredChanged: "zone_internal:required_changed";
165
+ readonly ZoneDataTypeChanged: "zone_internal:data_type_changed";
166
+ readonly ZoneExcludeFromOutputChanged: "zone_internal:exclude_from_output_changed";
167
+ readonly ZoneDefaultValueIfEmptyChanged: "zone_internal:default_value_if_empty_changed";
168
+ readonly ZoneOcrMatchesChanged: "zone_internal:ocr_matches_changed";
169
+ readonly ZoneGroupChildrenChanged: "zone_internal:group_children_changed";
170
+ readonly ZoneAnchorLocationChanged: "zone_internal:anchor_location_changed";
171
+ };
172
+ type CaptureZoneEventType = typeof CaptureZoneEventType[keyof typeof CaptureZoneEventType];
173
+ interface CaptureZoneEventPayloads {
174
+ [CaptureZoneEventType.ZonePositionChanged]: {
175
+ oldPosition: Rectangle;
176
+ newPosition: Rectangle;
177
+ };
178
+ [CaptureZoneEventType.ZoneColorChanged]: {
179
+ oldColor: string;
180
+ newColor: string;
181
+ };
182
+ [CaptureZoneEventType.ZoneNameChanged]: {
183
+ oldName: string;
184
+ newName: string;
185
+ };
186
+ [CaptureZoneEventType.ZoneExampleChanged]: {
187
+ oldExample: string | null;
188
+ newExample: string | null;
189
+ };
190
+ [CaptureZoneEventType.ZoneHiddenChanged]: {
191
+ oldHidden: boolean;
192
+ newHidden: boolean;
193
+ };
194
+ [CaptureZoneEventType.ZoneFilterRegexChanged]: {
195
+ oldFilterRegex: string | null;
196
+ newFilterRegex: string | null;
197
+ };
198
+ [CaptureZoneEventType.ZoneOutputRegexChanged]: {
199
+ oldOutputRegex: string | null;
200
+ newOutputRegex: string | null;
201
+ };
202
+ [CaptureZoneEventType.ZoneOutputReplacementChanged]: {
203
+ oldOutputReplacement: string | null;
204
+ newOutputReplacement: string | null;
205
+ };
206
+ [CaptureZoneEventType.ZoneRequiredChanged]: {
207
+ oldRequired: boolean;
208
+ newRequired: boolean;
209
+ };
210
+ [CaptureZoneEventType.ZoneDataTypeChanged]: {
211
+ oldDataType: string | null;
212
+ newDataType: string | null;
213
+ };
214
+ [CaptureZoneEventType.ZoneExcludeFromOutputChanged]: {
215
+ oldExcludeFromOutput: boolean;
216
+ newExcludeFromOutput: boolean;
217
+ };
218
+ [CaptureZoneEventType.ZoneDefaultValueIfEmptyChanged]: {
219
+ oldDefaultValueIfEmpty: string | null;
220
+ newDefaultValueIfEmpty: string | null;
221
+ };
222
+ [CaptureZoneEventType.ZoneCanvasManagerSet]: {
223
+ canvasManager: ZoneCanvasManager;
224
+ };
225
+ [CaptureZoneEventType.ZoneOcrMatchesChanged]: {
226
+ matches: InternalZoneOcrMatch[] | null;
227
+ };
228
+ [CaptureZoneEventType.ZoneGroupChildrenChanged]: {
229
+ newGroupChildren: boolean;
230
+ oldGroupChildren: boolean;
231
+ };
232
+ [CaptureZoneEventType.ZoneAnchorLocationChanged]: {
233
+ oldAnchorLocation: AnchorLocation;
234
+ newAnchorLocation: AnchorLocation;
235
+ };
236
+ }
237
+ declare const CaptureEngineToZoneEventType: {
238
+ readonly CanvasObjectPositionChanged: "canvas:object_position_changed";
239
+ readonly CanvasObjectResized: "canvas:object_resized";
240
+ readonly CanvasObjectMoved: "canvas:object_moved";
241
+ readonly ZoneSelected: "zone:selected";
242
+ readonly ZoneDeselected: "zone:deselected";
243
+ readonly ZoneFlagsAdded: "zone:flags_added";
244
+ readonly ZoneFlagsRemoved: "zone:flags_removed";
245
+ readonly CaptureOcrReadLoaded: "capture:ocr_read_loaded";
246
+ readonly CaptureOcrMatchesLoaded: "capture:ocr_matches_loaded";
247
+ };
248
+ type CaptureEngineToZoneEventType = typeof CaptureEngineToZoneEventType[keyof typeof CaptureEngineToZoneEventType];
249
+ interface CaptureEngineToZoneEventPayloads {
250
+ [CaptureEngineToZoneEventType.CanvasObjectPositionChanged]: {
251
+ object: InteractiveObject;
252
+ oldPosition: Rectangle;
253
+ newPosition: Rectangle;
254
+ };
255
+ [CaptureEngineToZoneEventType.CanvasObjectResized]: {
256
+ object: InteractiveObject;
257
+ oldSize: Size;
258
+ newSize: Size;
259
+ };
260
+ [CaptureEngineToZoneEventType.CanvasObjectMoved]: {
261
+ object: InteractiveObject;
262
+ oldPoint: Point;
263
+ newPoint: Point;
264
+ };
265
+ [CaptureEngineToZoneEventType.ZoneSelected]: {};
266
+ [CaptureEngineToZoneEventType.ZoneDeselected]: {};
267
+ [CaptureEngineToZoneEventType.ZoneFlagsAdded]: {
268
+ addedFlags: string[];
269
+ currentFlags: string[];
270
+ };
271
+ [CaptureEngineToZoneEventType.ZoneFlagsRemoved]: {
272
+ removedFlags: string[];
273
+ currentFlags: string[];
274
+ };
275
+ [CaptureEngineToZoneEventType.CaptureOcrReadLoaded]: {
276
+ ocrRead: OcrRead | null;
277
+ };
278
+ [CaptureEngineToZoneEventType.CaptureOcrMatchesLoaded]: {
279
+ ocrMatches: InternalZoneOcrMatch[] | null;
280
+ };
281
+ }
282
+ declare const CaptureToEngineEventType: {
283
+ readonly ZonePositionChanged: "zone:position_changed";
284
+ readonly ZoneNameChanged: "zone:name_changed";
285
+ readonly ZoneFilterRegexChanged: "zone:filter_regex_changed";
286
+ readonly ZoneOutputRegexChanged: "zone:output_regex_changed";
287
+ readonly ZoneOutputReplacementChanged: "zone:output_replacement_changed";
288
+ readonly ZoneRequiredChanged: "zone:required_changed";
289
+ readonly ZoneDataTypeChanged: "zone:data_type_changed";
290
+ readonly ZoneExcludeFromOutputChanged: "zone:exclude_from_output_changed";
291
+ readonly ZoneDefaultValueIfEmptyChanged: "zone:default_value_if_empty_changed";
292
+ readonly ZoneExampleChanged: "zone:example_changed";
293
+ readonly ZoneHiddenChanged: "zone:hidden_changed";
294
+ readonly ZoneChanged: "zone:changed";
295
+ readonly ZoneAnchorLocationChanged: "zone:anchor_location_changed";
296
+ readonly ZoneGroupChildrenChanged: "zone:group_children_changed";
297
+ readonly ZoneChildZoneAdded: "zone:child_zone_added";
298
+ readonly ZoneChildZoneRemoved: "zone:child_zone_removed";
299
+ readonly ZoneChildZonesChanged: "zone:child_zone_changed";
300
+ readonly ZoneError: "zone:error";
301
+ };
302
+ type CaptureToEngineEventType = typeof CaptureToEngineEventType[keyof typeof CaptureToEngineEventType];
303
+ interface CaptureToEngineEventPayloads {
304
+ [CaptureToEngineEventType.ZonePositionChanged]: {
305
+ zone: TemplateZoneBase;
306
+ oldPosition: Rectangle;
307
+ newPosition: Rectangle;
308
+ };
309
+ [CaptureToEngineEventType.ZoneNameChanged]: {
310
+ zone: TemplateZoneBase;
311
+ oldName: string;
312
+ newName: string;
313
+ };
314
+ [CaptureToEngineEventType.ZoneFilterRegexChanged]: {
315
+ zone: TemplateZoneBase;
316
+ oldFilterRegex: string | null;
317
+ newFilterRegex: string | null;
318
+ };
319
+ [CaptureToEngineEventType.ZoneOutputRegexChanged]: {
320
+ zone: TemplateZoneBase;
321
+ oldOutputRegex: string | null;
322
+ newOutputRegex: string | null;
323
+ };
324
+ [CaptureToEngineEventType.ZoneOutputReplacementChanged]: {
325
+ zone: TemplateZoneBase;
326
+ oldOutputReplacement: string | null;
327
+ newOutputReplacement: string | null;
328
+ };
329
+ [CaptureToEngineEventType.ZoneRequiredChanged]: {
330
+ zone: TemplateZoneBase;
331
+ oldRequired: boolean;
332
+ newRequired: boolean;
333
+ };
334
+ [CaptureToEngineEventType.ZoneDataTypeChanged]: {
335
+ zone: TemplateZoneBase;
336
+ oldDataType: string | null;
337
+ newDataType: string | null;
338
+ };
339
+ [CaptureToEngineEventType.ZoneExcludeFromOutputChanged]: {
340
+ zone: TemplateZoneBase;
341
+ oldExcludeFromOutput: boolean;
342
+ newExcludeFromOutput: boolean;
343
+ };
344
+ [CaptureToEngineEventType.ZoneDefaultValueIfEmptyChanged]: {
345
+ zone: TemplateZoneBase;
346
+ oldDefaultValueIfEmpty: string | null;
347
+ newDefaultValueIfEmpty: string | null;
348
+ };
349
+ [CaptureToEngineEventType.ZoneExampleChanged]: {
350
+ zone: TemplateZoneBase;
351
+ oldExample: string | null;
352
+ newExample: string | null;
353
+ };
354
+ [CaptureToEngineEventType.ZoneHiddenChanged]: {
355
+ zone: TemplateZoneBase;
356
+ oldHidden: boolean;
357
+ newHidden: boolean;
358
+ };
359
+ [CaptureToEngineEventType.ZoneChanged]: {
360
+ zone: TemplateZoneBase;
361
+ propertiesChanged: string[];
362
+ };
363
+ [CaptureToEngineEventType.ZoneAnchorLocationChanged]: {
364
+ zone: TemplateZoneBase;
365
+ oldAnchorLocation: AnchorLocation;
366
+ newAnchorLocation: AnchorLocation;
367
+ };
368
+ [CaptureToEngineEventType.ZoneGroupChildrenChanged]: {
369
+ zone: TemplateZoneBase;
370
+ newGroupChildren: boolean;
371
+ oldGroupChildren: boolean;
372
+ };
373
+ [CaptureToEngineEventType.ZoneChildZoneAdded]: {
374
+ parentZone: TemplateZoneBase;
375
+ newChildZone: TemplateZoneBase;
376
+ };
377
+ [CaptureToEngineEventType.ZoneChildZoneRemoved]: {
378
+ parentZone: TemplateZoneBase;
379
+ removedChildZone: TemplateZoneBase;
380
+ };
381
+ [CaptureToEngineEventType.ZoneChildZonesChanged]: {
382
+ parentZone: TemplateZoneBase;
383
+ };
384
+ [CaptureToEngineEventType.ZoneError]: {
385
+ zone: TemplateZoneBase;
386
+ error?: Error;
387
+ message: string;
388
+ };
389
+ }
390
+ type ZoneKind = "simple" | "anchor" | "anchor-child";
391
+ type AnchorLocation = "TopLeft" | "TopRight" | "BottomLeft" | "BottomRight" | "Center";
392
+ interface TemplateZoneBase {
393
+ id: string;
394
+ name: string;
395
+ type: ZoneKind;
396
+ example: string | null;
397
+ needsAnchorReposition: boolean;
398
+ rect: Rectangle;
399
+ hidden?: boolean;
400
+ filterRegex: string | null;
401
+ outputRegex: string | null;
402
+ outputReplacement: string | null;
403
+ required: boolean;
404
+ dataType: string | null;
405
+ excludeFromOutput: boolean;
406
+ defaultValueIfEmpty: string | null;
407
+ anchorLocation?: AnchorLocation;
408
+ groupChildren?: boolean;
409
+ children?: TemplateZoneBase[];
410
+ handleEvent?<T extends CaptureEngineToZoneEventType>(id: string, type: T, payload: CaptureEngineToZoneEventPayloads[T]): void;
411
+ setCanvasManager?(cm?: ZoneCanvasManager): void;
412
+ toExternal(docWidth: number, docHeight: number): ExternalTemplateZone;
413
+ setEngineEventSink?(callback?: (type: CaptureToEngineEventType, payload?: CaptureToEngineEventPayloads[CaptureToEngineEventType]) => void): void;
414
+ }
415
+ interface ZoneCanvasManager {
416
+ readonly zoneId: string;
417
+ addPolygon(points: Point[], color: string, isSelectable: boolean): string;
418
+ addRectangle(rect: Rectangle, name: string | null, color: string, isResizable: boolean, isSelectable: boolean): string;
419
+ addCircle(center: Point, radius: number, color: string, isResizable: boolean, isSelectable: boolean): string;
420
+ setName(id: string, name: string | null): void;
421
+ setColor(id: string, color: string): void;
422
+ setSelectable(id: string, isSelectable: boolean): void;
423
+ setResizable(id: string, isResizable: boolean): void;
424
+ setRectangleSize(id: string, rect: Rectangle): void;
425
+ setVisibility(id: string, isVisible: boolean): void;
426
+ removeObject(id: string): void;
427
+ /** convenience for “wipe all visuals for this zone” */
428
+ clearAll(): void;
429
+ }
430
+ declare class CaptureEngine {
431
+ private readonly engine;
432
+ private listeners;
433
+ private serverApi?;
434
+ private _name;
435
+ zones: TemplateZoneBase[];
436
+ private ocrRead;
437
+ private zoneOcrMatches;
438
+ private ocrOverlayIds;
439
+ private flags;
440
+ private zoneCounter;
441
+ constructor(selector: string, serverApi?: CaptureEngineServerApi);
442
+ private setupEngine;
443
+ on<T extends CapturePublicEventType>(event: T, handler: (payload: CapturePublicEventPayloads[T]) => void, options?: {
444
+ once?: boolean;
445
+ }): void;
446
+ off<T extends CapturePublicEventType>(event: T, handler: (payload: CapturePublicEventPayloads[T]) => void): void;
447
+ private emitExternal;
448
+ private emitToZone;
449
+ private refreshMatches;
450
+ private engineEventHandler;
451
+ private onZoneAdded;
452
+ private onZoneRemoved;
453
+ private getZoneByCanvasEngineId;
454
+ private doRender;
455
+ private createMeteredFn;
456
+ loadExternalTemplate(external: ExternalTemplate, reapplyZonePositioning: boolean): void;
457
+ getExternalTemplate(): ExternalTemplate;
458
+ private rectFromExternal;
459
+ private zoneFromExternal;
460
+ get name(): string;
461
+ set name(value: string);
462
+ get allZonesFlattened(): TemplateZoneBase[];
463
+ getZoneById(id: string): TemplateZoneBase | undefined;
464
+ /**
465
+ * Add a new simple zone
466
+ * @param bounds Rectangle
467
+ */
468
+ addSimpleZone(bounds: Rectangle): void;
469
+ /**
470
+ * Add a new anchor zone
471
+ * @param bounds Rectangle
472
+ */
473
+ addAnchorZone(bounds: Rectangle): void;
474
+ /**
475
+ * Add a child zone linked to an anchor
476
+ * @param anchorId string
477
+ * @param bounds Rectangle
478
+ */
479
+ addAnchorChildZone(anchorId: string, bounds: Rectangle): void;
480
+ /**
481
+ * Remove a zone and its canvas representation by id
482
+ * @param id string
483
+ */
484
+ removeZoneById(id: string): boolean;
485
+ updateZone(id: string, patch: Partial<TemplateZoneBase>): void;
486
+ private setFlag;
487
+ private clearFlag;
488
+ hasFlag(objOrId: string | TemplateZoneBase, flag: string): boolean;
489
+ private clearAllFlags;
490
+ getObjectsWithFlag(flag: string): TemplateZoneBase[];
491
+ setSelectedZones(objOrIds: (string | TemplateZoneBase)[]): void;
492
+ getSelectedZones(): TemplateZoneBase[];
493
+ get pan(): Vector;
494
+ get zoom(): number;
495
+ setZoom(zoom: number, center?: Point): void;
496
+ setPan(x: number, y: number): void;
497
+ get width(): number;
498
+ get height(): number;
499
+ setBackgroundImage(imageOrUrl: string | File | Blob): Promise<void>;
500
+ switchMode(name: string): void;
501
+ get mode(): string;
502
+ /**
503
+ * Render the current OCR snapshot as non-interactive polygons on the canvas.
504
+ */
505
+ showOcr(): void;
506
+ /**
507
+ * Remove OCR overlay polygons from the canvas.
508
+ */
509
+ hideOcr(): void;
510
+ get isOcrShown(): boolean;
511
+ setOcrSnapshot(ocrRead: OcrRead | null): void;
512
+ getOcrSnapshot(): OcrRead | null;
513
+ setOcrMatchesSnapshot(matches: ZoneOcrMatch[]): void;
514
+ getOcrMatchesSnapshot(): ZoneOcrMatch[];
515
+ setServerApi(api: CaptureEngineServerApi): void;
516
+ private loadOcrFromImage;
517
+ private getZoneMatchesFromServer;
518
+ }
519
+ interface OcrRead {
520
+ documentWidth: number;
521
+ documentHeight: number;
522
+ lines: OcrWord[];
523
+ }
524
+ interface OcrWord {
525
+ ocrTextResultId: string;
526
+ text: string;
527
+ confidence: number;
528
+ polygonPercent: Polygon;
529
+ bounds: Rectangle;
530
+ center: Point;
531
+ }
532
+ interface ZoneOcrMatch {
533
+ templateZoneId: string;
534
+ ocrTextResultId: number;
535
+ originalText: string;
536
+ processedText: string;
537
+ polygonPercent: Polygon;
538
+ anchorPoint?: Point | null;
539
+ }
540
+ interface InternalZoneOcrMatch {
541
+ templateZoneId: string;
542
+ ocrTextResultId: number;
543
+ originalText: string;
544
+ processedText: string;
545
+ polygonPercent: Polygon;
546
+ polygonAbsolute: Polygon;
547
+ anchorPointPercent?: Point | null;
548
+ anchorPointAbsolute?: Point | null;
549
+ }
550
+ interface CaptureEngineServerApi {
551
+ /** 1) /api/v1/ocr/readimage */
552
+ readImage(file: File | Blob): Promise<Result<OcrRead>>;
553
+ /** 2) /api/v1/ocr/matchocrtozones */
554
+ matchOcrToZones(req: {
555
+ captureTemplate: ExternalTemplate;
556
+ ocr: OcrRead;
557
+ }): Promise<Result<ZoneOcrMatch[]>>;
558
+ }
559
+
560
+ export { CaptureEngine, type CaptureEngineServerApi, type CaptureEngineToZoneEventPayloads, CaptureEngineToZoneEventType, type CapturePublicEventPayloads, CapturePublicEventType, type CaptureToEngineEventPayloads, CaptureToEngineEventType, type CaptureZoneEventPayloads, type ExternalTemplate, type ExternalTemplateZone, type ExternalZoneType, type OcrRead, type OcrWord, type TemplateZoneBase, type ZoneCanvasManager, type ZoneKind, type ZoneOcrMatch };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dytools-capture-engine",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "An editor allowing the creation of templates for ocr capture.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",