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
JavaScript
;
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;