Script python permettant de traduire un long texte
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import PyPDF2
  2. import requests
  3. import json
  4. from reportlab.lib.pagesizes import letter
  5. from reportlab.lib.units import inch
  6. from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
  7. from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
  8. from reportlab.lib.enums import TA_JUSTIFY
  9. # Configuration
  10. PDF_PATH = "TaniaBorecMemoir(Ukr).pdf" # Fichier original
  11. OLLAMA_MODEL = "traductionUkrainienVersFrancais:latest"
  12. OLLAMA_URL = "http://localhost:11434/api/generate" # URL par défaut d'Ollama
  13. OUTPUT_PDF_PATH = PDF_PATH.replace(".pdf", " (FR).pdf") # Chemin du PDF de sortie
  14. def extract_text_from_pdf(pdf_path):
  15. """Extrait le texte page par page d'un PDF."""
  16. text_by_page = []
  17. with open(pdf_path, "rb") as file:
  18. reader = PyPDF2.PdfReader(file)
  19. for page in reader.pages:
  20. text_by_page.append(page.extract_text())
  21. return text_by_page
  22. def send_to_ollama(prompt, model=OLLAMA_MODEL, context_size=128000):
  23. """Envoie une requête à Ollama et retourne la réponse."""
  24. payload = {
  25. "model": model,
  26. "prompt": prompt,
  27. "stream": False,
  28. "options": {"num_ctx": context_size}
  29. }
  30. response = requests.post(OLLAMA_URL, data=json.dumps(payload))
  31. if response.status_code == 200:
  32. return response.json()["response"]
  33. else:
  34. raise Exception(f"Erreur Ollama: {response.text}")
  35. def create_pdf_from_results(results, output_path):
  36. """Crée un PDF à partir des résultats de traduction."""
  37. doc = SimpleDocTemplate(output_path, pagesize=letter, topMargin=inch, bottomMargin=inch)
  38. story = []
  39. # Style personnalisé
  40. styles = getSampleStyleSheet()
  41. title_style = ParagraphStyle(
  42. 'CustomTitle',
  43. parent=styles['Heading1'],
  44. fontSize=16,
  45. textColor='#1f4788',
  46. spaceAfter=0.3*inch,
  47. alignment=TA_JUSTIFY
  48. )
  49. page_style = ParagraphStyle(
  50. 'PageHeading',
  51. parent=styles['Heading2'],
  52. fontSize=12,
  53. textColor='#1f4788',
  54. spaceAfter=0.2*inch,
  55. spaceBefore=0.2*inch
  56. )
  57. body_style = ParagraphStyle(
  58. 'CustomBody',
  59. parent=styles['BodyText'],
  60. fontSize=11,
  61. alignment=TA_JUSTIFY,
  62. spaceAfter=0.2*inch
  63. )
  64. # Titre
  65. story.append(Paragraph("Traduction - Ukrainien vers Français", title_style))
  66. story.append(Spacer(1, 0.2*inch))
  67. # Contenu
  68. for page_num, translation in results.items():
  69. story.append(Paragraph(f"Page {page_num}", page_style))
  70. story.append(Paragraph(translation, body_style))
  71. story.append(Spacer(1, 0.1*inch))
  72. # Construction du PDF
  73. doc.build(story)
  74. print(f"PDF généré avec succès : {output_path}")
  75. def main():
  76. # Extraction du texte
  77. pages = extract_text_from_pdf(PDF_PATH)
  78. print(f"Nombre de pages extraites : {len(pages)}")
  79. # Dictionnaire pour stocker les résultats
  80. results = {}
  81. # Traitement page par page
  82. for i, page_text in enumerate(pages, start=1):
  83. print(f"Traitement de la page {i}/{len(pages)}...")
  84. prompt = f"Traduis le texte suivant de l'ukrainien vers le français : {page_text}"
  85. try:
  86. result = send_to_ollama(prompt)
  87. results[i] = result
  88. except Exception as e:
  89. results[i] = f"Erreur lors du traitement de la page {i} : {e}"
  90. # Création du PDF avec tous les résultats
  91. create_pdf_from_results(results, OUTPUT_PDF_PATH)
  92. if __name__ == "__main__":
  93. main()