scanCnic method

Future<CnicModel> scanCnic({
  1. required InputImage imageToScan,
})

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);
  }
}