dynamsoft-mrz-scanner
Version:
Dynamsoft MRZ Scanner JavaScript Edition is a ready-to-use SDK for web applications that accurately recognizes and parses Machine-Readable Zones on Machine-Readable Travel Documents.
435 lines (401 loc) • 13.5 kB
TypeScript
import { CameraEnhancer } from 'dynamsoft-capture-vision-bundle';
import { CameraView } from 'dynamsoft-capture-vision-bundle';
import { CapturedResult } from 'dynamsoft-capture-vision-bundle';
import { CaptureVisionRouter } from 'dynamsoft-capture-vision-bundle';
import { DSImageData } from 'dynamsoft-capture-vision-bundle';
import { EngineResourcePaths } from 'dynamsoft-capture-vision-bundle';
export declare const DEFAULT_TEMPLATE_NAMES: {
td3: string;
td1: string;
td2: string;
mrva: string;
mrvb: string;
td1AndTd2: string;
mrvaAndMrvb: string;
passportAndTd1: string;
passportAndTd2: string;
all: string;
};
export declare function displayMRZDate(date: MRZDate): string;
export declare const DynamsoftMRZScanner: {
MRZScanner: typeof MRZScanner;
MRZScannerView: typeof MRZScannerView;
};
export declare enum EnumDocumentSide {
MRZ = "mrz",// The side of the document that contains the MRZ (primary side)
Opposite = "opposite"
}
export declare enum EnumMRZData {
InvalidFields = "invalidFields",
DocumentType = "documentType",
DocumentNumber = "documentNumber",
MRZText = "mrzText",
FirstName = "firstName",
LastName = "lastName",
Age = "age",
Sex = "sex",
IssuingState = "issuingState",
IssuingStateRaw = "issuingStateRaw",
Nationality = "nationality",
NationalityRaw = "nationalityRaw",
DateOfBirth = "dateOfBirth",
DateOfExpiry = "dateOfExpiry",
OptionalData1 = "optionalData1",
OptionalData2 = "optionalData2"
}
export declare enum EnumMRZDocumentType {
Passport = "td3_passport",
TD1 = "td1_id",
TD2 = "td2_id",
MRVA = "mrva_visa",
MRVB = "mrvb_visa"
}
export declare enum EnumMRZScanMode {
TD3 = "td3",
TD1 = "td1",
TD2 = "td2",
MRVA = "mrva",
MRVB = "mrvb",
TD1AndTD2 = "td1AndTd2",
MRVAAndMRVB = "mrvaAndMrvb",
PassportAndTD1 = "passportAndTd1",
PassportAndTD2 = "passportAndTd2",
All = "all"
}
export declare enum EnumMRZScannerViews {
Scanner = "scanner",
Result = "scan-result"
}
export declare enum EnumResultStatus {
RS_SUCCESS = 0,
RS_CANCELLED = 1,
RS_FAILED = 2
}
/**
* Configuration for format selector button labels
*/
declare interface FormatSelectorConfig {
passportLabel?: string;
idLabel?: string;
visaLabel?: string;
allLabel?: string;
}
/**
* Configuration for UI messages and localization
*/
declare interface MessagesConfig {
positionMRZ?: string;
holdSteady?: string;
scanSuccess?: string;
flipDocument?: string;
flipDocumentCountdown?: string;
positionPortrait?: string;
scanMRZFirst?: string;
scanningPortrait?: string;
portraitScanned?: string;
bothSidesScanned?: string;
skipPortraitLabel?: string;
loadImageFailed?: string;
cameraAccessDenied?: string;
rotateDevice?: string;
}
export declare interface MRZData {
[EnumMRZData.InvalidFields]?: EnumMRZData[];
[EnumMRZData.DocumentType]: EnumMRZDocumentType;
[EnumMRZData.DocumentNumber]: string;
[EnumMRZData.MRZText]: string;
[EnumMRZData.FirstName]: string;
[EnumMRZData.LastName]: string;
[EnumMRZData.Age]: number;
[EnumMRZData.Sex]: string;
[EnumMRZData.IssuingState]: string;
[EnumMRZData.IssuingStateRaw]: string;
[EnumMRZData.Nationality]: string;
[EnumMRZData.NationalityRaw]: string;
[EnumMRZData.DateOfBirth]: MRZDate;
[EnumMRZData.DateOfExpiry]: MRZDate;
[EnumMRZData.OptionalData1]?: string;
[EnumMRZData.OptionalData2]?: string;
}
export declare const MRZDataLabel: Record<EnumMRZData, string> & Record<string, string>;
export declare interface MRZDate {
year: number;
month: number;
day: number;
}
/**
* A captured image returned from {@link MRZResult.getDocumentImage},
* {@link MRZResult.getOriginalImage}, and {@link MRZResult.getPortraitImage}.
*
* Extends the bare {@link DSImageData} (raw bytes / dimensions / format)
* with the rendering helpers attached at runtime by {@link attachImageHelpers}.
*/
export declare interface MRZImage extends DSImageData {
/** Render the image data into an `HTMLCanvasElement`. */
toCanvas(): HTMLCanvasElement;
/** Encode the image data as a PNG `Blob`. */
toBlob(): Promise<Blob>;
}
export declare interface MRZResult {
status?: EnumResultStatus;
data?: MRZData;
getDocumentImage(side: EnumDocumentSide): MRZImage | null;
getOriginalImage(side: EnumDocumentSide): MRZImage | null;
getPortraitImage(): MRZImage | null;
}
export declare class MRZScanner {
private config;
private scannerView?;
private resources;
private isInitialized;
private isCapturing;
private loadingScreen;
private isDynamsoftResourcesLoaded;
protected isFileMode: boolean;
private showLoadingOverlay;
private hideLoadingOverlay;
constructor(config: MRZScannerConfig);
/**
* Normalizes template names to TemplatePair format.
* Accepts either a string (legacy format) or TemplatePair object.
* When a string is provided, auto-derives the MRZ-only variant as `${name}-MRZOnly`.
*/
private static normalizeTemplateName;
initialize(): Promise<{
resources: SharedResources;
components: {
scannerView?: MRZScannerView;
};
}>;
private initializeDynamsoftResources;
private initializeDCVResources;
private shouldCreateDefaultContainer;
private createDefaultMRZScannerContainer;
private checkForTemporaryLicense;
private validateViewConfigs;
private initializeMRZScannerConfig;
private createViewContainers;
dispose(): void;
/**
* Processes a static image source (Blob, URL, DSImageData, or HTML element).
* String inputs are fetched as URLs; all other types are forwarded to capture() as-is.
*/
private processImageSource;
launch(imageSource?: Blob | string | DSImageData | HTMLImageElement | HTMLVideoElement | HTMLCanvasElement): Promise<MRZResult>;
}
export declare interface MRZScannerConfig {
license?: string;
container?: HTMLElement | string;
templateFilePath?: string;
utilizedTemplateNames?: UtilizedTemplateNames;
engineResourcePaths?: EngineResourcePaths;
scannerViewConfig?: Omit<MRZScannerViewConfig, "templateFilePath" | "utilizedTemplateNames">;
mrzFormatType?: Array<EnumMRZDocumentType>;
returnOriginalImage?: boolean;
returnDocumentImage?: boolean;
returnPortraitImage?: boolean;
}
export declare class MRZScannerView {
private resources;
private config;
private isSoundFeedbackOn;
private isFlashOn;
private static readonly FORMAT_ORDER;
private currentFormatMode;
private scanModeManager;
private currentScanMode;
private messages;
private resizeTimer;
private defaultBackCameraId;
private originalImageData;
private initialized;
private initializedUI;
private isMRZScanned;
private isPortraitScanned;
private areSidesDifferent;
private isWaitingForFlip;
private flipTimeoutHandle;
private flipCountdownHandle;
private portraitSkipTimerHandle;
private static readonly PORTRAIT_SKIP_TIMEOUT_MS;
private isProcessingSameSideFrame;
private isProcessingPortraitFrame;
private sameSideMissCount;
private static readonly SAME_SIDE_MISSES_BEFORE_FLIP;
private consecutiveStablePortraitFrames;
private static readonly PORTRAIT_STABLE_FRAMES_REQUIRED;
private latestLocalizedTextLines;
private mrzSideData;
private ui;
private scanSpinnerEl;
private currentScanResolver?;
private loadingScreen;
private showScannerLoadingOverlay;
private hideScannerLoadingOverlay;
private handleResize;
constructor(resources: SharedResources, config: MRZScannerViewConfig);
initialize(): Promise<void>;
private initializeUI;
/**
* Returns the set of enabled MRZ types from config, or all types if unspecified.
*/
private getEnabledTypes;
/**
* Returns the format buttons to display based on enabled types.
* Includes "all" only when multiple categories are active.
*
* @returns The visible button identifiers in display order. A result of
* length `<= 1` indicates the selector should be hidden entirely.
*/
private getVisibleFormatButtons;
private toggleFlash;
private syncFlashIcon;
private probeFlashSupport;
private switchCamera;
private toggleSoundFeedback;
private setGuideFrame;
private setGuideFrameVisible;
private showGuideSuccessBorder;
private showFlipAnimation;
private hideFlipAnimation;
private showBadge;
private static readonly FORMAT_DOC_TYPES;
private static buildScanModeManager;
private setFormatMode;
private syncFormatButtons;
private setupPortraitOnlyMode;
private updateScanRegion;
private calculateScanRegion;
openCamera(): Promise<void>;
closeCamera(hideContainer?: boolean): Promise<void>;
pauseCamera(): void;
stopCapturing(): void;
private handleCloseBtn;
private startPortraitSkipTimer;
private clearPortraitSkipTimer;
private handleSkipPortrait;
private loadImageFile;
private initializeScanModeManager;
private getScanMode;
private firstFrame;
private startCapturing;
private hasSwitchedToFullTemplate;
private switchToFullTemplate;
launch(): Promise<MRZResult | undefined>;
private isDocumentTypeEnabled;
handleMRZResult(result: CapturedResult): Promise<void>;
private handleMRZSideScan;
private tryPortraitOnSameSide;
private handlePortraitSideScan;
private showScanSpinner;
private hideScanSpinner;
private resetScanningState;
}
export declare interface MRZScannerViewConfig {
cameraEnhancerUIPath?: string;
uiPath?: string;
container?: HTMLElement | string;
templateFilePath?: string;
utilizedTemplateNames?: UtilizedTemplateNames;
mrzFormatType?: EnumMRZDocumentType | Array<EnumMRZDocumentType>;
enableScanRegion?: boolean;
showLoadImageButton?: boolean;
showFormatSelector?: boolean;
showSoundToggle?: boolean;
enableMultiFrameCrossFilter?: boolean;
loadImageAcceptedTypes?: string;
loadImageFileConverter?: (file: File) => Promise<Blob>;
flipDocumentTimeout?: number;
toolbarButtonsConfig?: ToolbarButtonsConfig;
formatSelectorConfig?: FormatSelectorConfig;
messagesConfig?: MessagesConfig;
themeConfig?: ThemeConfig;
}
export declare type ResultStatus = {
code: EnumResultStatus;
message?: string;
};
declare interface SharedResources {
cvRouter?: CaptureVisionRouter;
cameraEnhancer?: CameraEnhancer;
cameraView?: CameraView;
result?: MRZResult;
onResultUpdated?: (result: MRZResult) => void;
returnOriginalImage?: boolean;
returnDocumentImage?: boolean;
returnPortraitImage?: boolean;
}
declare type TemplatePair = {
full: string;
mrzOnly: string;
};
declare interface ThemeConfig {
colors?: {
primary?: string;
accent?: string;
backgroundDark?: string;
backgroundBadge?: string;
backgroundOverlay?: string;
backgroundSkipLabel?: string;
text?: string;
textSecondary?: string;
divider?: string;
guideFrame?: string;
spinnerColor?: string;
spinnerBackground?: string;
};
typography?: {
fontFamily?: string;
badgeFontSize?: string;
badgeFontSizeDesktop?: string;
formatBtnFontSize?: string;
formatBtnFontSizeSmall?: string;
};
spacing?: {
topBarHeight?: string;
topBarHeightDesktop?: string;
guideFrameWidth?: string;
guideFrameWidthDesktop?: string;
badgeMargin?: string;
badgeBorderRadius?: string;
};
}
export declare interface ToolbarButton {
id: string;
icon: string;
label: string;
onClick?: () => void | Promise<void>;
className?: string;
isDisabled?: boolean;
isHidden?: boolean;
}
/**
* Configuration for a single toolbar button
*/
declare interface ToolbarButton_2 {
id: string;
icon?: string;
label?: string;
isHidden?: boolean;
className?: string;
}
export declare type ToolbarButtonConfig = Pick<ToolbarButton, "icon" | "label" | "className" | "isHidden">;
/**
* Partial configuration for toolbar buttons (id is required internally)
*/
declare type ToolbarButtonConfig_2 = Partial<Omit<ToolbarButton_2, "id">>;
/**
* Configuration for all toolbar buttons
*/
declare interface ToolbarButtonsConfig {
close?: ToolbarButtonConfig_2;
loadImage?: ToolbarButtonConfig_2;
cameraSwitch?: ToolbarButtonConfig_2;
flash?: ToolbarButtonConfig_2;
flashOff?: ToolbarButtonConfig_2;
sound?: ToolbarButtonConfig_2;
soundOff?: ToolbarButtonConfig_2;
}
export declare type UtilizedTemplateNames = Record<EnumMRZScanMode, string | TemplatePair>;
export * from "dynamsoft-capture-vision-bundle";
export { }