import pytesseract import os import csv import re import tempfile from pdf2image import convert_from_path from datetime import datetime pytesseract.pytesseract.tesseract_cmd = "/usr/bin/tesseract" POPPLER_PATH = "/usr/bin" OCR_LANG = "eng" def parse_structured_table_line(line): pattern = re.compile( r'(?PU\d{5}[A-Z]{2}\d{4}PTC\d{6})\W*' + r'(?P.+?)\s+' + r'(?P\d{6,10})\W*' + r'(?P[A-Z\s\.]+?)\s+' + r'(?P\d{3})\W*' + r'(?PDisqualified|Qualified)\W*' + r'(?P\d{2}\.\d{2}\.\d{4})\W*' + r'(?P\d{2}\.\d{2}\.\d{4})', re.IGNORECASE ) match = pattern.search(line) if match: return [ match.group("cin").strip(), match.group("company").strip(), match.group("din").strip(), match.group("director").strip(), match.group("roc").strip(), match.group("status").strip(), match.group("from").strip(), match.group("till").strip() ] return None def process_pdf(file, filename): results = [] try: with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp: tmp.write(file.read()) tmp_path = tmp.name images = convert_from_path(tmp_path, dpi=200, poppler_path=POPPLER_PATH) for page_num, image in enumerate(images, start=1): text = pytesseract.image_to_string(image, lang=OCR_LANG) lines = [line.strip() for line in text.splitlines() if line.strip()] for line_num, line in enumerate(lines, start=1): parsed = parse_structured_table_line(line) if parsed: results.append((filename, page_num, line_num, *parsed)) else: results.append((filename, page_num, line_num, '', '', '', '', '', '', '', line)) os.remove(tmp_path) except Exception as e: print(f"❌ Error with {filename}: {e}") return results def process_pdf_files(uploaded_files): all_results = [] for uploaded_file in uploaded_files: all_results.extend(process_pdf(uploaded_file, uploaded_file.name)) output_file = os.path.join("output", f"structured_output.csv") os.makedirs("output", exist_ok=True) with open(output_file, "w", newline="", encoding="utf-8") as out_csv: writer = csv.writer(out_csv) writer.writerow([ "Filename", "Page", "Line", "CIN", "Company Name", "DIN", "Director Name", "ROC Code", "Status", "Period From", "Period Till", "Raw Line (Fallback)" ]) writer.writerows(all_results) return output_file