Spaces:
Paused
Paused
| # -*- coding: utf-8 -*- | |
| """ | |
| Analyse de documents televerses (PDF, DOCX, TXT, CSV) - Space edition. | |
| Le texte est traite en memoire pour la session, croise avec le contenu du | |
| site, puis oublie (aucune conservation). | |
| """ | |
| import io | |
| import gdpr | |
| def extract_text(file_name, file_bytes): | |
| name = file_name.lower() | |
| if name.endswith(".pdf"): | |
| from pypdf import PdfReader | |
| reader = PdfReader(io.BytesIO(file_bytes)) | |
| parts = [] | |
| for page in reader.pages: | |
| try: | |
| parts.append(page.extract_text() or "") | |
| except Exception: | |
| continue | |
| return "\n".join(parts).strip() | |
| if name.endswith(".docx"): | |
| import docx | |
| doc = docx.Document(io.BytesIO(file_bytes)) | |
| return "\n".join(p.text for p in doc.paragraphs).strip() | |
| if name.endswith((".txt", ".md", ".csv")): | |
| return file_bytes.decode("utf-8", errors="ignore") | |
| raise ValueError(f"Format non pris en charge : {file_name}") | |
| def analyze_document(file_name, file_bytes, question, lang="fr"): | |
| import rag_engine | |
| raw = extract_text(file_name, file_bytes) | |
| if not raw: | |
| msg = ("Impossible d'extraire du texte de ce document." | |
| if lang != "en" else | |
| "Could not extract text from this document.") | |
| return msg, [], "" | |
| clean = gdpr.safe_for_processing(raw) | |
| if not question: | |
| question = ("Resume ce document et indique ses liens avec les " | |
| "informations du site Vizyon Ayiti 360." | |
| if lang != "en" else | |
| "Summarize this document and relate it to the Vizyon " | |
| "Ayiti 360 website information.") | |
| response, sources = rag_engine.answer(question, lang=lang, | |
| extra_context=clean) | |
| preview = clean[:600] + ("..." if len(clean) > 600 else "") | |
| return response, sources, preview | |