DaniFera commited on
Commit
9b86a61
verified
1 Parent(s): e4716aa

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +18 -29
app.py CHANGED
@@ -1,4 +1,4 @@
1
- # Versi贸n 1.2: Correcci贸n de UI y Preview Avanzada
2
  import gradio as gr
3
  import pandas as pd
4
  import config
@@ -6,7 +6,8 @@ from core import PDFEngine
6
 
7
  engine = PDFEngine()
8
 
9
- # --- FUNCIONES UNIR ---
 
10
  def update_file_list(files):
11
  if not files: return pd.DataFrame(), ""
12
  data = [[i, f.split("/")[-1]] for i, f in enumerate(files)]
@@ -18,10 +19,8 @@ def process_merge_ordered(files, order_str):
18
  try:
19
  indices = [int(x.strip()) for x in order_str.split(",") if x.strip().isdigit()]
20
  return engine.merge_pdfs(files, indices)
21
- except Exception as e:
22
- raise gr.Error(f"Error: {str(e)}")
23
 
24
- # --- FUNCIONES DIVIDIR ---
25
  def load_pdf_info(file):
26
  if not file: return None, 0, gr.update(visible=False)
27
  info = engine.get_pdf_info(file)
@@ -29,37 +28,27 @@ def load_pdf_info(file):
29
 
30
  def update_preview(file, range_str, total_pages):
31
  if not file or not range_str: return None
32
-
33
- # NUEVO: Obtenemos los hitos clave (inicio/fin) de cada rango
34
  key_pages = engine.get_preview_indices_from_string(range_str, total_pages)
35
-
36
  if not key_pages: return None
37
-
38
- # Limitamos a 8 previews para no saturar
39
  key_pages = key_pages[:8]
40
-
41
  gallery_data = []
42
  for page_num in key_pages:
43
  img_path = engine.generate_preview(file, page_num)
44
- if img_path:
45
- gallery_data.append((img_path, f"P谩g {page_num}"))
46
-
47
  return gallery_data
48
 
49
  def process_split_range(file, range_str):
50
  if not file: return None
51
  try:
 
52
  return engine.split_pdf_custom(file, range_str)
53
  except Exception as e:
54
  raise gr.Error(str(e))
55
 
56
- # --- FUNCIONES PROTEGER ---
57
  def interface_protect(file, password):
58
  if not file or not password: return None
59
- try:
60
- return engine.protect_pdf(file, password)
61
- except Exception as e:
62
- raise gr.Error(str(e))
63
 
64
  # --- UI PRINCIPAL ---
65
  with gr.Blocks(title=config.APP_TITLE, theme=gr.themes.Soft()) as demo:
@@ -74,14 +63,14 @@ with gr.Blocks(title=config.APP_TITLE, theme=gr.themes.Soft()) as demo:
74
  merge_files = gr.File(file_count="multiple", label="Archivos", file_types=[".pdf"])
75
  with gr.Column(scale=2):
76
  file_table = gr.Dataframe(headers=["ID", "Archivo"], interactive=False)
77
- order_input = gr.Textbox(label="Orden (IDs separados por coma)", placeholder="Ej: 0, 2, 1")
78
  merge_btn = gr.Button("Unir PDF", variant="primary")
79
- merge_output = gr.File(label="Resultado")
80
 
81
  merge_files.change(fn=update_file_list, inputs=merge_files, outputs=[file_table, order_input])
82
  merge_btn.click(fn=process_merge_ordered, inputs=[merge_files, order_input], outputs=merge_output)
83
 
84
- # TAB 2: DIVIDIR (Mejorado)
85
  with gr.TabItem("Dividir PDF"):
86
  gr.Markdown(config.TXT_SPLIT)
87
  with gr.Row():
@@ -89,22 +78,22 @@ with gr.Blocks(title=config.APP_TITLE, theme=gr.themes.Soft()) as demo:
89
  split_file = gr.File(label="PDF Origen", file_types=[".pdf"])
90
  info_txt = gr.Markdown("")
91
  page_count = gr.State(0)
92
- range_in = gr.Textbox(label="Rangos", placeholder="Ej: 1-3, 5, 8-10")
93
 
94
  with gr.Row():
95
- prev_btn = gr.Button("Ver P谩ginas Clave")
96
- split_btn = gr.Button("Extraer", variant="primary")
97
 
98
  with gr.Column():
99
- # Galer铆a din谩mica para mostrar m煤ltiples p谩ginas
100
- preview_gal = gr.Gallery(label="Hitos del Rango", columns=3, height=350, object_fit="contain")
101
- split_out = gr.File(label="PDF Resultante")
102
 
103
  split_file.change(fn=load_pdf_info, inputs=split_file, outputs=[info_txt, page_count, split_out])
104
  prev_btn.click(fn=update_preview, inputs=[split_file, range_in, page_count], outputs=preview_gal)
105
  split_btn.click(fn=process_split_range, inputs=[split_file, range_in], outputs=split_out)
106
 
107
- # TAB 3: PROTEGER (Restaurado)
108
  with gr.TabItem("Proteger PDF"):
109
  gr.Markdown(config.TXT_PROTECT)
110
  with gr.Row():
 
1
+ # Versi贸n 1.3: UI con descarga de ZIP
2
  import gradio as gr
3
  import pandas as pd
4
  import config
 
6
 
7
  engine = PDFEngine()
8
 
9
+ # --- FUNCIONES AUXILIARES ---
10
+ # (Se mantienen igual que v1.2: update_file_list, process_merge_ordered, load_pdf_info, update_preview)
11
  def update_file_list(files):
12
  if not files: return pd.DataFrame(), ""
13
  data = [[i, f.split("/")[-1]] for i, f in enumerate(files)]
 
19
  try:
20
  indices = [int(x.strip()) for x in order_str.split(",") if x.strip().isdigit()]
21
  return engine.merge_pdfs(files, indices)
22
+ except Exception as e: raise gr.Error(f"Error: {str(e)}")
 
23
 
 
24
  def load_pdf_info(file):
25
  if not file: return None, 0, gr.update(visible=False)
26
  info = engine.get_pdf_info(file)
 
28
 
29
  def update_preview(file, range_str, total_pages):
30
  if not file or not range_str: return None
 
 
31
  key_pages = engine.get_preview_indices_from_string(range_str, total_pages)
 
32
  if not key_pages: return None
 
 
33
  key_pages = key_pages[:8]
 
34
  gallery_data = []
35
  for page_num in key_pages:
36
  img_path = engine.generate_preview(file, page_num)
37
+ if img_path: gallery_data.append((img_path, f"P谩g {page_num}"))
 
 
38
  return gallery_data
39
 
40
  def process_split_range(file, range_str):
41
  if not file: return None
42
  try:
43
+ # Ahora devuelve la ruta de un .zip
44
  return engine.split_pdf_custom(file, range_str)
45
  except Exception as e:
46
  raise gr.Error(str(e))
47
 
 
48
  def interface_protect(file, password):
49
  if not file or not password: return None
50
+ try: return engine.protect_pdf(file, password)
51
+ except Exception as e: raise gr.Error(str(e))
 
 
52
 
53
  # --- UI PRINCIPAL ---
54
  with gr.Blocks(title=config.APP_TITLE, theme=gr.themes.Soft()) as demo:
 
63
  merge_files = gr.File(file_count="multiple", label="Archivos", file_types=[".pdf"])
64
  with gr.Column(scale=2):
65
  file_table = gr.Dataframe(headers=["ID", "Archivo"], interactive=False)
66
+ order_input = gr.Textbox(label="Orden (IDs)", placeholder="Ej: 0, 2, 1")
67
  merge_btn = gr.Button("Unir PDF", variant="primary")
68
+ merge_output = gr.File(label="PDF Unido")
69
 
70
  merge_files.change(fn=update_file_list, inputs=merge_files, outputs=[file_table, order_input])
71
  merge_btn.click(fn=process_merge_ordered, inputs=[merge_files, order_input], outputs=merge_output)
72
 
73
+ # TAB 2: DIVIDIR (Salida ZIP)
74
  with gr.TabItem("Dividir PDF"):
75
  gr.Markdown(config.TXT_SPLIT)
76
  with gr.Row():
 
78
  split_file = gr.File(label="PDF Origen", file_types=[".pdf"])
79
  info_txt = gr.Markdown("")
80
  page_count = gr.State(0)
81
+ range_in = gr.Textbox(label="Rangos a separar", placeholder="Ej: 1-3, 5, 8-9")
82
 
83
  with gr.Row():
84
+ prev_btn = gr.Button("Ver Hitos")
85
+ split_btn = gr.Button("Dividir y Descargar ZIP", variant="primary")
86
 
87
  with gr.Column():
88
+ preview_gal = gr.Gallery(label="Vista Previa", columns=3, height=350, object_fit="contain")
89
+ # Cambiamos etiqueta para clarificar
90
+ split_out = gr.File(label="Archivo ZIP con divisiones", file_types=[".zip"])
91
 
92
  split_file.change(fn=load_pdf_info, inputs=split_file, outputs=[info_txt, page_count, split_out])
93
  prev_btn.click(fn=update_preview, inputs=[split_file, range_in, page_count], outputs=preview_gal)
94
  split_btn.click(fn=process_split_range, inputs=[split_file, range_in], outputs=split_out)
95
 
96
+ # TAB 3: PROTEGER
97
  with gr.TabItem("Proteger PDF"):
98
  gr.Markdown(config.TXT_PROTECT)
99
  with gr.Row():