Browse Source

Traduction pages par pages

main
Alex 2 weeks ago
parent
commit
10eedffe7d
2 changed files with 40 additions and 5 deletions
  1. 1
    0
      README.md
  2. 39
    5
      main.py

+ 1
- 0
README.md View File

@@ -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.
"""
```

+ 39
- 5
main.py View File

@@ -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", "<br/>")
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

Loading…
Cancel
Save