Dabococo commited on
Commit
76bc209
·
verified ·
1 Parent(s): fd19ee7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +52 -17
app.py CHANGED
@@ -7,6 +7,9 @@ import pandas as pd
7
  import re
8
  import tempfile
9
  import unicodedata # Pour sanitizer le nom de fichier
 
 
 
10
 
11
  # Initialize Groq client
12
  client = Groq(api_key=os.getenv("GROQ_API_KEY"))
@@ -104,7 +107,7 @@ def process_image_and_get_response(image):
104
  # Prompt optimisé pour structure, précision et inclusion des infos supplémentaires
105
  prompt = (
106
  "Analyse l'image et extrait tout le contenu. "
107
- "D'abord, suggère un nom de fichier descriptif pour l'Excel basé sur le contenu principal de l'image (court, sans extension, ex: 'Tableau_Dossiers_2022'). "
108
  "Ensuite, extrait TOUT texte additionnel autour, au-dessus, en-dessous ou à côté du tableau (titres, en-têtes, notes, pieds de page, logos, etc.), en le recopiant mot pour mot, même si c'est dispersé. "
109
  "Si aucun texte additionnel, laisse vide. "
110
  "Enfin, extrait le tableau en entier, en recopiant TOUTES les lignes et colonnes à l'identique, y compris les lignes vides ou partielles si elles existent dans l'image. "
@@ -114,7 +117,7 @@ def process_image_and_get_response(image):
114
  "Remplis les cellules vides avec '' si nécessaire pour maintenir l'alignement, mais ne filtre pas les lignes vides si elles sont présentes. "
115
  "N'ajoute aucun texte explicatif dans le tableau. "
116
  "Structure ta réponse exactement comme suit :\n"
117
- "Filename: [nom_suggéré]\n"
118
  "Additional text: [tout le texte additionnel, séparé par \n si plusieurs lignes ; sinon vide]\n"
119
  "Table:\n"
120
  "[le tableau Markdown ici]"
@@ -135,8 +138,8 @@ def process_image_and_get_response(image):
135
  ]
136
  }
137
  ],
138
- temperature=0.2, # Réduit pour plus de précision et respect de la structure
139
- max_completion_tokens=4096, # Augmenté pour tableaux complexes
140
  top_p=1,
141
  stream=False,
142
  stop=None
@@ -150,19 +153,51 @@ def process_image_and_get_response(image):
150
  # Parse le tableau en DataFrame
151
  df = parse_markdown_table_to_df(table_text)
152
 
 
 
 
 
153
  # Créer le fichier Excel avec nom personnalisé
154
  excel_path = f"/tmp/{filename if filename else 'tableau_extrait'}.xlsx"
155
- with pd.ExcelWriter(excel_path, engine='openpyxl') as writer:
156
- # Feuille pour le tableau
157
- if not df.empty and "Erreur" not in df.columns:
158
- df.to_excel(writer, sheet_name='Tableau_Extrait', index=False)
159
- else:
160
- pd.DataFrame({"Message": ["Erreur lors du parsing du tableau"]}).to_excel(writer, sheet_name='Tableau_Extrait', index=False)
161
-
162
- # Feuille pour le texte additionnel, si présent
163
- if additional_text:
164
- additional_df = pd.DataFrame({"Texte Additionnel": additional_text.split('\n')})
165
- additional_df.to_excel(writer, sheet_name='Infos_Supplementaires', index=False)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
166
 
167
  return response, excel_path
168
 
@@ -175,10 +210,10 @@ iface = gr.Interface(
175
  inputs=gr.Image(type="pil", label="Uploader une image contenant un tableau"),
176
  outputs=[
177
  gr.Textbox(label="Réponse de l'IA (texte additionnel + tableau Markdown pour copier-coller)"),
178
- gr.File(label="Télécharger le fichier Excel (avec tableau et infos supp.)")
179
  ],
180
  title="Extraction de Tableau depuis Image avec Groq et Export Excel",
181
- description="Uploader une image avec un tableau. L'IA extrait le texte additionnel et le tableau, puis génère un Excel avec des feuilles séparées."
182
  )
183
 
184
  # Launch the interface
 
7
  import re
8
  import tempfile
9
  import unicodedata # Pour sanitizer le nom de fichier
10
+ from openpyxl import Workbook
11
+ from openpyxl.drawing.image import Image as OpenpyxlImage
12
+ from openpyxl.styles import Font, Alignment
13
 
14
  # Initialize Groq client
15
  client = Groq(api_key=os.getenv("GROQ_API_KEY"))
 
107
  # Prompt optimisé pour structure, précision et inclusion des infos supplémentaires
108
  prompt = (
109
  "Analyse l'image et extrait tout le contenu. "
110
+ "D'abord, suggère un nom de fichier descriptif et précis pour l'Excel basé sur le contenu principal de l'image (inclue des éléments clés comme dates, thèmes ou identifiants uniques ; court, sans extension, ex: 'Tableau_Dossiers_Dentistes_2022_2024'). "
111
  "Ensuite, extrait TOUT texte additionnel autour, au-dessus, en-dessous ou à côté du tableau (titres, en-têtes, notes, pieds de page, logos, etc.), en le recopiant mot pour mot, même si c'est dispersé. "
112
  "Si aucun texte additionnel, laisse vide. "
113
  "Enfin, extrait le tableau en entier, en recopiant TOUTES les lignes et colonnes à l'identique, y compris les lignes vides ou partielles si elles existent dans l'image. "
 
117
  "Remplis les cellules vides avec '' si nécessaire pour maintenir l'alignement, mais ne filtre pas les lignes vides si elles sont présentes. "
118
  "N'ajoute aucun texte explicatif dans le tableau. "
119
  "Structure ta réponse exactement comme suit :\n"
120
+ "Filename: [nom_suggéré_précis]\n"
121
  "Additional text: [tout le texte additionnel, séparé par \n si plusieurs lignes ; sinon vide]\n"
122
  "Table:\n"
123
  "[le tableau Markdown ici]"
 
138
  ]
139
  }
140
  ],
141
+ temperature=0.5, # Réduit pour plus de précision et respect de la structure
142
+ max_completion_tokens=8096, # Augmenté pour tableaux complexes
143
  top_p=1,
144
  stream=False,
145
  stop=None
 
153
  # Parse le tableau en DataFrame
154
  df = parse_markdown_table_to_df(table_text)
155
 
156
+ # Créer un fichier temporaire pour l'image originale
157
+ img_path = tempfile.NamedTemporaryFile(delete=False, suffix=".jpg").name
158
+ image.save(img_path, format="JPEG")
159
+
160
  # Créer le fichier Excel avec nom personnalisé
161
  excel_path = f"/tmp/{filename if filename else 'tableau_extrait'}.xlsx"
162
+ wb = Workbook()
163
+
164
+ # Feuille pour le tableau
165
+ ws_table = wb.active
166
+ ws_table.title = 'Tableau_Extrait'
167
+ if not df.empty and "Erreur" not in df.columns:
168
+ # Écrire les en-têtes en gras
169
+ for col_num, value in enumerate(df.columns.values, start=1):
170
+ cell = ws_table.cell(row=1, column=col_num, value=value)
171
+ cell.font = Font(bold=True)
172
+ cell.alignment = Alignment(wrap_text=True, vertical='top')
173
+
174
+ # Écrire les données avec wrap text
175
+ for row_num, row in enumerate(df.values, start=2):
176
+ for col_num, value in enumerate(row, start=1):
177
+ cell = ws_table.cell(row=row_num, column=col_num, value=value)
178
+ cell.alignment = Alignment(wrap_text=True, vertical='top')
179
+
180
+ else:
181
+ ws_table.cell(row=1, column=1, value="Erreur lors du parsing du tableau")
182
+
183
+ # Feuille pour le texte additionnel, si présent
184
+ if additional_text:
185
+ ws_additional = wb.create_sheet(title='Infos_Supplementaires')
186
+ lines = additional_text.split('\n')
187
+ for row_num, line in enumerate(lines, start=1):
188
+ cell = ws_additional.cell(row=row_num, column=1, value=line)
189
+ cell.alignment = Alignment(wrap_text=True, vertical='top')
190
+
191
+ # Feuille pour l'image originale
192
+ ws_image = wb.create_sheet(title='Image_Originale')
193
+ img = OpenpyxlImage(img_path)
194
+ ws_image.add_image(img, 'A1')
195
+
196
+ # Sauvegarder le workbook
197
+ wb.save(excel_path)
198
+
199
+ # Nettoyer le fichier image temporaire
200
+ os.unlink(img_path)
201
 
202
  return response, excel_path
203
 
 
210
  inputs=gr.Image(type="pil", label="Uploader une image contenant un tableau"),
211
  outputs=[
212
  gr.Textbox(label="Réponse de l'IA (texte additionnel + tableau Markdown pour copier-coller)"),
213
+ gr.File(label="Télécharger le fichier Excel (avec tableau, infos supp. et image originale)")
214
  ],
215
  title="Extraction de Tableau depuis Image avec Groq et Export Excel",
216
+ description="Uploader une image avec un tableau. L'IA extrait le texte additionnel et le tableau, puis génère un Excel avec des feuilles séparées, y compris l'image originale."
217
  )
218
 
219
  # Launch the interface