|
import streamlit as st |
|
from google import genai |
|
from PIL import Image |
|
import os |
|
import tempfile |
|
import subprocess |
|
|
|
|
|
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: |
|
|
|
with open(image_path, 'rb') as img_file: |
|
image_data = img_file.read() |
|
|
|
|
|
latex_template = r"""\documentclass{article} |
|
\usepackage[utf8]{inputenc} |
|
\usepackage[T1]{fontenc} |
|
\usepackage{amsmath} |
|
\usepackage{amsfonts} |
|
\usepackage{amssymb} |
|
\begin{document} |
|
%s |
|
\end{document} |
|
""" |
|
|
|
|
|
response = client.models.generate_content( |
|
model="gemini-2.0-flash-thinking-exp", |
|
contents=[{"mime_type": "image/jpeg", "data": image_data}, question] |
|
) |
|
|
|
|
|
answer = response.text |
|
|
|
|
|
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: |
|
|
|
tex_file = os.path.join(temp_dir, "output.tex") |
|
with open(tex_file, "w", encoding="utf-8") as f: |
|
f.write(latex_content) |
|
|
|
try: |
|
|
|
process = subprocess.run( |
|
["pdflatex", "-interaction=nonstopmode", tex_file], |
|
cwd=temp_dir, |
|
capture_output=True, |
|
text=True, |
|
check=True |
|
) |
|
|
|
|
|
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: |
|
|
|
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..."): |
|
|
|
latex_content = generate_latex_response(temp_path, question) |
|
|
|
if latex_content: |
|
st.markdown("### Réponse LaTeX générée:") |
|
st.text(latex_content) |
|
|
|
|
|
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" |
|
) |
|
|
|
|
|
os.unlink(temp_path) |
|
|
|
if __name__ == "__main__": |
|
main() |