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)