File size: 1,926 Bytes
bda6294
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# -*- 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