File size: 5,221 Bytes
a1445fb
f200cca
 
06d8ed2
9ee01a9
06d8ed2
4c30bf8
06d8ed2
 
f200cca
06d8ed2
 
 
f200cca
 
 
 
06d8ed2
 
f200cca
06d8ed2
f200cca
 
06d8ed2
f200cca
 
06d8ed2
 
 
dd6e891
06d8ed2
f200cca
 
06d8ed2
 
 
 
 
 
 
 
 
 
4c30bf8
 
 
 
 
 
 
 
 
06d8ed2
4c30bf8
06d8ed2
 
f200cca
06d8ed2
f200cca
 
 
 
06d8ed2
f200cca
06d8ed2
 
f200cca
 
9ee01a9
 
06d8ed2
4c30bf8
 
 
 
 
 
 
9ee01a9
06d8ed2
4c30bf8
 
 
 
 
 
 
 
 
f200cca
4c30bf8
 
f200cca
 
06d8ed2
f200cca
 
0b9a8bb
06d8ed2
f200cca
06d8ed2
f200cca
 
06d8ed2
 
 
 
 
 
 
 
 
 
 
f200cca
06d8ed2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4c30bf8
 
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
143
144
145
146
147
148
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

# Authenticate using the application default credentials
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, question):
    """Génère une réponse en format LaTeX depuis le modèle Gemini."""
    try:
        images = Image.open(image)
        response = client.models.generate_content(
            model="gemini-2.0-flash-thinking-exp",
            contents=[images, question],
        )
        # Extrait les pensées et la réponse
        thoughts = response.candidates[0].content.parts[0].text
        answer = response.candidates[0].content.parts[1].text

        # Préparation du template LaTeX
        latex_template = r"""\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\begin{document}
%s
\end{document}
""" % answer
        
        return latex_template

    except Exception as e:
        return f"Une erreur s'est produite: {e}"

def latex_to_pdf(latex_content):
    """Convertit le contenu LaTeX en PDF."""
    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:
            # Execute pdflatex
            process = subprocess.run(
                ["pdflatex", "-interaction=nonstopmode", tex_file],
                cwd=temp_dir,
                capture_output=True,
                text=True,
                check=True
            )
            
            # Vérifie si le PDF existe
            pdf_path = os.path.join(temp_dir, "output.pdf")
            if os.path.exists(pdf_path):
                with open(pdf_path, "rb") as f:
                    return f.read()
            else:
                st.error("Le fichier PDF n'a pas été généré")
                st.code(process.stdout)
                return None
                
        except subprocess.CalledProcessError as e:
            st.error(f"Erreur lors de la compilation LaTeX: {str(e)}")
            st.code(e.stdout)
            return None

# Application Streamlit
def main():
    st.title("Application Gemini 2.0 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:")

        if st.button("Générer la réponse"):
            if question:
                with st.spinner("Génération de la réponse en cours..."):
                    # Génère la réponse LaTeX
                    latex_response = generate_latex_response(temp_image_path, question)

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

                    if latex_response:
                        # Convertit en PDF
                        with st.spinner("Conversion en PDF..."):
                            pdf_data = latex_to_pdf(latex_response)
                            
                            if pdf_data:
                                st.success("PDF généré avec succès!")
                                # Crée un bouton de téléchargement
                                st.download_button(
                                    label="Télécharger le PDF",
                                    data=pdf_data,
                                    file_name="reponse_gemini.pdf",
                                    mime="application/pdf"
                                )
            else:
                st.warning("Veuillez entrer une question.")
        
        # Nettoie le fichier temporaire
        os.unlink(temp_image_path)

if __name__ == "__main__":
    main()