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("""
NB : Attention, plus le document est volumineux, plus la traduction peut prendre du temps.

Aussi, assurez-vous d'avoir une connexion stable pour éviter les erreurs lors de la traduction.

""", 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( """ """, unsafe_allow_html=True, ) # Pied de page st.markdown("""
""", unsafe_allow_html=True)