File size: 5,461 Bytes
6bbda80
 
a1445fb
f200cca
 
06d8ed2
9ee01a9
06d8ed2
4c30bf8
06d8ed2
 
f200cca
5dfdbb0
6bbda80
06d8ed2
 
f200cca
 
 
 
06d8ed2
 
f200cca
06d8ed2
f200cca
 
06d8ed2
f200cca
 
06d8ed2
 
 
dd6e891
6bbda80
f200cca
 
39bd6c1
dec9b7b
c8299f7
06d8ed2
 
39bd6c1
06d8ed2
4c30bf8
6bbda80
042bd35
6bbda80
 
 
 
 
 
 
 
 
f200cca
6bbda80
 
f200cca
 
6bbda80
f200cca
06d8ed2
f200cca
06d8ed2
 
f200cca
 
9ee01a9
 
6bbda80
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9ee01a9
f200cca
6bbda80
 
f200cca
 
06d8ed2
f200cca
d60c22c
0b9a8bb
06d8ed2
f200cca
06d8ed2
f200cca
 
06d8ed2
 
 
 
 
 
 
 
 
 
7f4ea7d
 
06d8ed2
 
 
 
6bbda80
 
06d8ed2
 
 
6bbda80
06d8ed2
39bd6c1
06d8ed2
6bbda80
 
 
 
 
 
 
 
 
dec9b7b
6bbda80
 
06d8ed2
 
f200cca
 
 
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142


import streamlit as st
from google import genai
from PIL import Image
import io
import os
import google.auth
import subprocess
import tempfile
import shutil

# Authenrticate using the application default credentials
#credentials, project = google.auth.default()
gen = api_key=os.environ['GOOGLE_API_KEY']
# Initialize the Gemini client
client = genai.Client(api_key=gen)

def ensure_latex_packages():
    """Vérifie si les packages LaTeX nécessaires sont installés."""
    required_packages = ['amsmath', 'amssymb']
    
    try:
        # Vérifie si pdflatex est installé
        subprocess.run(['pdflatex', '--version'], capture_output=True, check=True)
        return True
    except subprocess.CalledProcessError:
        st.error("pdflatex n'est pas installé. Veuillez installer TeX Live ou MiKTeX.")
        return False
    except FileNotFoundError:
        st.error("pdflatex n'est pas trouvé. Veuillez installer TeX Live ou MiKTeX.")
        return False

def generate_latex_response(image_path, question):
    """Génère une réponse en format LaTeX depuis le modèle Gemini."""
    try:
        print(question)
        prompt = "Resous cette exercice. ça doit être bien présentable. c'est un devoir de lycée terminal S. Write you answer with rendering Latex . Donne uniquement du code Latex et rien d'autre. Commence ta réponse par \document"
        image_data = Image.open(image_path)
        response = client.models.generate_content(
            model="gemini-2.0-flash-thinking-exp",
            contents=[image_data, prompt]
        )
        
        # Extrait la réponse et retire les délimiteurs LaTeX
        answer = response.candidates[0].content.parts[1].text
        
        # Retire les délimiteurs ```latex au début et ``` à la fin
        if answer.startswith("```latex"):
            answer = answer[8:]  # Retire ```latex
        if answer.endswith("```"):
            answer = answer[:-3]  # Retire ```
            
        return answer.strip()  # Retire les espaces supplémentaires
        
    except Exception as e:
        st.error(f"Erreur lors de la génération de la réponse: {str(e)}")
        return None
def latex_to_pdf(latex_content):
    """Convertit le contenu LaTeX en PDF."""
    # Crée un dossier temporaire pour les fichiers LaTeX
    with tempfile.TemporaryDirectory() as temp_dir:
        # Chemin du fichier tex
        tex_file = os.path.join(temp_dir, "output.tex")
        
        # Écrit le contenu LaTeX dans le fichier
        with open(tex_file, "w", encoding="utf-8") as f:
            f.write(latex_content)
        
        try:
            # Exécute pdflatex deux fois pour assurer la bonne génération des références
            for _ in range(2):
                subprocess.run(
                    ["pdflatex", "-interaction=nonstopmode", "output.tex"],
                    cwd=temp_dir,
                    capture_output=True,
                    check=True
                )
            
            # Lit le fichier PDF généré
            pdf_file = os.path.join(temp_dir, "output.pdf")
            with open(pdf_file, "rb") as f:
                pdf_data = f.read()
            
            return pdf_data
            
        except subprocess.CalledProcessError as e:
            st.error(f"Erreur lors de la génération du PDF: {e}")
            st.code(e.output.decode())
            return None

# Application Streamlit
def main():
    st.title("Math/physique/chimie pdf test avec Export PDF")
    
    # Vérifie si LaTeX est installé
    if not ensure_latex_packages():
        st.stop()
    
    uploaded_file = st.file_uploader("Choisissez une image...", type=["png", "jpg", "jpeg"])

    if uploaded_file is not None:
        with tempfile.NamedTemporaryFile(delete=False, suffix='.png') as tmp_file:
            tmp_file.write(uploaded_file.getvalue())
            temp_image_path = tmp_file.name
        # Affiche l'image téléchargée
        image = Image.open(temp_image_path)
        st.image(image, caption="Image téléchargée", use_container_width=True)

        # Obtient la question de l'utilisateur
        #question = st.text_input("Entrez votre question:")
        question= None

        if st.button("Générer la réponse"):
            if question:
                with st.spinner("Génération de la réponse en cours..."):
                    # Convertit l'image PIL en bytes pour l'API Gemini
                    
                    # Génère la réponse LaTeX
                    latex_response = generate_latex_response(temp_image_path, question)

                    # Affiche la réponse LaTeX
                    st.markdown("### Code LaTeX généré:")
                    st.text("Réponse !!")

                    # Convertit en PDF
                    with st.spinner("Conversion en PDF..."):
                        pdf_data = latex_to_pdf(latex_response)
                        
                        if pdf_data:
                            # Crée un bouton de téléchargement
                            st.download_button(
                                label="Télécharger le PDF",
                                data=pdf_data,
                                file_name="reponse_mariam.pdf",
                                mime="application/pdf"
                            )
            else:
                st.warning("Veuillez entrer une question.")

if __name__ == "__main__":
    main()