"""Document text extraction utilities (PDF, DOCX, TXT, etc.).""" import os from PyPDF2 import PdfReader from docx import Document def extract_text_from_pdf(file_path: str) -> str: """Extract text from a PDF file.""" reader = PdfReader(file_path) text_parts = [] for page in reader.pages: text = page.extract_text() if text: text_parts.append(text) return "\n\n".join(text_parts) def extract_text_from_docx(file_path: str) -> str: """Extract text from a DOCX file.""" doc = Document(file_path) text_parts = [] for para in doc.paragraphs: if para.text.strip(): text_parts.append(para.text) # Also extract tables for table in doc.tables: for row in table.rows: row_text = " | ".join(cell.text.strip() for cell in row.cells) if row_text.strip(): text_parts.append(row_text) return "\n".join(text_parts) def extract_text_from_txt(file_path: str) -> str: """Read a plain text file.""" with open(file_path, "r", encoding="utf-8", errors="replace") as f: return f.read() def extract_text(file_path: str) -> str: """Extract text from a file based on its extension.""" ext = os.path.splitext(file_path)[1].lower() if ext == ".pdf": return extract_text_from_pdf(file_path) elif ext == ".docx": return extract_text_from_docx(file_path) elif ext in (".txt", ".md", ".rtf"): return extract_text_from_txt(file_path) elif ext == ".doc": # Old .doc format — try reading as text (best effort) try: return extract_text_from_txt(file_path) except Exception: return f"[Could not extract text from .doc file: {file_path}]" else: # Try reading as text try: return extract_text_from_txt(file_path) except Exception: return f"[Unsupported file format: {ext}]"