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() |