| 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'(?P<cin>U\d{5}[A-Z]{2}\d{4}PTC\d{6})\W*' + |
| r'(?P<company>.+?)\s+' + |
| r'(?P<din>\d{6,10})\W*' + |
| r'(?P<director>[A-Z\s\.]+?)\s+' + |
| r'(?P<roc>\d{3})\W*' + |
| r'(?P<status>Disqualified|Qualified)\W*' + |
| r'(?P<from>\d{2}\.\d{2}\.\d{4})\W*' + |
| r'(?P<till>\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 |
|
|