Spaces:
Sleeping
Sleeping
Replacer les images dans convert_to_txt
Browse files
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 |
-
|
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
|
857 |
base64_image = base64.b64encode(img_bytes).decode('utf-8')
|
858 |
-
tasks.append(
|
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 |
-
|
866 |
|
867 |
-
for (
|
868 |
-
|
|
|
|
|
|
|
869 |
|
870 |
-
#
|
871 |
-
|
872 |
-
|
873 |
-
|
|
|
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")
|
|
|
|
|
|
|
|
|
|
|
|
|
|