diff --git a/README.md b/README.md index 9470df7..2e85317 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ SYSTEM """ Tu es un traducteur professionnel spécialisé dans la traduction de texte ukrainien vers le français. Traduis fidèlement et naturellement en respectant l'intonation originale utilisée par l'auteur du texte. Tu ne dois pas interpréter les pensées ou les réflexions de l'auteur. +ne rajoutes pas de texte avant ou après le texte fourni. Tu dois toujours répondre en français. """ ``` diff --git a/main.py b/main.py index 17614b5..4248307 100644 --- a/main.py +++ b/main.py @@ -6,6 +6,9 @@ from reportlab.lib.units import inch from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.enums import TA_JUSTIFY +from reportlab.pdfbase import pdfmetrics +from reportlab.pdfbase.ttfonts import TTFont +import os # Configuration PDF_PATH = "TaniaBorecMemoir(Ukr).pdf" # Fichier original @@ -14,12 +17,17 @@ OLLAMA_URL = "http://localhost:11434/api/generate" # URL par défaut d'Ollama OUTPUT_PDF_PATH = PDF_PATH.replace(".pdf", " (FR).pdf") # Chemin du PDF de sortie def extract_text_from_pdf(pdf_path): - """Extrait le texte page par page d'un PDF.""" + """Extrait le texte page par page d'un PDF sans les numéros de pages.""" + import re text_by_page = [] with open(pdf_path, "rb") as file: reader = PyPDF2.PdfReader(file) for page in reader.pages: - text_by_page.append(page.extract_text()) + text = page.extract_text() + # Supprime les numéros de pages (nombres seuls en début/fin de ligne) + text = re.sub(r'^\d+\s*\n', '', text, flags=re.MULTILINE) + text = re.sub(r'\n\s*\d+\s*$', '', text, flags=re.MULTILINE) + text_by_page.append(text) return text_by_page def send_to_ollama(prompt, model=OLLAMA_MODEL, context_size=128000): @@ -36,6 +44,27 @@ def send_to_ollama(prompt, model=OLLAMA_MODEL, context_size=128000): else: raise Exception(f"Erreur Ollama: {response.text}") +def register_unicode_font(): + """Enregistre une police TrueType qui supporte le cyrilique.""" + # Recherche une police système qui supporte le cyrilique + font_paths = [ + r"C:\Windows\Fonts\DejaVuSans.ttf", + r"C:\Windows\Fonts\Calibri.ttf", + r"C:\Windows\Fonts\arial.ttf", + ] + + for font_path in font_paths: + if os.path.exists(font_path): + try: + pdfmetrics.registerFont(TTFont('UnicodeFont', font_path)) + return 'UnicodeFont' + except Exception as e: + print(f"Erreur lors de l'enregistrement de {font_path}: {e}") + + # Si aucune police spéciale trouvée, utilise Helvetica par défaut + print("Aucune police Unicode trouvée, utilisation d'Helvetica") + return 'Helvetica' + def create_pdf_from_results(results, output_path): """Crée un PDF à partir des résultats de traduction.""" doc = SimpleDocTemplate(output_path, pagesize=letter, topMargin=inch, bottomMargin=inch) @@ -75,8 +104,9 @@ def create_pdf_from_results(results, output_path): # Contenu for page_num, translation in results.items(): - story.append(Paragraph(f"Page {page_num}", page_style)) - story.append(Paragraph(translation, body_style)) + # Préserver la mise en page en convertissant les sauts de ligne + formatted_text = translation.replace("\n", "
") + story.append(Paragraph(formatted_text, body_style)) story.append(Spacer(1, 0.1*inch)) # Construction du PDF @@ -93,12 +123,16 @@ def main(): # Traitement page par page for i, page_text in enumerate(pages, start=1): - print(f"Traitement de la page {i}/{len(pages)}...") + if( i > 3) : # Limite le nombre de pages pour les tests + break + print(f"{15 * '-'} Traduction de la page {i}/{len(pages)}...") prompt = f"Traduis le texte suivant de l'ukrainien vers le français : {page_text}" try: result = send_to_ollama(prompt) + print(f"{result}.") results[i] = result except Exception as e: + print(f"Erreur lors du traitement de la page {i} : {e}") results[i] = f"Erreur lors du traitement de la page {i} : {e}" # Création du PDF avec tous les résultats