import { createWorker, ImageLike, RecognizeResult } from 'tesseract.js'; import { parseMRZ } from './mrz'; let worker: Tesseract.Worker; export function runOcr(image: ImageLike): Promise; export function runOcr void>( image: ImageLike, callback: T, ): Promise>; export async function runOcr void>( image: ImageLike, callback?: T, ) { if (!worker) { worker = await createWorker(['ocrb', 'eng', 'khm'], 1, { langPath: '/ocr-data', }); } if (callback) return callback(await worker.recognize(image)); } export function parseResultMRZ(result: RecognizeResult) { const zone = result.data.text .split(/[\s\r\n]+/) .filter((v) => /[A-Z0-9<]{30,}/.test(v)); if (zone.length === 3 && zone[0].length === 30) { return parseMRZ({ type: 'TD1', zone }); } else if (zone.length === 2 && zone[0].length === 36) { return parseMRZ({ type: 'TD2', zone }); } else if (zone.length === 2 && zone[0].length === 44) { return parseMRZ({ type: 'TD3', zone }); } else { return null; } }