Files
cv-app/doc_parser.py

61 lines
1.9 KiB
Python

"""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}]"