octech / ocr_processor.py
sobarine's picture
Rename processor.py to ocr_processor.py
9e80464 verified
Raw
History Blame Contribute Delete
2.75 kB
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