class FallbackMRZ: """ A simple wrapper to mimic PassportEye's MRZ object when we manually extract lines. Assumes TD3 (standard passport) format for simplicity, or tries to be generic. """ def __init__(self, line1, line2): self.line1 = line1 self.line2 = line2 self.valid = True # Initialize fields as empty/None self.type = "" self.country = "" # Issuing country self.surname = "" self.names = "" self.number = "" self.nationality = "" self.date_of_birth = "" self.sex = "" self.expiration_date = "" self.personal_number = "" self._parse() def _parse(self): try: # Basic TD3 parsing (2 lines, 44 chars) # Line 1: P= 5: # Minimum length for basic info self.type = self.line1[0:2].replace('<', '') self.country = self.line1[2:5].replace('<', '') if len(self.line1) > 5: full_name = self.line1[5:].strip('<') # Removed debug print # Split by << and clean each part if '<<' in full_name: parts = full_name.split('<<', 1) self.surname = parts[0].strip('<').strip() # Clean the names part - convert < to spaces for proper name separation names_part = parts[1].strip('<').strip() if len(parts) > 1 else "" # Convert remaining < characters to spaces for proper name separation self.names = names_part.replace('<', ' ').strip() # Removed debug print else: self.surname = full_name.strip('<').strip() self.names = "" # Removed debug print # Parse line 2 for other information (be more flexible with length) if len(self.line2) >= 20: # Minimum for basic info self.number = self.line2[0:9].replace('<', '') if len(self.line2) >= 9 else "" if len(self.line2) >= 13: self.nationality = self.line2[10:13].replace('<', '') if len(self.line2) >= 19: self.date_of_birth = self.line2[13:19] if len(self.line2) >= 21: self.sex = self.line2[20] if len(self.line2) >= 27: self.expiration_date = self.line2[21:27] if len(self.line2) >= 42: self.personal_number = self.line2[28:42].replace('<', '') # Removed debug prints for faster processing pass except Exception as e: # Removed debug print - silently handle parsing errors pass