UNPKG

iran-bank-cards-ocr

Version:

A TypeScript library to detect Iranian bank names, logos, and validate card numbers using OCR and Luhn algorithm.

115 lines (114 loc) 5.36 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); // Import Tesseract.js for OCR (Optical Character Recognition) const tesseract_js_1 = __importDefault(require("tesseract.js")); // Import utility functions and bank data const utils_1 = require("./utils"); /** * Capture an image from the user's camera and return it as a data URL. * @returns {Promise<string>} A promise that resolves to the image data URL. */ function captureImageFromCamera() { return __awaiter(this, void 0, void 0, function* () { return new Promise((resolve, reject) => { const video = document.createElement('video'); video.setAttribute('autoplay', ''); video.setAttribute('playsinline', ''); navigator.mediaDevices .getUserMedia({ video: { facingMode: 'environment' } }) .then((stream) => { video.srcObject = stream; video.onloadedmetadata = () => { const canvas = document.createElement('canvas'); canvas.width = video.videoWidth; canvas.height = video.videoHeight; const context = canvas.getContext('2d'); if (context) { context.drawImage(video, 0, 0, canvas.width, canvas.height); const imageDataUrl = canvas.toDataURL('image/jpeg'); resolve(imageDataUrl); // Stop the video stream stream.getTracks().forEach((track) => track.stop()); } else { reject(new Error('Could not get canvas context.')); } }; }) .catch((error) => { reject(new Error(`Error accessing camera: ${error.message}`)); }); }); }); } /** * Extract the card number from an image using OCR. * @param {string} imageDataUrl - The image data URL. * @returns {Promise<string | null>} A promise that resolves to the extracted card number or null if not found. */ function extractCardNumberFromImage(imageDataUrl) { return __awaiter(this, void 0, void 0, function* () { try { // Preprocess the image (crop and resize) const processedImage = yield (0, utils_1.preprocessImage)(imageDataUrl); // Use Tesseract.js to recognize text from the processed image const { data } = yield tesseract_js_1.default.recognize(processedImage, 'eng', { logger: (m) => console.log(m), // Log progress (optional) }); // Use a regex to find a 16-digit number (assumed to be the card number) const cardNumberRegex = /\b\d{16}\b/; const match = data.text.match(cardNumberRegex); return match ? match[0] : null; } catch (error) { console.error('Error processing image:', error); return null; } }); } /** * Main function to capture an image, extract the card number, and detect the bank info. * @returns {Promise<{ cardNumber: string | null; bankInfo: { en: string; fa: string; logo: string } | null }>} An object containing the card number and bank info (name and logo). */ function readBankCard() { return __awaiter(this, void 0, void 0, function* () { try { console.log('Capturing image from camera...'); const imageDataUrl = yield captureImageFromCamera(); console.log('Processing image to extract card number...'); const cardNumber = yield extractCardNumberFromImage(imageDataUrl); if (cardNumber && (0, utils_1.validateCardNumber)(cardNumber)) { const bankInfo = (0, utils_1.detectBankInfo)(cardNumber); if (bankInfo) { return { cardNumber, bankInfo }; } else { console.log('Bank not recognized for the given card number.'); return { cardNumber, bankInfo: null }; } } else { console.log('No valid card number found in the image.'); return { cardNumber: null, bankInfo: null }; } } catch (error) { console.error('Error reading bank card:', error); return { cardNumber: null, bankInfo: null }; } }); } // Export the main function exports.default = readBankCard;