Enterprise-Data-Factory / document_parser.py
ravi2814's picture
Create document_parser.py
2ef9449 verified
Raw
History Blame Contribute Delete
1.82 kB
import fitz # PyMuPDF
import docx
import os
def extract_text_from_file(file_path: str, original_filename: str) -> str:
"""
Enterprise router that ingests a file, identifies its type,
and extracts raw text for the LLM pipeline.
"""
# Get the file extension and convert to lowercase
_, file_extension = os.path.splitext(original_filename)
ext = file_extension.lower()
try:
# Route 1: PDF Extraction
if ext == '.pdf':
return _extract_from_pdf(file_path)
# Route 2: Word Document Extraction
elif ext in ['.docx', '.doc']:
return _extract_from_docx(file_path)
# Route 3: Plain Text / Markdown Extraction
elif ext in ['.txt', '.md', '.csv']:
with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
return f.read()
# The Bouncer: Reject unsupported files gracefully
else:
raise ValueError(f"Unsupported file type: {ext}. Please upload PDF, DOCX, or TXT.")
except Exception as e:
raise RuntimeError(f"Failed to parse document: {str(e)}")
# --- Private Helper Functions ---
def _extract_from_pdf(file_path: str) -> str:
text_content = []
# fitz opens the document securely
with fitz.open(file_path) as doc:
for page_num in range(len(doc)):
page = doc.load_page(page_num)
text_content.append(page.get_text("text"))
# Clean up the output by joining pages and stripping excess whitespace
return "\n".join(text_content).strip()
def _extract_from_docx(file_path: str) -> str:
doc = docx.Document(file_path)
text_content = [paragraph.text for paragraph in doc.paragraphs if paragraph.text.strip()]
return "\n".join(text_content).strip()