File size: 2,411 Bytes
eec7f0a
 
 
 
e642214
eec7f0a
e642214
 
eec7f0a
e642214
eec7f0a
 
 
e642214
 
eec7f0a
 
e642214
 
eec7f0a
 
e642214
 
 
eec7f0a
 
 
e642214
 
eec7f0a
e642214
 
 
 
 
eec7f0a
e642214
eec7f0a
e642214
 
eec7f0a
 
e642214
 
 
 
eec7f0a
e642214
eec7f0a
e642214
 
 
eec7f0a
e642214
 
 
45b9d3b
e642214
 
 
 
 
45b9d3b
e642214
eec7f0a
 
e642214
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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()