extractMrzLines method

List<String> extractMrzLines(
  1. String fullText
)

Implementation

List<String> extractMrzLines(String fullText) {
  print("extract");
  final lines = fullText
      .split('\n')
      .map((line) => line.trim())
      .where((line) => line.isNotEmpty)
      .toList();

  List<String> mrzLines = [];

  for (String line in lines) {
    final cleanedLine = line.cleanMrzText();

    // MRZ Line 1: Must start with P< for passport
    bool isMrzLine1 = cleanedLine.startsWith('P<') ||
        cleanedLine.startsWith('P«') ||
        cleanedLine.startsWith('P‹') ||
        cleanedLine.startsWith('P〈') ||
        cleanedLine.startsWith('P<');

    // MRZ Line 2: Must have at least 3 consecutive < characters or variants
    bool isMrzLine2 = RegExp(r'[<«»‹›〈〉<>]{3,}').hasMatch(cleanedLine) &&
        cleanedLine.length >= 40 &&
        !cleanedLine.startsWith('P') &&
        RegExp(r'[A-Z0-9]{6,}').hasMatch(cleanedLine);

    if (isMrzLine1 || (isMrzLine2 && cleanedLine.length >= 36)) {
      print("line : ${line}");
      print("cleanedLine : ${cleanedLine}");
      print("isMrzLine1: $isMrzLine1, isMrzLine2: $isMrzLine2");
      mrzLines.add(cleanedLine.normalizeMrzLine());
    }
  }

  if (mrzLines.length >= 2) {
    print("mrzline > 2 : ${mrzLines.toString()}");
    return mrzLines.take(2).toList();
  }

  return mrzLines;
}