| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- import PyPDF2
- import requests
- import json
- from reportlab.lib.pagesizes import letter
- 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
- OLLAMA_MODEL = "traductionUkrainienVersFrancais:latest"
- 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 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 = 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):
- """Envoie une requête à Ollama et retourne la réponse."""
- payload = {
- "model": model,
- "prompt": prompt,
- "stream": False,
- "options": {"num_ctx": context_size}
- }
- response = requests.post(OLLAMA_URL, data=json.dumps(payload))
- if response.status_code == 200:
- return response.json()["response"]
- 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)
- story = []
-
- # Enregistre une police qui supporte le cyrilique
- font_name = register_unicode_font()
-
- # Style personnalisé
- styles = getSampleStyleSheet()
- title_style = ParagraphStyle(
- 'CustomTitle',
- parent=styles['Heading1'],
- fontSize=16,
- textColor='#1f4788',
- spaceAfter=0.3*inch,
- alignment=TA_JUSTIFY,
- fontName=font_name
- )
-
- page_style = ParagraphStyle(
- 'PageHeading',
- parent=styles['Heading2'],
- fontSize=12,
- textColor='#1f4788',
- spaceAfter=0.2*inch,
- spaceBefore=0.2*inch,
- fontName=font_name
- )
-
- body_style = ParagraphStyle(
- 'CustomBody',
- parent=styles['BodyText'],
- fontSize=11,
- alignment=TA_JUSTIFY,
- spaceAfter=0.2*inch,
- fontName=font_name
- )
-
- # Titre
- story.append(Paragraph("Traduction - Ukrainien vers Français", title_style))
- story.append(Spacer(1, 0.2*inch))
-
- # Contenu
- for page_num, translation in results.items():
- # 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
- doc.build(story)
- print(f"PDF généré avec succès : {output_path}")
-
- def main():
- # Extraction du texte
- pages = extract_text_from_pdf(PDF_PATH)
- print(f"Nombre de pages extraites : {len(pages)}")
-
- # Dictionnaire pour stocker les résultats
- results = {}
-
- # Traitement page par page
- for i, page_text in enumerate(pages, start=1):
- if( i > 2) : # 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
- create_pdf_from_results(results, OUTPUT_PDF_PATH)
-
- if __name__ == "__main__":
- main()
|