|
|
|
|
|
|
|
|
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer |
|
|
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer |
|
|
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle |
|
|
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle |
|
|
from reportlab.lib.enums import TA_JUSTIFY |
|
|
from reportlab.lib.enums import TA_JUSTIFY |
|
|
|
|
|
from reportlab.pdfbase import pdfmetrics |
|
|
|
|
|
from reportlab.pdfbase.ttfonts import TTFont |
|
|
|
|
|
import os |
|
|
|
|
|
|
|
|
# Configuration |
|
|
# Configuration |
|
|
PDF_PATH = "TaniaBorecMemoir(Ukr).pdf" # Fichier original |
|
|
PDF_PATH = "TaniaBorecMemoir(Ukr).pdf" # Fichier original |
|
|
|
|
|
|
|
|
OUTPUT_PDF_PATH = PDF_PATH.replace(".pdf", " (FR).pdf") # Chemin du PDF de sortie |
|
|
OUTPUT_PDF_PATH = PDF_PATH.replace(".pdf", " (FR).pdf") # Chemin du PDF de sortie |
|
|
|
|
|
|
|
|
def extract_text_from_pdf(pdf_path): |
|
|
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 = [] |
|
|
text_by_page = [] |
|
|
with open(pdf_path, "rb") as file: |
|
|
with open(pdf_path, "rb") as file: |
|
|
reader = PyPDF2.PdfReader(file) |
|
|
reader = PyPDF2.PdfReader(file) |
|
|
for page in reader.pages: |
|
|
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 |
|
|
return text_by_page |
|
|
|
|
|
|
|
|
def send_to_ollama(prompt, model=OLLAMA_MODEL, context_size=128000): |
|
|
def send_to_ollama(prompt, model=OLLAMA_MODEL, context_size=128000): |
|
|
|
|
|
|
|
|
else: |
|
|
else: |
|
|
raise Exception(f"Erreur Ollama: {response.text}") |
|
|
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): |
|
|
def create_pdf_from_results(results, output_path): |
|
|
"""Crée un PDF à partir des résultats de traduction.""" |
|
|
"""Crée un PDF à partir des résultats de traduction.""" |
|
|
doc = SimpleDocTemplate(output_path, pagesize=letter, topMargin=inch, bottomMargin=inch) |
|
|
doc = SimpleDocTemplate(output_path, pagesize=letter, topMargin=inch, bottomMargin=inch) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Contenu |
|
|
# Contenu |
|
|
for page_num, translation in results.items(): |
|
|
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)) |
|
|
story.append(Spacer(1, 0.1*inch)) |
|
|
|
|
|
|
|
|
# Construction du PDF |
|
|
# Construction du PDF |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Traitement page par page |
|
|
# Traitement page par page |
|
|
for i, page_text in enumerate(pages, start=1): |
|
|
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}" |
|
|
prompt = f"Traduis le texte suivant de l'ukrainien vers le français : {page_text}" |
|
|
try: |
|
|
try: |
|
|
result = send_to_ollama(prompt) |
|
|
result = send_to_ollama(prompt) |
|
|
|
|
|
print(f"{result}.") |
|
|
results[i] = result |
|
|
results[i] = result |
|
|
except Exception as e: |
|
|
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}" |
|
|
results[i] = f"Erreur lors du traitement de la page {i} : {e}" |
|
|
|
|
|
|
|
|
# Création du PDF avec tous les résultats |
|
|
# Création du PDF avec tous les résultats |