Bentham commited on
Commit
c08b912
·
verified ·
1 Parent(s): 935a92b
Files changed (1) hide show
  1. main.py +31 -19
main.py CHANGED
@@ -827,16 +827,17 @@ async def convert_file_to_txt(
827
 
828
  text = ""
829
  images = []
830
- image_hash_map = {} # Dictionnaire pour mapper les hashes aux descriptions
831
- seen_hashes = set() # Ensemble pour suivre les hashes déjà traités
 
832
 
833
- # MODIFICATIONS START: Extraction du texte et des images
834
  if ext == '.pdf':
835
  with fitz.open(input_filename) as doc:
836
  for page in doc:
837
  text += page.get_text()
838
- # Extraire les images du PDF
839
  images = extract_images_from_pdf(input_filename)
 
840
  elif ext == '.pptx':
841
  if 'Presentation' not in globals():
842
  raise HTTPException(status_code=500, detail="La librairie python-pptx n'est pas installée.")
@@ -847,34 +848,45 @@ async def convert_file_to_txt(
847
  if hasattr(shape, "text"):
848
  text_content.append(shape.text)
849
  text = "\n".join(text_content)
850
- images = extract_images_from_ppt(input_filename)
851
- elif ext == '.ppt':
852
- if 'textract' not in globals():
853
- raise HTTPException(status_code=500, detail="La librairie textract n'est pas installée.")
854
- text = textract.process(input_filename).decode('utf-8', errors='replace')
855
- images = extract_images_from_ppt(input_filename)
 
 
 
 
 
 
856
  elif ext == '.doc':
857
  if 'textract' not in globals():
858
  raise HTTPException(status_code=500, detail="La librairie textract n'est pas installée.")
859
  text = textract.process(input_filename).decode('utf-8', errors='replace')
860
- # Pas d'extraction d'images simple pour .doc ici
861
- images = []
862
  else:
863
- # Autres formats pris en charge par pandoc (sans extraction d'image)
864
  pypandoc.convert_file(input_filename, 'plain', outputfile=output_filename)
865
  with open(output_filename, "r", encoding="utf-8") as f:
866
  text = f.read()
867
- images = []
 
 
 
 
 
 
868
 
869
  # Analyse des images avec déduplication basée sur le hash
870
  if images:
871
  image_descriptions = []
872
  for i, img_bytes in enumerate(images, start=1):
873
- # Calculer le hash de l'image
874
  img_hash = hashlib.sha256(img_bytes).hexdigest()
875
  if img_hash in seen_hashes:
876
  logging.debug(f"Image {i} est un doublon (hash: {img_hash}).")
877
- description = image_hash_map[img_hash] # Réutiliser la description existante
878
  else:
879
  seen_hashes.add(img_hash)
880
  base64_image = base64.b64encode(img_bytes).decode('utf-8')
@@ -882,15 +894,14 @@ async def convert_file_to_txt(
882
  base64_image,
883
  prompt="Cette image est incluse dans un cours. Je voudrais que tu me donnes les informations pertinentes qu'elle contient. Ne commente pas les figures, les couleurs ni les formes.\n- Si l'image ne contient que des textes, il faut simplement les retranscrire.\n- Si l'image contient des schémas, il faut exposer ce qu'ils signifient, et les reformuler avec des phrases complètes, claires et compréhensibles, comme si tu le commentais pendant un cours.\nSi l'image ne contient aucune information textuelle ou schématique, renvoie simplement \"no-text\"."
884
  )
885
- image_hash_map[img_hash] = description # Stocker la description pour les doublons
886
  image_descriptions.append((i, description))
887
 
888
- # On ajoute les descriptions à la fin du texte
889
  text += "\n\n--- Voici l'ensemble des images utilisées dans ce document ---\n"
890
  for num, desc in image_descriptions:
891
  if desc != "no-text":
892
  text += f"\nImage {num} : {desc}\n"
893
- # MODIFICATIONS END
894
 
895
  with open(output_filename, "w", encoding="utf-8") as f:
896
  f.write(text)
@@ -912,3 +923,4 @@ async def convert_file_to_txt(
912
  except Exception as e:
913
  logging.error(f"Erreur interne lors de la conversion : {str(e)}")
914
  return JSONResponse(status_code=500, content={"message": f"Erreur interne : {str(e)}"})
 
 
827
 
828
  text = ""
829
  images = []
830
+ tables = []
831
+ image_hash_map = {}
832
+ seen_hashes = set()
833
 
834
+ # Extraction du texte, des images et des tableaux
835
  if ext == '.pdf':
836
  with fitz.open(input_filename) as doc:
837
  for page in doc:
838
  text += page.get_text()
 
839
  images = extract_images_from_pdf(input_filename)
840
+ tables = extract_tables_from_pdf(input_filename)
841
  elif ext == '.pptx':
842
  if 'Presentation' not in globals():
843
  raise HTTPException(status_code=500, detail="La librairie python-pptx n'est pas installée.")
 
848
  if hasattr(shape, "text"):
849
  text_content.append(shape.text)
850
  text = "\n".join(text_content)
851
+ images = extract_images_from_pptx(input_filename)
852
+ tables = extract_tables_from_pptx(input_filename)
853
+ elif ext == '.docx':
854
+ if 'DocxDocument' not in globals():
855
+ raise HTTPException(status_code=500, detail="La librairie python-docx n'est pas installée.")
856
+ tables = extract_tables_from_docx(input_filename)
857
+ doc = DocxDocument(input_filename)
858
+ text_content = []
859
+ for para in doc.paragraphs:
860
+ text_content.append(para.text)
861
+ text = "\n".join(text_content)
862
+ # Extraction des images si nécessaire
863
  elif ext == '.doc':
864
  if 'textract' not in globals():
865
  raise HTTPException(status_code=500, detail="La librairie textract n'est pas installée.")
866
  text = textract.process(input_filename).decode('utf-8', errors='replace')
867
+ images = extract_images_from_ppt(input_filename)
868
+ tables = [] # Extraction des tables pour .doc peut nécessiter une autre approche
869
  else:
870
+ # Autres formats pris en charge par pandoc
871
  pypandoc.convert_file(input_filename, 'plain', outputfile=output_filename)
872
  with open(output_filename, "r", encoding="utf-8") as f:
873
  text = f.read()
874
+ tables = [] # Extraction des tables si possible
875
+
876
+ # Ajout des tables au texte
877
+ if tables:
878
+ text += "\n\n--- Tables extraites ---\n"
879
+ for table_text in tables:
880
+ text += table_text + "\n"
881
 
882
  # Analyse des images avec déduplication basée sur le hash
883
  if images:
884
  image_descriptions = []
885
  for i, img_bytes in enumerate(images, start=1):
 
886
  img_hash = hashlib.sha256(img_bytes).hexdigest()
887
  if img_hash in seen_hashes:
888
  logging.debug(f"Image {i} est un doublon (hash: {img_hash}).")
889
+ description = image_hash_map[img_hash]
890
  else:
891
  seen_hashes.add(img_hash)
892
  base64_image = base64.b64encode(img_bytes).decode('utf-8')
 
894
  base64_image,
895
  prompt="Cette image est incluse dans un cours. Je voudrais que tu me donnes les informations pertinentes qu'elle contient. Ne commente pas les figures, les couleurs ni les formes.\n- Si l'image ne contient que des textes, il faut simplement les retranscrire.\n- Si l'image contient des schémas, il faut exposer ce qu'ils signifient, et les reformuler avec des phrases complètes, claires et compréhensibles, comme si tu le commentais pendant un cours.\nSi l'image ne contient aucune information textuelle ou schématique, renvoie simplement \"no-text\"."
896
  )
897
+ image_hash_map[img_hash] = description
898
  image_descriptions.append((i, description))
899
 
900
+ # Ajout des descriptions des images au texte
901
  text += "\n\n--- Voici l'ensemble des images utilisées dans ce document ---\n"
902
  for num, desc in image_descriptions:
903
  if desc != "no-text":
904
  text += f"\nImage {num} : {desc}\n"
 
905
 
906
  with open(output_filename, "w", encoding="utf-8") as f:
907
  f.write(text)
 
923
  except Exception as e:
924
  logging.error(f"Erreur interne lors de la conversion : {str(e)}")
925
  return JSONResponse(status_code=500, content={"message": f"Erreur interne : {str(e)}"})
926
+