Bentham commited on
Commit
79ff9c8
·
verified ·
1 Parent(s): e51aa49

Replacer les images dans convert_to_txt

Browse files
Files changed (1) hide show
  1. main.py +55 -26
main.py CHANGED
@@ -484,6 +484,43 @@ async def rewrite_html_accessible(html_content: str) -> str:
484
  except Exception as e:
485
  logging.error(f"Erreur lors de la réécriture du HTML : {str(e)}")
486
  return html_content
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
487
 
488
  async def clean_html_content(html_content: str, image_counter: List[int], images_data: Dict[str, Dict[str, str]]) -> str:
489
  soup = BeautifulSoup(html_content, 'html.parser')
@@ -811,13 +848,9 @@ async def convert_file_to_txt(
811
 
812
  text = ""
813
  # MODIFICATIONS START: Extraction du texte et des images
814
- images_data = []
815
  if ext == '.pdf':
816
- with fitz.open(input_filename) as doc:
817
- for page in doc:
818
- text += page.get_text()
819
- # Extraire les images du PDF
820
- images = extract_images_from_pdf(input_filename)
821
  elif ext == '.pptx':
822
  if 'Presentation' not in globals():
823
  raise HTTPException(status_code=500, detail="La librairie python-pptx n'est pas installée.")
@@ -849,28 +882,31 @@ async def convert_file_to_txt(
849
 
850
  # Analyse des images
851
  # On récupère les descriptions des images
852
- # Le prompt demandé : "Cette image est incluse dans un cours. Je voudrais que tu me donnes toutes les informations pertinentes..."
853
  if images:
854
- image_descriptions = []
855
  tasks = []
856
- for i, img_bytes in enumerate(images, start=1):
857
  base64_image = base64.b64encode(img_bytes).decode('utf-8')
858
- tasks.append((i, asyncio.create_task(
859
  get_image_description(
860
  base64_image,
861
  prompt="Cette image est incluse dans un cours. Je voudrais que tu me donnes toutes les informations pertinentes, pour qu'on puisse comprendre ce qu'elle contient sans la voir. Ne commente pas les couleurs, les formes et la disposition. Ne commente pas le fait que tu décris l'image : fais en sorte que l'image puisse être naturellement remplacée par ta description. Si l'image ne contient aucune information, ne renvoie rien du tout."
862
  )
863
- )))
864
 
865
- results = await asyncio.gather(*(t for _, t in tasks))
866
 
867
- for (i, _), description in zip(tasks, results):
868
- image_descriptions.append((i, description))
 
 
 
869
 
870
- # On ajoute les descriptions à la fin du texte
871
- text += "\n\n---\n"
872
- for num, desc in image_descriptions:
873
- text += f"\nImage {num} : {desc}\n"
 
874
  # MODIFICATIONS END
875
 
876
  with open(output_filename, "w", encoding="utf-8") as f:
@@ -885,11 +921,4 @@ async def convert_file_to_txt(
885
  temp_files_to_delete.append(cleaned_input_filename)
886
  background_tasks.add_task(delete_temp_files, temp_files_to_delete)
887
 
888
- return FileResponse(output_filename, filename=f"{base_filename}.txt")
889
-
890
- except HTTPException as http_exc:
891
- logging.error(f"Erreur HTTP lors de la conversion : {str(http_exc.detail)}")
892
- return JSONResponse(status_code=http_exc.status_code, content={"message": http_exc.detail})
893
- except Exception as e:
894
- logging.error(f"Erreur interne lors de la conversion : {str(e)}")
895
- return JSONResponse(status_code=500, content={"message": f"Erreur interne : {str(e)}"})
 
484
  except Exception as e:
485
  logging.error(f"Erreur lors de la réécriture du HTML : {str(e)}")
486
  return html_content
487
+
488
+ def extract_text_with_image_markers(input_filename: str) -> Tuple[str, List[Tuple[int, bytes]]]:
489
+ """
490
+ Extrait le texte d'un PDF en insérant des marqueurs pour les images.
491
+
492
+ Args:
493
+ input_filename (str): Chemin vers le fichier PDF.
494
+
495
+ Returns:
496
+ Tuple[str, List[Tuple[int, bytes]]]: Le texte extrait avec des marqueurs et une liste d'images extraites.
497
+ """
498
+ text = ""
499
+ images = []
500
+ with fitz.open(input_filename) as doc:
501
+ for page_num, page in enumerate(doc, start=1):
502
+ page_json = page.get_text("json")
503
+ blocks = page_json["blocks"]
504
+ for block in blocks:
505
+ if block['type'] == 0: # Texte
506
+ for line in block.get('lines', []):
507
+ for span in line.get('spans', []):
508
+ text += span.get('text', '')
509
+ elif block['type'] == 1: # Image
510
+ # Insérer un marqueur unique pour l'image
511
+ img_num = len(images) + 1
512
+ marker = f"[IMG_{img_num}]"
513
+ text += marker
514
+ # Extraire l'image
515
+ xref = block.get('xref')
516
+ try:
517
+ base_image = doc.extract_image(xref)
518
+ image_bytes = base_image["image"]
519
+ images.append((img_num, image_bytes))
520
+ except Exception as e:
521
+ logging.error(f"Erreur lors de l'extraction de l'image xref={xref} : {str(e)}")
522
+ return text, images
523
+
524
 
525
  async def clean_html_content(html_content: str, image_counter: List[int], images_data: Dict[str, Dict[str, str]]) -> str:
526
  soup = BeautifulSoup(html_content, 'html.parser')
 
848
 
849
  text = ""
850
  # MODIFICATIONS START: Extraction du texte et des images
851
+ images_data = {}
852
  if ext == '.pdf':
853
+ text, images = extract_text_with_image_markers(input_filename)
 
 
 
 
854
  elif ext == '.pptx':
855
  if 'Presentation' not in globals():
856
  raise HTTPException(status_code=500, detail="La librairie python-pptx n'est pas installée.")
 
882
 
883
  # Analyse des images
884
  # On récupère les descriptions des images
 
885
  if images:
886
+ image_descriptions = {}
887
  tasks = []
888
+ for img_num, img_bytes in images:
889
  base64_image = base64.b64encode(img_bytes).decode('utf-8')
890
+ tasks.append(asyncio.create_task(
891
  get_image_description(
892
  base64_image,
893
  prompt="Cette image est incluse dans un cours. Je voudrais que tu me donnes toutes les informations pertinentes, pour qu'on puisse comprendre ce qu'elle contient sans la voir. Ne commente pas les couleurs, les formes et la disposition. Ne commente pas le fait que tu décris l'image : fais en sorte que l'image puisse être naturellement remplacée par ta description. Si l'image ne contient aucune information, ne renvoie rien du tout."
894
  )
895
+ ))
896
 
897
+ descriptions = await asyncio.gather(*tasks)
898
 
899
+ for (img_num, _), desc in zip(images, descriptions):
900
+ if desc and desc != "Description indisponible.":
901
+ image_descriptions[img_num] = desc
902
+ else:
903
+ image_descriptions[img_num] = "Description indisponible."
904
 
905
+ # Remplacer les marqueurs par les descriptions
906
+ for img_num, desc in image_descriptions.items():
907
+ marker = f"[IMG_{img_num}]"
908
+ description_text = f"Image {img_num}: {desc}"
909
+ text = text.replace(marker, description_text)
910
  # MODIFICATIONS END
911
 
912
  with open(output_filename, "w", encoding="utf-8") as f:
 
921
  temp_files_to_delete.append(cleaned_input_filename)
922
  background_tasks.add_task(delete_temp_files, temp_files_to_delete)
923
 
924
+ return FileResponse(output_filename, filename=f"{base_filename}.txt")