Adjoumani's picture
Update app.py
ddb5c72 verified
import streamlit as st
import fitz # pymupdf pour la manipulation PDF
from deep_translator import GoogleTranslator
import time
import re
# Configuration de base pour l'interface Streamlit
st.set_page_config(
page_title="Traduction de Livre Électronique",
page_icon="\U0001F4D6",
layout="centered",
initial_sidebar_state="expanded",
)
# Titre et description de l'application
st.title("\U0001F4DA Application de Traduction de Livre Électronique")
st.markdown(
"""
Traduisez vos livres électroniques facilement ! Sélectionnez la langue du livre source,
la langue de destination, et téléchargez votre livre traduit en quelques clics.
"""
)
st.markdown("""
<style>
.custom-box {
background-color: #fff3cd; /* jaune clair par défaut */
color: #856404; /* texte brun foncé */
border-left: 6px solid #ffeeba;
padding: 15px;
border-radius: 5px;
margin: 10px 0;
}
</style>
<div class="custom-box">
<strong>NB :</strong> Attention, plus le document est volumineux, plus la traduction peut prendre du temps.
<p>Aussi, assurez-vous d'avoir une connexion stable pour éviter les erreurs lors de la traduction.</p>
</div>
""", unsafe_allow_html=True)
# Chargement du fichier PDF
doc_file = st.file_uploader("Téléchargez un fichier PDF", type="pdf")
# Sélection des langues
source_language = st.selectbox(
"Langue du livre à traduire",
options=["en", "fr", "es", "de", "it"],
index=0,
format_func=lambda lang: {
"en": "Anglais",
"fr": "Français",
"es": "Espagnol",
"de": "Allemand",
"it": "Italien",
}[lang],
)
target_language = st.selectbox(
"Langue de traduction",
options=["fr", "en", "es", "de", "it"],
index=1,
format_func=lambda lang: {
"fr": "Français",
"en": "Anglais",
"es": "Espagnol",
"de": "Allemand",
"it": "Italien",
}[lang],
)
# Bouton pour lancer la traduction
if doc_file and st.button("Lancer la traduction"):
try:
# Ouverture du document PDF
doc = fitz.open(stream=doc_file.read(), filetype="pdf")
# Initialisation de la traduction
translator = GoogleTranslator(source=source_language, target=target_language)
blanc = fitz.pdfcolor["white"]
textflags = fitz.TEXT_DEHYPHENATE
# Création d'un groupe de calques pour le texte traduit
ocg_xref = doc.add_ocg(f"translated-{target_language}", on=True)
# Barre de progression
total_pages = len(doc)
progress_bar = st.progress(0)
start_time = time.time()
for page_num, page in enumerate(doc):
blocks = page.get_text("blocks", flags=textflags)
for block in blocks:
bbox = block[:4]
english_text = block[4]
# Traduction du texte
translated_text = translator.translate(english_text)
# Remplacement du texte
page.draw_rect(bbox, color=None, fill=blanc, oc=ocg_xref)
# Correction : s'assurer que french est une chaîne de caractères
if isinstance(translated_text, list):
translated_text = " ".join(translated_text) # Joint les éléments de la liste en une seule chaîne
elif translated_text is None: # Gère le cas où la traduction est None
translated_text = "" # Remplace par une chaîne vide
page.insert_htmlbox(
bbox,
translated_text,
oc=ocg_xref,
)
# Mise à jour de la barre de progression
progress_bar.progress((page_num + 1) / total_pages)
# Calcul du temps écoulé
elapsed_time = time.time() - start_time
# Sauvegarde du fichier traduit
output_pdf = f"translated_{doc_file.name}"
doc.save(output_pdf)
st.success(
f"Traduction terminée en {elapsed_time:.2f} secondes. Téléchargez votre livre ci-dessous !"
)
st.download_button(
label="Télécharger le livre traduit",
data=open(output_pdf, "rb").read(),
file_name=output_pdf,
mime="application/pdf",
)
except Exception as e:
st.error(f"Une erreur s'est produite : {str(e)}")
# Style personnalisé
st.markdown(
"""
<style>
.stApp {
background-color: #f0f8ff;
color: #333333;
font-family: 'Arial', sans-serif;
}
.stButton button {
background-color: #4CAF50;
color: white;
border: none;
padding: 10px 20px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
margin: 4px 2px;
cursor: pointer;
border-radius: 8px;
}
.stButton button:hover {
background-color: #45a049;
}
</style>
""",
unsafe_allow_html=True,
)
# Pied de page
st.markdown("""
<hr>
<footer style="text-align: center; font-size: 0.9em;">
© 2024 - La traduction électronique et intelligente | Propulsé par M. ADJOUMANI
</footer>
""", unsafe_allow_html=True)