eberhenriquez94 commited on
Commit
e642214
verified
1 Parent(s): f60e0ff
Files changed (1) hide show
  1. app.py +39 -67
app.py CHANGED
@@ -1,95 +1,67 @@
1
  import gradio as gr
2
  import subprocess
3
  import logging
4
- import os
5
  import tempfile
6
- import shlex
7
- from gradio_pdf import PDF
8
- import shutil
9
 
10
- # Configuraci贸n de logs
11
- logger = logging.getLogger(__name__)
12
- logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
13
 
14
- def ejecutar_comando(comando):
15
  """Ejecuta un comando de shell y maneja errores."""
16
  try:
17
  resultado = subprocess.run(comando, shell=True, check=True, capture_output=True, text=True)
18
- logger.info(f"Comando ejecutado: {comando}\nSalida:\n{resultado.stdout}")
 
19
  return resultado.stdout
20
  except subprocess.CalledProcessError as e:
21
- error_message = f"Error al ejecutar el comando: {comando}\nError: {e}\nSalida de error:\n{e.stderr}"
22
- logger.error(error_message)
23
  raise RuntimeError(error_message)
24
 
25
- def reparar_pdf(input_pdf, output_pdf):
26
- """Repara un PDF usando qpdf."""
27
- comando = f"qpdf --linearize {shlex.quote(input_pdf)} {shlex.quote(output_pdf)}"
28
- ejecutar_comando(comando)
29
-
30
- def simplificar_pdf(input_pdf, output_pdf):
31
- """Simplifica un PDF usando Ghostscript."""
32
- comando = f"gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dBATCH -sOutputFile={shlex.quote(output_pdf)} {shlex.quote(input_pdf)}"
33
- ejecutar_comando(comando)
34
-
35
- def crear_pdf_con_texto_incrustado(pdf_original, archivo_salida, idioma="spa"):
36
- """Procesa un PDF con OCR usando OCRmyPDF."""
37
- comando = f"ocrmypdf -l {idioma} --force-ocr --deskew --output-type pdf {shlex.quote(pdf_original)} {shlex.quote(archivo_salida)}"
38
- ejecutar_comando(comando)
39
-
40
- def flujo_principal(pdf_file, idioma="spa"):
41
- """Procesa un PDF subido con reparaci贸n, simplificaci贸n y OCR."""
42
- if not pdf_file:
43
  raise gr.Error("No se subi贸 ning煤n archivo.")
44
 
45
- reparado_pdf = tempfile.NamedTemporaryFile(delete=False, suffix=".pdf").name
46
- simplificado_pdf = tempfile.NamedTemporaryFile(delete=False, suffix=".pdf").name
47
- output_pdf = tempfile.NamedTemporaryFile(delete=False, suffix=".pdf").name
48
-
49
  try:
50
- # Reparar el PDF
51
- reparar_pdf(pdf_file, reparado_pdf)
52
-
53
- # Simplificar el PDF
54
- simplificar_pdf(reparado_pdf, simplificado_pdf)
55
 
56
- # Procesar con OCR
57
- crear_pdf_con_texto_incrustado(simplificado_pdf, output_pdf, idioma)
58
-
59
- return output_pdf # Devolver el archivo para descarga y vista previa
 
60
 
 
61
  except Exception as e:
62
- logger.error(f"Error durante el procesamiento del PDF: {str(e)}")
63
- raise gr.Error(f"Error al procesar el PDF: {str(e)}")
64
- finally:
65
- # Limpiar archivos temporales no necesarios
66
- for temp_file in [reparado_pdf, simplificado_pdf]:
67
- if os.path.exists(temp_file):
68
- os.remove(temp_file)
69
 
70
  # Interfaz Gradio
71
- with gr.Blocks() as interfaz:
72
- gr.Markdown("## Procesador de PDFs con OCR")
 
 
73
 
74
- with gr.Row():
75
- archivo_pdf = PDF(label="Sube tu archivo PDF") # Entrada usando PDF
76
  idioma_ocr = gr.Dropdown(["spa", "eng", "fra", "deu"], label="Idioma OCR", value="spa")
77
- boton_procesar = gr.Button("Procesar OCR")
 
 
78
 
79
- with gr.Row():
80
- pdf_vista = PDF(label="Visor PDF procesado", interactive=False) # Salida usando PDF para visualizaci贸n
81
- pdf_descarga = gr.File(label="Descargar PDF procesado con OCR", interactive=False)
82
 
83
- def procesamiento_y_descarga(pdf_file, idioma):
84
- """Realiza el procesamiento del PDF y devuelve tanto la vista previa como la ruta de descarga."""
85
- archivo_procesado = flujo_principal(pdf_file, idioma)
86
- return archivo_procesado, archivo_procesado
 
87
 
88
- boton_procesar.click(
89
- fn=procesamiento_y_descarga,
90
- inputs=[archivo_pdf, idioma_ocr],
91
- outputs=[pdf_vista, pdf_descarga],
92
- )
93
 
94
  if __name__ == "__main__":
95
- interfaz.launch()
 
1
  import gradio as gr
2
  import subprocess
3
  import logging
 
4
  import tempfile
5
+ import os
 
 
6
 
7
+ # Configurar logging
8
+ logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
 
9
 
10
+ def ejecutar_comando(comando, mensaje_exito="", mensaje_error=""):
11
  """Ejecuta un comando de shell y maneja errores."""
12
  try:
13
  resultado = subprocess.run(comando, shell=True, check=True, capture_output=True, text=True)
14
+ if mensaje_exito:
15
+ logging.info(f"{mensaje_exito}. Salida:\n{resultado.stdout}")
16
  return resultado.stdout
17
  except subprocess.CalledProcessError as e:
18
+ error_message = f"{mensaje_error}. Error: {e}\nSalida de error:\n{e.stderr}"
19
+ logging.error(error_message)
20
  raise RuntimeError(error_message)
21
 
22
+ def procesar_pdf_con_ocr(pdf_subido, idioma="spa"):
23
+ """Procesa un PDF subido con OCR y devuelve la ruta del archivo procesado."""
24
+ if not pdf_subido:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  raise gr.Error("No se subi贸 ning煤n archivo.")
26
 
 
 
 
 
27
  try:
28
+ input_pdf = pdf_subido.name
29
+ output_pdf = tempfile.NamedTemporaryFile(delete=False, suffix=".pdf").name
 
 
 
30
 
31
+ ejecutar_comando(
32
+ f"ocrmypdf -l {idioma} --force-ocr --deskew --output-type pdf {input_pdf} {output_pdf}",
33
+ mensaje_exito="OCR completado",
34
+ mensaje_error="Error en OCR"
35
+ )
36
 
37
+ return output_pdf # Ruta del archivo procesado
38
  except Exception as e:
39
+ logging.error(f"Error al procesar el PDF: {e}")
40
+ raise gr.Error(f"Ocurri贸 un error al procesar el archivo: {e}")
 
 
 
 
 
41
 
42
  # Interfaz Gradio
43
+ def interfaz_ocr():
44
+ """Crea la interfaz Gradio para el flujo de OCR."""
45
+ with gr.Blocks() as app:
46
+ gr.Markdown("## Procesador de PDFs con OCR")
47
 
48
+ archivo_pdf = gr.File(label="Sube tu archivo PDF")
 
49
  idioma_ocr = gr.Dropdown(["spa", "eng", "fra", "deu"], label="Idioma OCR", value="spa")
50
+ boton_procesar = gr.Button("Procesar")
51
+
52
+ salida_descarga = gr.File(label="Descargar PDF Procesado")
53
 
54
+ def procesar_y_descargar(pdf_file, idioma):
55
+ """Procesa el PDF subido y lo devuelve para descarga."""
56
+ return procesar_pdf_con_ocr(pdf_file, idioma)
57
 
58
+ boton_procesar.click(
59
+ fn=procesar_y_descargar,
60
+ inputs=[archivo_pdf, idioma_ocr],
61
+ outputs=[salida_descarga],
62
+ )
63
 
64
+ return app
 
 
 
 
65
 
66
  if __name__ == "__main__":
67
+ interfaz_ocr().launch()