Spaces:
Sleeping
Sleeping
| 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 |