| """ |
| MediGenius — tools/pdf_loader.py |
| PDF document loading and text splitting utilities. |
| """ |
|
|
| from typing import List |
|
|
| from langchain_core.documents import Document |
|
|
| from app.core.logging_config import logger |
|
|
|
|
| def load_pdf(pdf_path: str) -> List[Document]: |
| """Load all pages from a PDF file using PyPDFLoader.""" |
| from langchain_community.document_loaders import PyPDFLoader |
|
|
| loader = PyPDFLoader(pdf_path) |
| docs = loader.load() |
| logger.info("Loaded %d pages from PDF: %s", len(docs), pdf_path) |
| return docs |
|
|
|
|
| def split_documents(docs: List[Document]) -> List[Document]: |
| """Split documents into overlapping chunks using tiktoken-aware splitter.""" |
| from langchain_text_splitters import RecursiveCharacterTextSplitter |
|
|
| splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder( |
| chunk_size=512, |
| chunk_overlap=128, |
| separators=["\n\n", ". ", "\n", " "], |
| ) |
| splits = splitter.split_documents(docs) |
| logger.info("Split into %d chunks", len(splits)) |
| return splits |
|
|
|
|
| def process_pdf(pdf_path: str) -> List[Document]: |
| """Load a PDF and split it into chunks. Convenience wrapper.""" |
| return split_documents(load_pdf(pdf_path)) |
|
|