Legora / db /text_extractor.py
sai-Rohan's picture
created a process of storing the data in the vector db as well as in knowledge graph
19949f9
Raw
History Blame Contribute Delete
1.95 kB
from pdf2image import convert_from_path
import pytesseract
import cv2
import numpy as np
from PIL import Image
import pdfplumber
class LegalOCRExtractor:
"""
Production-grade OCR extractor for legal documents
"""
def __init__(self, dpi: int = 300):
self.dpi = dpi
# ---------------------------
# IMAGE PREPROCESSING
# ---------------------------
def preprocess_image(self, image: Image.Image) -> np.ndarray:
img = np.array(image)
# Convert to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Denoise
gray = cv2.fastNlMeansDenoising(gray, None, 30, 7, 21)
# Thresholding (important for legal docs)
_, thresh = cv2.threshold(
gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU
)
return thresh
# ---------------------------
# SINGLE PAGE OCR
# ---------------------------
def ocr_page(self, image: Image.Image) -> str:
processed_img = self.preprocess_image(image)
config = r'--oem 3 --psm 6'
text = pytesseract.image_to_string(
processed_img,
lang='eng',
config=config
)
return text
# ---------------------------
# MAIN FUNCTION
# ---------------------------
def extract_text(self,pdf_path):
text = ""
with pdfplumber.open(pdf_path) as pdf:
for page in pdf.pages:
text += (page.extract_text() or "") + "\n"
return text
# ---------------------------
# TEST RUN
# ---------------------------
if __name__ == "__main__":
pdf_path = "./constitution_of_india.pdf"
extractor = LegalOCRExtractor(dpi=300)
text = extractor.extract_text(pdf_path)
# Save output
with open("text_extracted_ocr_output.txt", "w", encoding="utf-8") as f:
f.write(text)
print("\nOCR extraction completed. Output saved to output.txt")