Spaces:
Sleeping
Sleeping
tableaux
Browse files
main.py
CHANGED
@@ -827,16 +827,17 @@ async def convert_file_to_txt(
|
|
827 |
|
828 |
text = ""
|
829 |
images = []
|
830 |
-
|
831 |
-
|
|
|
832 |
|
833 |
-
#
|
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 =
|
851 |
-
|
852 |
-
|
853 |
-
|
854 |
-
|
855 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
861 |
-
|
862 |
else:
|
863 |
-
# Autres formats pris en charge par pandoc
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
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]
|
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
|
886 |
image_descriptions.append((i, description))
|
887 |
|
888 |
-
#
|
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 |
+
|