| text_by_page.append(text) | text_by_page.append(text) | ||||
| return text_by_page | return text_by_page | ||||
| def merge_paragraphs_across_pages(pages_text): | |||||
| """Divise le texte en chunks raisonnables pour la traduction.""" | |||||
| import re | |||||
| # Concatène tout le texte | |||||
| full_text = "\n".join(pages_text) | |||||
| # Essaie d'abord de diviser par les doubles sauts de ligne | |||||
| paragraphs = re.split(r'\n\s*\n+', full_text.strip()) | |||||
| # Si on obtient seulement un paragraphe, on divise par une taille maximale | |||||
| if len(paragraphs) == 1: | |||||
| print("Aucune séparation par double saut de ligne détectée. Division par taille...") | |||||
| # Divise par les phrases (points suivis d'un espace) | |||||
| sentences = re.split(r'(?<=[.!?])\s+', full_text.strip()) | |||||
| # Regroupe les phrases en chunks d'environ 1500 caractères | |||||
| max_chunk_size = 1500 | |||||
| paragraphs = [] | |||||
| current_chunk = "" | |||||
| for sentence in sentences: | |||||
| if len(current_chunk) + len(sentence) < max_chunk_size: | |||||
| current_chunk += (" " + sentence) if current_chunk else sentence | |||||
| else: | |||||
| if current_chunk: | |||||
| paragraphs.append(current_chunk) | |||||
| current_chunk = sentence | |||||
| if current_chunk: | |||||
| paragraphs.append(current_chunk) | |||||
| else: | |||||
| # Normalise les sauts de ligne internes | |||||
| paragraphs = [re.sub(r'\n+', ' ', p.strip()) for p in paragraphs if p.strip()] | |||||
| return paragraphs | |||||
| def send_to_ollama(prompt, model=OLLAMA_MODEL, context_size=128000): | def send_to_ollama(prompt, model=OLLAMA_MODEL, context_size=128000): | ||||
| """Envoie une requête à Ollama et retourne la réponse.""" | """Envoie une requête à Ollama et retourne la réponse.""" | ||||
| payload = { | payload = { | ||||
| print(f"PDF généré avec succès : {output_path}") | print(f"PDF généré avec succès : {output_path}") | ||||
| def main(): | def main(): | ||||
| # Extraction du texte | |||||
| # Extraction du texte page par page | |||||
| pages = extract_text_from_pdf(PDF_PATH) | pages = extract_text_from_pdf(PDF_PATH) | ||||
| print(f"Nombre de pages extraites : {len(pages)}") | print(f"Nombre de pages extraites : {len(pages)}") | ||||
| # Fusion des paragraphes qui s'étendent sur plusieurs pages | |||||
| paragraphs = merge_paragraphs_across_pages(pages) | |||||
| print(f"Nombre de paragraphes complets extraits : {len(paragraphs)}") | |||||
| # Dictionnaire pour stocker les résultats | # Dictionnaire pour stocker les résultats | ||||
| results = {} | 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}" | |||||
| # Traitement des paragraphes complets | |||||
| for i, paragraph_text in enumerate(paragraphs, start=1): | |||||
| print(f"{15 * '-'} Traduction du paragraphe {i}/{len(paragraphs)}...\n{paragraph_text}\n") | |||||
| prompt = f"Traduis le texte suivant de l'ukrainien vers le français : {paragraph_text}" | |||||
| try: | try: | ||||
| result = send_to_ollama(prompt) | result = send_to_ollama(prompt) | ||||
| print(f"{result}.") | 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}" | |||||
| print(f"Erreur lors du traitement du paragraphe {i} : {e}") | |||||
| results[i] = f"Erreur lors du traitement du paragraphe {i} : {e}" | |||||
| # Création du PDF avec tous les résultats | # Création du PDF avec tous les résultats | ||||
| create_pdf_from_results(results, OUTPUT_PDF_PATH) | create_pdf_from_results(results, OUTPUT_PDF_PATH) |