RAGBasedApp / pdf_loader.py
aneesqumar's picture
Update pdf_loader.py
93df98b verified
Raw
History Blame Contribute Delete
1.83 kB
import requests
from pypdf import PdfReader
from io import BytesIO
import re
def _get_drive_file_id(url: str) -> str | None:
patterns = [
r"/d/([a-zA-Z0-9_-]+)",
r"id=([a-zA-Z0-9_-]+)"
]
for p in patterns:
m = re.search(p, url)
if m:
return m.group(1)
return None
def _download_from_drive(file_id: str) -> bytes:
URL = "https://drive.google.com/uc?export=download"
session = requests.Session()
response = session.get(URL, params={"id": file_id}, stream=True)
token = None
# Google sometimes asks for confirmation
for k, v in response.cookies.items():
if k.startswith("download_warning"):
token = v
if token:
response = session.get(
URL,
params={"id": file_id, "confirm": token},
stream=True
)
return response.content
def load_pdf_from_url(url: str) -> str:
url = url.strip()
if "drive.google.com" in url:
file_id = _get_drive_file_id(url)
if not file_id:
raise ValueError("❌ Invalid Google Drive link")
file_bytes = _download_from_drive(file_id)
else:
response = requests.get(url, timeout=30)
response.raise_for_status()
file_bytes = response.content
# πŸ” Validate PDF signature
if not file_bytes.startswith(b"%PDF"):
raise ValueError(
"❌ Downloaded file is not a valid PDF. "
"Check permissions or file type."
)
reader = PdfReader(BytesIO(file_bytes))
text = ""
for page in reader.pages:
page_text = page.extract_text()
if page_text:
text += page_text + "\n"
if not text.strip():
raise ValueError("⚠️ PDF loaded but contains no extractable text.")
return text