Spaces:
Sleeping
Sleeping
File size: 5,384 Bytes
ea84e95 f9d5ace ea84e95 3fa52b5 ea84e95 7b323ee 3895a11 ddb5c72 3895a11 268d264 ea84e95 f9d5ace ea84e95 f9d5ace ea84e95 f9d5ace ea84e95 f9d5ace 7b323ee f9d5ace ea84e95 f9d5ace ea84e95 f9d5ace 47dc2d9 ea84e95 f9d5ace ea84e95 f9d5ace ea84e95 f9d5ace 3fa52b5 ea84e95 f9d5ace 47dc2d9 f9d5ace 47dc2d9 f9d5ace 3fa52b5 ea84e95 f6d2125 05c8f81 f6d2125 |
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 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 |
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)
|