Spaces:
Sleeping
Sleeping
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
|
7 |
-
from gradio_pdf import PDF
|
8 |
-
import shutil
|
9 |
|
10 |
-
#
|
11 |
-
|
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 |
-
|
|
|
19 |
return resultado.stdout
|
20 |
except subprocess.CalledProcessError as e:
|
21 |
-
error_message = f"
|
22 |
-
|
23 |
raise RuntimeError(error_message)
|
24 |
|
25 |
-
def
|
26 |
-
"""
|
27 |
-
|
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 |
-
|
51 |
-
|
52 |
-
|
53 |
-
# Simplificar el PDF
|
54 |
-
simplificar_pdf(reparado_pdf, simplificado_pdf)
|
55 |
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
|
|
60 |
|
|
|
61 |
except Exception as e:
|
62 |
-
|
63 |
-
raise gr.Error(f"
|
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 |
-
|
72 |
-
|
|
|
|
|
73 |
|
74 |
-
|
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
|
|
|
|
|
78 |
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
|
|
87 |
|
88 |
-
|
89 |
-
fn=procesamiento_y_descarga,
|
90 |
-
inputs=[archivo_pdf, idioma_ocr],
|
91 |
-
outputs=[pdf_vista, pdf_descarga],
|
92 |
-
)
|
93 |
|
94 |
if __name__ == "__main__":
|
95 |
-
|
|
|
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()
|