UNPKG

ngx-image-id-detector

Version:

A package that detects if an image is a Vietnamese citizen ID using Tesseract.js

1 lines 8.48 kB
{"version":3,"file":"ngx-image-id-detector.mjs","sources":["../../../projects/ngx-image-id-detector/src/lib/ngx-image-id-detector.service.ts","../../../projects/ngx-image-id-detector/src/lib/ngx-image-id-detector.component.ts","../../../projects/ngx-image-id-detector/src/lib/ngx-image-id-detector.module.ts","../../../projects/ngx-image-id-detector/src/public-api.ts","../../../projects/ngx-image-id-detector/src/ngx-image-id-detector.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { createWorker, PSM, Worker } from 'tesseract.js';\nimport { from, Observable } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\n\nexport type IdCardSide = 'front' | 'back' | 'unknown';\n\nexport interface DetectIdResult {\n side: IdCardSide;\n text: string;\n}\n\nexport interface DetectIdOptions {\n language?: string;\n whitelist?: string;\n logger?: (msg: any) => void;\n}\n@Injectable({\n providedIn: 'root'\n})\nexport class DetectIdService {\n private readonly SIDE_PATTERNS = new Map<IdCardSide, string[]>([\n ['front', [\n 'CANCUCCONGDAN',\n 'CONGHAXHICHNGHAVITNAM',\n 'CNGHAXHICHNGHAVIETNAM',\n 'CONGHOAXAHOICHUNGHIAVIETNAM',\n 'ĐOCLAPTUDOHANHPHUC',\n 'HOVATENEULLNAME',\n 'DENTITYCARD'\n ]],\n ['back', [\n 'ĐACĐIEMNHANDANGPERSONALIDENTIICATION',\n 'CUCTRUONGCUCCANHSAT',\n 'DANGPERSONALIDENTILICATION',\n 'CUCCANHSAT',\n 'NGONTROTRAI',\n 'NGONTROPHAI',\n 'CCTRUNGCCCNH',\n 'QUNLHNHCHNHVETRATTUXAHĐHU',\n 'THEPOLICEDEPARTMENT',\n 'NHANDANGPERSONALIDENTILICATI',\n 'BOGONGANIUISRYOEPUBLICSECURITY',\n 'SINHPACEOBIRIH'\n ]]\n ]);\n\n detectIdCard(file: File, options?: DetectIdOptions): Observable<DetectIdResult> {\n return from(this.processImage(file, options)).pipe(\n map(result => result),\n catchError(error => {\n console.error('OCR Processing Error:', error);\n throw new Error('Không thể xử lý hình ảnh CCCD. Vui lòng thử lại.');\n })\n );\n }\n\n private async processImage(file: File, options?: DetectIdOptions): Promise<DetectIdResult> {\n const {\n language = 'vie',\n whitelist = 'AĂÂBCDĐEÊGHIKLMNOÔƠPQRSTUƯVXYZaăâbcdđeêghiklmnoôơpqrstuưvxyz' +\n 'ÀÁẢÃẠÂẤẦẨẪẬĂẮẰẲẴẶĐÈÉẺẼẸÊẾỀỂỄỆÌÍỈĨỊÒÓỎÕỌÔỐỒỔỖỘƠỚỜỞỠỢÙÚỦŨỤƯỨỪỬỮỰ' +\n 'àáảãạâấầẩẫậăắằẳẵặđèéẻẽẹêếềểễệìíỉĩịòóỏõọôốồổỗộơớờởỡợùúủũụưứừửữự' +\n 'ÝỲỶỸỴýỳỷỹỵ',\n logger\n } = options || {};\n\n let worker: Worker | null = null;\n try {\n worker = await createWorker(language, 1, { logger });\n\n await worker.setParameters({\n tessedit_char_whitelist: whitelist,\n tessedit_pageseg_mode: PSM.AUTO_OSD,\n });\n\n const { data: { text } } = await worker.recognize(file, { rotateAuto: true });\n const normalizedText = this.normalizeText(text);\n\n for (const [side, patterns] of this.SIDE_PATTERNS.entries()) {\n if (patterns.some(p => normalizedText.includes(this.normalizeText(p)))) {\n return { side, text: normalizedText };\n }\n }\n\n return { side: 'unknown', text: normalizedText };\n } catch (error) {\n throw new Error('Không thể xử lý hình ảnh. Vui lòng kiểm tra lại ảnh CCCD.');\n } finally {\n if (worker) {\n await worker.terminate();\n }\n }\n }\n\n private normalizeText(text: string): string {\n return text\n .toUpperCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '') // Remove diacritics\n .replace(/\\s+/g, ' ') // Normalize spaces\n .trim();\n }\n}\n","import { Component, OnInit } from '@angular/core';\n\n@Component({\n selector: 'lib-ngx-image-id-detector',\n template: `\n <p>\n ngx-image-id-detector works!\n </p>\n `,\n styles: [\n ]\n})\nexport class NgxImageIdDetectorComponent implements OnInit {\n\n constructor() { }\n\n ngOnInit(): void {\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { NgxImageIdDetectorComponent } from './ngx-image-id-detector.component';\n\n\n\n@NgModule({\n declarations: [\n NgxImageIdDetectorComponent\n ],\n imports: [\n ],\n exports: [\n NgxImageIdDetectorComponent\n ]\n})\nexport class NgxImageIdDetectorModule { }\n","/*\n * Public API Surface of ngx-image-id-detector\n */\n\nexport * from './lib/ngx-image-id-detector.service';\nexport * from './lib/ngx-image-id-detector.component';\nexport * from './lib/ngx-image-id-detector.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}