Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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(
|
154 |
-
|
155 |
-
|
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
|
165 |
-
self.cell(
|
166 |
-
self.ln(row_height)
|
167 |
|
168 |
-
# Adiciona os dados com
|
169 |
-
self.set_font(
|
170 |
for row in dataframe.itertuples(index=False):
|
171 |
-
for
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
|
|
|
|
|
|
|
|
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 |
-
|
|
|
300 |
|
301 |
def wrapper(html_file, excel_files):
|
302 |
html_content, html_path, pdf_path = processar_relatorio(html_file, excel_files)
|
303 |
-
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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()
|