File size: 4,614 Bytes
a1445fb
f200cca
 
9ee01a9
f200cca
4c30bf8
f200cca
4c30bf8
 
f200cca
 
 
 
 
 
 
4c30bf8
f200cca
 
dd6e891
4c30bf8
f200cca
 
4c30bf8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f200cca
 
4c30bf8
f200cca
4c30bf8
 
 
 
 
 
 
f200cca
4c30bf8
 
f200cca
 
 
 
4c30bf8
f200cca
 
 
9ee01a9
 
4c30bf8
 
 
 
 
 
 
 
9ee01a9
4c30bf8
 
 
 
 
 
 
 
 
 
f200cca
4c30bf8
 
f200cca
 
 
 
0b9a8bb
f200cca
4c30bf8
f200cca
 
4c30bf8
 
 
 
 
 
 
 
 
f200cca
4c30bf8
 
 
 
 
 
 
 
 
5faadee
f200cca
 
4c30bf8
f200cca
 
4c30bf8
f200cca
4c30bf8
 
 
f200cca
 
4c30bf8
 
 
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
import streamlit as st
from google import genai
from PIL import Image
import os
import tempfile
import subprocess

# Configuration de l'API Gemini
gen = os.environ['GOOGLE_API_KEY']
client = genai.Client(api_key=gen)

def ensure_latex_packages():
    """Vérifie si les packages LaTeX nécessaires sont installés."""
    try:
        subprocess.run(['pdflatex', '--version'], capture_output=True, check=True)
        return True
    except (subprocess.CalledProcessError, FileNotFoundError):
        st.error("pdflatex n'est pas installé. 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:
        # Charge l'image pour l'API
        with open(image_path, 'rb') as img_file:
            image_data = img_file.read()
            
        # Prépare le template LaTeX
        latex_template = r"""\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\begin{document}
%s
\end{document}
"""
        
        # Génère la réponse avec Gemini
        response = client.models.generate_content(
            model="gemini-2.0-flash-thinking-exp",
            contents=[{"mime_type": "image/jpeg", "data": image_data}, question]
        )
        
        # Extrait la réponse
        answer = response.text
        
        # Formate la réponse en LaTeX complet
        return latex_template % answer
        
    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."""
    with tempfile.TemporaryDirectory() as temp_dir:
        # Crée le fichier tex
        tex_file = os.path.join(temp_dir, "output.tex")
        with open(tex_file, "w", encoding="utf-8") as f:
            f.write(latex_content)
        
        try:
            # Exécute pdflatex
            process = subprocess.run(
                ["pdflatex", "-interaction=nonstopmode", tex_file],
                cwd=temp_dir,
                capture_output=True,
                text=True,
                check=True
            )
            
            # Vérifie si le PDF a été généré
            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

def main():
    st.title("Application Gemini 2.0 avec Export PDF")
    
    if not ensure_latex_packages():
        return
    
    uploaded_file = st.file_uploader("Choisissez une image...", type=["png", "jpg", "jpeg"])
    
    if uploaded_file:
        # Sauvegarde temporaire de l'image
        with tempfile.NamedTemporaryFile(delete=False, suffix='.jpg') as temp_file:
            temp_file.write(uploaded_file.getvalue())
            temp_path = temp_file.name
            
        st.image(uploaded_file, caption="Image téléchargée")
        
        question = st.text_input("Entrez votre question:")
        
        if st.button("Générer la réponse") and question:
            with st.spinner("Génération de la réponse..."):
                # Génère la réponse LaTeX
                latex_content = generate_latex_response(temp_path, question)
                
                if latex_content:
                    st.markdown("### Réponse LaTeX générée:")
                    st.text(latex_content)
                    
                    # Convertit en PDF
                    with st.spinner("Conversion en PDF..."):
                        pdf_data = latex_to_pdf(latex_content)
                        
                        if pdf_data:
                            st.success("PDF généré avec succès!")
                            st.download_button(
                                "Télécharger le PDF",
                                pdf_data,
                                file_name="reponse.pdf",
                                mime="application/pdf"
                            )
        
        # Nettoie le fichier temporaire
        os.unlink(temp_path)

if __name__ == "__main__":
    main()