Spaces:
Sleeping
Sleeping
erreur
Browse files
main.py
CHANGED
@@ -139,7 +139,7 @@ def delete_files_after_delay(file_paths: List[str], delay: int = 6000):
|
|
139 |
async def convert_to_accessible_html(input_filename, ext, base_filename, image_counter, images_data):
|
140 |
try:
|
141 |
if ext == '.pdf':
|
142 |
-
# PDF -> HTML avec pages
|
143 |
html_content = pdf_to_html(input_filename)
|
144 |
# Pour le PDF, on a déjà des <!--PAGE_X--> par page
|
145 |
elif ext in ['.ppt', '.pptx']:
|
@@ -152,15 +152,6 @@ async def convert_to_accessible_html(input_filename, ext, base_filename, image_c
|
|
152 |
text = convert_doc_to_text(input_filename)
|
153 |
html_content = text_to_html(text)
|
154 |
html_content = insert_page_comments_every_20_paragraphs(html_content)
|
155 |
-
elif ext in ['.html', '.htm']:
|
156 |
-
with open(input_filename, 'r', encoding='utf-8') as f:
|
157 |
-
html_content = f.read()
|
158 |
-
try:
|
159 |
-
doc = Document(html_content)
|
160 |
-
html_content = doc.summary()
|
161 |
-
except Exception as e:
|
162 |
-
logging.error(f"Erreur lors du nettoyage HTML : {str(e)}")
|
163 |
-
html_content = insert_page_comments_every_20_paragraphs(html_content)
|
164 |
else:
|
165 |
# Formats gérés par Pandoc
|
166 |
input_format = get_pandoc_format(ext)
|
@@ -184,10 +175,14 @@ async def convert_to_accessible_html(input_filename, ext, base_filename, image_c
|
|
184 |
)
|
185 |
)))
|
186 |
|
187 |
-
results = await asyncio.gather(*(t for _, t in tasks))
|
188 |
|
189 |
for (image_key, _), description in zip(tasks, results):
|
190 |
-
|
|
|
|
|
|
|
|
|
191 |
|
192 |
await html_rewrite_task
|
193 |
rewritten_html = html_rewrite_task.result()
|
@@ -228,6 +223,7 @@ def insert_page_comments_every_20_paragraphs(html_content: str) -> str:
|
|
228 |
|
229 |
def insert_css_into_html(html_content: str) -> str:
|
230 |
css_code = """
|
|
|
231 |
:root {
|
232 |
--font-size-min: 1rem;
|
233 |
--font-size-base: 1rem;
|
@@ -433,7 +429,7 @@ async def get_image_description(base64_image: str, prompt: str) -> str:
|
|
433 |
async def rewrite_html_accessible(html_content: str) -> str:
|
434 |
prompt = (
|
435 |
"Je vais te donner un fichier HTML, et je voudrais que tu le réécrives pour permettre l'accessibilité à toutes les formes de handicap, tout en **préservant strictement l'ordre du contenu original**.\n"
|
436 |
-
|
437 |
"- A priori, les titres qui sont préfixés par une écriture romaine (I, II, III), "
|
438 |
"par un nombre (1, 2, 3) ou par une lettre (a, b, c, ou bien A, B, C) doivent être de même niveau."
|
439 |
"Idem pour les titres rédigés en majuscules.\n"
|
@@ -484,43 +480,6 @@ 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 |
-
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')
|
@@ -721,7 +680,6 @@ async def convert_file_to_html(
|
|
721 |
logging.error(f"Erreur lors du démarrage du job : {str(e)}")
|
722 |
return JSONResponse(status_code=500, content={"message": f"Erreur lors du démarrage du job : {str(e)}"})
|
723 |
|
724 |
-
|
725 |
@app.get("/status/{job_id}")
|
726 |
async def check_status(job_id: str):
|
727 |
status_data = get_job_status(job_id)
|
|
|
139 |
async def convert_to_accessible_html(input_filename, ext, base_filename, image_counter, images_data):
|
140 |
try:
|
141 |
if ext == '.pdf':
|
142 |
+
# PDF -> HTML avec pages et marqueurs IMG_X
|
143 |
html_content = pdf_to_html(input_filename)
|
144 |
# Pour le PDF, on a déjà des <!--PAGE_X--> par page
|
145 |
elif ext in ['.ppt', '.pptx']:
|
|
|
152 |
text = convert_doc_to_text(input_filename)
|
153 |
html_content = text_to_html(text)
|
154 |
html_content = insert_page_comments_every_20_paragraphs(html_content)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
155 |
else:
|
156 |
# Formats gérés par Pandoc
|
157 |
input_format = get_pandoc_format(ext)
|
|
|
175 |
)
|
176 |
)))
|
177 |
|
178 |
+
results = await asyncio.gather(*(t for _, t in tasks), return_exceptions=True)
|
179 |
|
180 |
for (image_key, _), description in zip(tasks, results):
|
181 |
+
if isinstance(description, Exception):
|
182 |
+
logging.error(f"Erreur lors de la description de l'image {image_key} : {str(description)}")
|
183 |
+
images_data[image_key]['description'] = "Description indisponible."
|
184 |
+
else:
|
185 |
+
images_data[image_key]['description'] = description
|
186 |
|
187 |
await html_rewrite_task
|
188 |
rewritten_html = html_rewrite_task.result()
|
|
|
223 |
|
224 |
def insert_css_into_html(html_content: str) -> str:
|
225 |
css_code = """
|
226 |
+
/* Votre code CSS ici */
|
227 |
:root {
|
228 |
--font-size-min: 1rem;
|
229 |
--font-size-base: 1rem;
|
|
|
429 |
async def rewrite_html_accessible(html_content: str) -> str:
|
430 |
prompt = (
|
431 |
"Je vais te donner un fichier HTML, et je voudrais que tu le réécrives pour permettre l'accessibilité à toutes les formes de handicap, tout en **préservant strictement l'ordre du contenu original**.\n"
|
432 |
+
"Commence à analyser le plan du document. Il faut d'abord identifier les titres et comprendre leur logique :\n"
|
433 |
"- A priori, les titres qui sont préfixés par une écriture romaine (I, II, III), "
|
434 |
"par un nombre (1, 2, 3) ou par une lettre (a, b, c, ou bien A, B, C) doivent être de même niveau."
|
435 |
"Idem pour les titres rédigés en majuscules.\n"
|
|
|
480 |
except Exception as e:
|
481 |
logging.error(f"Erreur lors de la réécriture du HTML : {str(e)}")
|
482 |
return html_content
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
483 |
|
484 |
async def clean_html_content(html_content: str, image_counter: List[int], images_data: Dict[str, Dict[str, str]]) -> str:
|
485 |
soup = BeautifulSoup(html_content, 'html.parser')
|
|
|
680 |
logging.error(f"Erreur lors du démarrage du job : {str(e)}")
|
681 |
return JSONResponse(status_code=500, content={"message": f"Erreur lors du démarrage du job : {str(e)}"})
|
682 |
|
|
|
683 |
@app.get("/status/{job_id}")
|
684 |
async def check_status(job_id: str):
|
685 |
status_data = get_job_status(job_id)
|