scanCnic method
this method will process the images and extract information from the card
Implementation
Future<CnicModel> scanCnic({required InputImage imageToScan}) async {
List<String> cnicDates = [];
final textRecognizer = TextRecognizer(script: TextRecognitionScript.latin);
final RecognizedText recognisedText =
await textRecognizer.processImage(imageToScan);
bool isNameNext = false;
for (TextBlock block in recognisedText.blocks) {
for (TextLine line in block.lines) {
if (isNameNext) {
_cnicDetails.cnicHolderName = line.text;
isNameNext = false;
}
if (line.text.toLowerCase() == "name" ||
line.text.toLowerCase() == "nane" ||
line.text.toLowerCase() == "nam" ||
line.text.toLowerCase() == "ame") {
isNameNext = true;
}
for (TextElement element in line.elements) {
String selectedText = element.text;
if (selectedText.length == 15 &&
selectedText.contains("-", 5) &&
selectedText.contains("-", 13)) {
_cnicDetails.cnicNumber = selectedText;
} else if (selectedText.length == 10 &&
((selectedText.contains("/", 2) &&
selectedText.contains("/", 5)) ||
(selectedText.contains(".", 2) &&
selectedText.contains(".", 5)))) {
cnicDates.add(selectedText.replaceAll(".", "/"));
}
}
}
}
if (cnicDates.length > 0 &&
_cnicDetails.cnicExpiryDate.length == 10 &&
!cnicDates.contains(_cnicDetails.cnicExpiryDate)) {
cnicDates.add(_cnicDetails.cnicExpiryDate);
}
if (cnicDates.length > 0 &&
_cnicDetails.cnicIssueDate.length == 10 &&
!cnicDates.contains(_cnicDetails.cnicIssueDate)) {
cnicDates.add(_cnicDetails.cnicIssueDate);
}
if (cnicDates.length > 0 &&
_cnicDetails.cnicExpiryDate.length == 10 &&
!cnicDates.contains(_cnicDetails.cnicExpiryDate)) {
cnicDates.add(_cnicDetails.cnicExpiryDate);
}
if (cnicDates.length > 1) {
cnicDates = sortDateList(dates: cnicDates);
}
if (cnicDates.length == 1 &&
_cnicDetails.cnicHolderDateOfBirth.length != 10) {
_cnicDetails.cnicHolderDateOfBirth = cnicDates[0];
isFrontScan = true;
Fluttertoast.showToast(
msg: "Scan Back Side Now",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.grey,
textColor: Colors.white,
fontSize: 16.0);
} else if (cnicDates.length == 2) {
_cnicDetails.cnicIssueDate = cnicDates[0];
_cnicDetails.cnicExpiryDate = cnicDates[1];
if (!isFrontScan)
Fluttertoast.showToast(
msg: "Scan Front Side Now",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.grey,
textColor: Colors.white,
fontSize: 16.0);
} else if (cnicDates.length == 3) {
_cnicDetails.cnicHolderDateOfBirth = cnicDates[0].replaceAll(".", "/");
_cnicDetails.cnicIssueDate = cnicDates[1].replaceAll(".", "/");
_cnicDetails.cnicExpiryDate = cnicDates[2].replaceAll(".", "/");
}
textRecognizer.close();
if (_cnicDetails.cnicNumber.length > 0 &&
_cnicDetails.cnicHolderDateOfBirth.length > 0 &&
_cnicDetails.cnicIssueDate.length > 0 &&
_cnicDetails.cnicExpiryDate.length > 0) {
print('==================== SMART CARD DETAILS $_cnicDetails');
return Future.value(_cnicDetails);
} else {
print('==================== OLD CARD DETAILS $_cnicDetails');
return await scanImage(imageSource: source);
}
}