Spaces:
Sleeping
Sleeping
import gradio as gr | |
import subprocess | |
import logging | |
import tempfile | |
import os | |
# Configurar logging | |
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') | |
def ejecutar_comando(comando, mensaje_exito="", mensaje_error=""): | |
"""Ejecuta un comando de shell y maneja errores.""" | |
try: | |
resultado = subprocess.run(comando, shell=True, check=True, capture_output=True, text=True) | |
if mensaje_exito: | |
logging.info(f"{mensaje_exito}. Salida:\n{resultado.stdout}") | |
return resultado.stdout | |
except subprocess.CalledProcessError as e: | |
error_message = f"{mensaje_error}. Error: {e}\nSalida de error:\n{e.stderr}" | |
logging.error(error_message) | |
raise RuntimeError(error_message) | |
def procesar_pdf_con_ocr(pdf_subido, idioma="spa"): | |
"""Procesa un PDF subido con OCR y devuelve la ruta del archivo procesado.""" | |
if not pdf_subido: | |
raise gr.Error("No se subi贸 ning煤n archivo.") | |
try: | |
input_pdf = pdf_subido.name | |
output_pdf = tempfile.NamedTemporaryFile(delete=False, suffix=".pdf").name | |
ejecutar_comando( | |
f"ocrmypdf -l {idioma} --force-ocr --deskew --output-type pdf {input_pdf} {output_pdf}", | |
mensaje_exito="OCR completado", | |
mensaje_error="Error en OCR" | |
) | |
return output_pdf # Ruta del archivo procesado | |
except Exception as e: | |
logging.error(f"Error al procesar el PDF: {e}") | |
raise gr.Error(f"Ocurri贸 un error al procesar el archivo: {e}") | |
# Interfaz Gradio | |
def interfaz_ocr(): | |
"""Crea la interfaz Gradio para el flujo de OCR.""" | |
with gr.Blocks() as app: | |
gr.Markdown("## Procesador de PDFs con OCR") | |
archivo_pdf = gr.File(label="Sube tu archivo PDF") | |
idioma_ocr = gr.Dropdown(["spa", "eng", "fra", "deu"], label="Idioma OCR", value="spa") | |
boton_procesar = gr.Button("Procesar") | |
salida_descarga = gr.File(label="Descargar PDF Procesado") | |
def procesar_y_descargar(pdf_file, idioma): | |
"""Procesa el PDF subido y lo devuelve para descarga.""" | |
return procesar_pdf_con_ocr(pdf_file, idioma) | |
boton_procesar.click( | |
fn=procesar_y_descargar, | |
inputs=[archivo_pdf, idioma_ocr], | |
outputs=[salida_descarga], | |
) | |
return app | |
if __name__ == "__main__": | |
interfaz_ocr().launch() | |