diff --git a/backend/__pycache__/main.cpython-313.pyc b/backend/__pycache__/main.cpython-313.pyc index 200e12e..c17dccd 100644 Binary files a/backend/__pycache__/main.cpython-313.pyc and b/backend/__pycache__/main.cpython-313.pyc differ diff --git a/backend/main.py b/backend/main.py index 02d793b..7bd917a 100644 --- a/backend/main.py +++ b/backend/main.py @@ -10,8 +10,39 @@ from pypdf import PdfReader import pytesseract from PIL import Image from pdf2image import convert_from_bytes +import pdfplumber from sqlalchemy.orm import Session + + +# 2. OCR Module +def extract_text_from_pdf(file_bytes: bytes) -> str: + # Try pdfplumber first for layout preservation + try: + with pdfplumber.open(io.BytesIO(file_bytes)) as pdf: + text = "" + for page in pdf.pages: + page_text = page.extract_text(layout=True) + if page_text: + text += page_text + "\n" + if text.strip(): + return text.strip() + except Exception as e: + print(f"pdfplumber error: {e}") + + # Fallback to pypdf + try: + reader = PdfReader(io.BytesIO(file_bytes)) + text = "" + for page in reader.pages: + page_text = page.extract_text() + if page_text: + text += page_text + "\n" + return text.strip() + except Exception as e: + print(f"Error reading PDF: {e}") + return "" + # Internal modules from database import get_db, Email from scheduler import start_scheduler, stop_scheduler @@ -57,19 +88,7 @@ class LoginResponse(BaseModel): class NERResponse(BaseModel): text: str -# 2. OCR Module -def extract_text_from_pdf(file_bytes: bytes) -> str: - try: - reader = PdfReader(io.BytesIO(file_bytes)) - text = "" - for page in reader.pages: - page_text = page.extract_text() - if page_text: - text += page_text + "\n" - return text.strip() - except Exception as e: - print(f"Error reading PDF: {e}") - return "" + def extract_text_from_image(file_bytes: bytes) -> str: try: diff --git a/backend/requirements.txt b/backend/requirements.txt index 9f0da77..8c7160e 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -9,3 +9,4 @@ psycopg2-binary imap-tools apscheduler python-dotenv +pdfplumber diff --git a/frontend/src/app/ocr/ocr.component.ts b/frontend/src/app/ocr/ocr.component.ts index 192a56d..c743cd9 100644 --- a/frontend/src/app/ocr/ocr.component.ts +++ b/frontend/src/app/ocr/ocr.component.ts @@ -51,7 +51,7 @@ import { ToastModule } from 'primeng/toast'; [(ngModel)]="extractedText" readonly class="w-full" - style="min-height: 300px; width: 100%; border-color: #d1d5db;"> + style="min-height: 300px; width: 100%; border-color: #d1d5db; font-family: monospace;">