histlearn commited on
Commit
849c18f
·
verified ·
1 Parent(s): 6b586d6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +100 -24
app.py CHANGED
@@ -150,30 +150,28 @@ def generate_pdf_report(dataframe, media_tempo_medio_turma, output_pdf_path):
150
  self.cell(0, 10, f'Page {self.page_no()}', 0, 0, 'C')
151
 
152
  def add_table(self, dataframe):
153
- self.set_font("Arial", "B", 10)
154
-
155
- # Calcular larguras dinâmicas das colunas
156
- col_widths = []
157
- for col in dataframe.columns:
158
- max_width = max(self.get_string_width(str(cell)) for cell in dataframe[col])
159
- col_widths.append(max_width + 4) # Adicionar um pequeno espaçamento
160
-
161
- row_height = self.font_size * 2
162
 
163
  # Adiciona os cabeçalhos
164
- for i, col in enumerate(dataframe.columns):
165
- self.cell(col_widths[i], row_height, col, border=1, align="C")
166
- self.ln(row_height)
167
 
168
- # Adiciona os dados com quebra de linha na coluna "Nome do Aluno"
169
- self.set_font("Arial", "", 10)
170
  for row in dataframe.itertuples(index=False):
171
- for i, item in enumerate(row):
172
- if i == 0: # Coluna "Nome do Aluno"
173
- self.multi_cell(col_widths[i], row_height, str(item), border=1, align="C")
174
- else:
175
- self.cell(col_widths[i], row_height, str(item), border=1, align="C")
176
- self.ln(row_height)
 
 
 
 
177
 
178
  def add_image(self, image_path):
179
  self.add_page()
@@ -294,13 +292,91 @@ with gr.Blocks(theme=theme) as interface:
294
  gr.Markdown("## Arquivos Excel (Relatórios de Tarefas)")
295
  excel_files = gr.Files(label="Arraste os arquivos .xlsx aqui", type="binary", file_count="multiple")
296
 
297
- generate_btn = gr.Button("Gerar Relatório", variant="primary")
298
  output_html = gr.HTML()
299
- pdf_output = gr.File(label="Download PDF Report")
 
300
 
301
  def wrapper(html_file, excel_files):
302
  html_content, html_path, pdf_path = processar_relatorio(html_file, excel_files)
303
- return {output_html: html_content, pdf_output: pdf_path}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
304
 
305
  generate_btn.click(
306
  fn=wrapper,
@@ -308,4 +384,4 @@ with gr.Blocks(theme=theme) as interface:
308
  outputs=[output_html, pdf_output]
309
  )
310
 
311
- interface.launch()
 
150
  self.cell(0, 10, f'Page {self.page_no()}', 0, 0, 'C')
151
 
152
  def add_table(self, dataframe):
153
+ self.set_font('Arial', 'B', 10)
154
+ col_width = self.w / len(dataframe.columns)
155
+ row_height = self.font_size
 
 
 
 
 
 
156
 
157
  # Adiciona os cabeçalhos
158
+ for col in dataframe.columns:
159
+ self.cell(col_width, row_height * 2, col, border=1)
160
+ self.ln(row_height * 2)
161
 
162
+ # Adiciona os dados com quebras de página
163
+ self.set_font('Arial', '', 10)
164
  for row in dataframe.itertuples(index=False):
165
+ for item in row:
166
+ self.cell(col_width, row_height * 2, str(item), border=1)
167
+ self.ln(row_height * 2)
168
+ if self.get_y() > self.page_break_trigger - 2 * row_height:
169
+ self.add_page()
170
+ self.set_font('Arial', 'B', 10)
171
+ for col in dataframe.columns:
172
+ self.cell(col_width, row_height * 2, col, border=1)
173
+ self.ln(row_height * 2)
174
+ self.set_font('Arial', '', 10)
175
 
176
  def add_image(self, image_path):
177
  self.add_page()
 
292
  gr.Markdown("## Arquivos Excel (Relatórios de Tarefas)")
293
  excel_files = gr.Files(label="Arraste os arquivos .xlsx aqui", type="binary", file_count="multiple")
294
 
295
+ generate_btn = gr.Button("Gerar Relatório", variant="primary") # Destaque no botão
296
  output_html = gr.HTML()
297
+ download_html_btn = gr.File(label="Download HTML Report")
298
+ download_pdf_btn = gr.File(label="Download PDF Report")
299
 
300
  def wrapper(html_file, excel_files):
301
  html_content, html_path, pdf_path = processar_relatorio(html_file, excel_files)
302
+ return html_content, html_path, pdf_path
303
+
304
+ generate_btn.click(fn=wrapper, inputs=[html_file, excel_files], outputs=[output_html, download_html_btn, download_pdf_btn])
305
+
306
+ interface.launch()
307
+
308
+ para solucionar, recebi as dicas a seguir, o que me diz?
309
+
310
+ Para resolver os problemas de formatação da tabela e ajustar a largura da coluna "Nome do Aluno" no PDF, juntamente com a quebra automática de linha para nomes longos, podemos fazer as seguintes modificações no seu código:
311
+
312
+ Largura Dinâmica das Colunas:
313
+
314
+ Calcule a largura de cada coluna com base no conteúdo da tabela e na largura da página.
315
+ Utilize a biblioteca fpdf.FPDF.get_string_width para obter a largura do texto em cada célula.
316
+ Quebra de Linha Automática:
317
+
318
+ Use o método fpdf.FPDF.multi_cell para as células da coluna "Nome do Aluno".
319
+ Defina a largura da coluna "Nome do Aluno" e deixe a altura ser calculada automaticamente (h=0).
320
+ Remover botões de download: Remova os componentes de download download_html_btn e download_pdf_btn , pois não há necessidade de usar JavaScript para baixar arquivos com gr.File().
321
+
322
+ Código Modificado:
323
+
324
+ Python
325
+ import gradio as gr
326
+ # ... (restante do seu código)
327
+
328
+ def generate_pdf_report(dataframe, media_tempo_medio_turma, output_pdf_path):
329
+ class PDF(FPDF):
330
+ # ... (header e footer permanecem iguais)
331
+
332
+ def add_table(self, dataframe):
333
+ self.set_font("Arial", "B", 10)
334
+
335
+ # Calcular larguras dinâmicas das colunas
336
+ col_widths = []
337
+ for col in dataframe.columns:
338
+ max_width = max(self.get_string_width(str(cell)) for cell in dataframe[col])
339
+ col_widths.append(max_width + 4) # Adicionar um pequeno espaçamento
340
+
341
+ row_height = self.font_size * 2
342
+
343
+ # Adiciona os cabeçalhos
344
+ for i, col in enumerate(dataframe.columns):
345
+ self.cell(col_widths[i], row_height, col, border=1, align="C")
346
+ self.ln(row_height)
347
+
348
+ # Adiciona os dados com quebra de linha na coluna "Nome do Aluno"
349
+ self.set_font("Arial", "", 10)
350
+ for row in dataframe.itertuples(index=False):
351
+ for i, item in enumerate(row):
352
+ if i == 0: # Coluna "Nome do Aluno"
353
+ self.multi_cell(col_widths[i], row_height, str(item), border=1, align="C", ln=3, max_line_height=row_height)
354
+ else:
355
+ self.cell(col_widths[i], row_height, str(item), border=1, align="C")
356
+ self.ln(row_height)
357
+
358
+ # ... (add_image permanece igual)
359
+
360
+ # ... (restante do seu código)
361
+
362
+ # --- Interface Gradio ---
363
+ with gr.Blocks(theme=theme) as interface:
364
+ gr.Markdown("# Processamento de Relatórios de Tarefas")
365
+ with gr.Row():
366
+ with gr.Column():
367
+ gr.Markdown("## Arquivo HTML (alunos.htm)")
368
+ html_file = gr.File(label="Arraste o arquivo .htm aqui", type="binary")
369
+ with gr.Column():
370
+ gr.Markdown("## Arquivos Excel (Relatórios de Tarefas)")
371
+ excel_files = gr.Files(label="Arraste os arquivos .xlsx aqui", type="binary", file_count="multiple")
372
+
373
+ generate_btn = gr.Button("Gerar Relatório", variant="primary")
374
+ output_html = gr.HTML(elem_id="html_output")
375
+ pdf_output = gr.File(label="Download PDF Report", elem_id="pdf_output")
376
+
377
+ def wrapper(html_file, excel_files):
378
+ html_content, html_path, pdf_path = processar_relatorio(html_file, excel_files)
379
+ return {output_html: html_content, pdf_output: pdf_path} # Retorna o conteúdo HTML e o arquivo PDF
380
 
381
  generate_btn.click(
382
  fn=wrapper,
 
384
  outputs=[output_html, pdf_output]
385
  )
386
 
387
+ interface.launch()