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