import chardet from fastapi import UploadFile, HTTPException from io import BytesIO from docx import Document import fitz async def file_to_text(file: UploadFile): file_extension = file.filename.split('.')[-1].lower() if file_extension == 'csv': csv_data = await file.read() encoding = chardet.detect(csv_data)['encoding'] try: decoded_data = csv_data.decode(encoding) return decoded_data except UnicodeDecodeError: raise HTTPException(status_code=400, detail="Le fichier CSV contient des caractères qui ne peuvent pas être décodés.") # Fait elif file_extension == 'json': json_data = await file.read() return json_data.decode() # Fait elif file_extension == 'docx': doc_data = await file.read() # Utilisez un flux mémoire pour passer les données au Document doc_stream = BytesIO(doc_data) doc = Document(doc_stream) doc_text = [paragraph.text for paragraph in doc.paragraphs] return '\n'.join(doc_text) # Fait elif file_extension == 'txt': txt_data = await file.read() return txt_data.decode() # Fait elif file_extension == 'pdf': try: pdf_data = await file.read() # Chargez les données binaires dans un objet fitz.Document pdf_document = fitz.open("pdf", pdf_data) text = '' # Extrait le texte de chaque page for page in pdf_document: text += page.get_text() pdf_document.close() return text except Exception as e: raise HTTPException(status_code=500, detail=f"Erreur de lecture du fichier PDF : {e}") else: return HTTPException(status_code=400, detail="Format de fichier non pris en charge")