File size: 3,871 Bytes
1b10823
30cca7c
 
1b10823
30cca7c
 
af608ef
1b10823
d473fc1
30cca7c
d473fc1
30cca7c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7182873
d473fc1
 
b5e6996
30cca7c
 
 
 
 
 
 
 
 
 
b5e6996
30cca7c
 
 
 
 
 
 
7182873
 
 
 
30cca7c
7182873
 
 
 
 
 
b5e6996
7182873
 
 
 
b5e6996
7182873
 
b5e6996
7182873
 
 
 
30cca7c
 
 
 
b5e6996
 
30cca7c
7182873
30cca7c
 
b5e6996
 
30cca7c
 
 
b5e6996
30cca7c
 
 
b5e6996
 
30cca7c
 
 
 
 
 
b5e6996
 
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import gradio as gr
import subprocess
import logging
from PyPDF2 import PdfReader
import tempfile
import os
import shlex

# Configuraci贸n de logs
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")

def ejecutar_comando(comando):
    """Ejecuta un comando de shell y maneja errores."""
    try:
        resultado = subprocess.run(comando, shell=True, check=True, capture_output=True, text=True)
        logger.info(f"Comando ejecutado: {comando}\nSalida:\n{resultado.stdout}")
        return resultado.stdout
    except subprocess.CalledProcessError as e:
        error_message = f"Error al ejecutar el comando: {comando}\nError: {e}\nSalida de error:\n{e.stderr}"
        logger.error(error_message)
        raise RuntimeError(error_message)

def crear_pdf_con_texto_incrustado(pdf_original, archivo_salida, idioma="spa"):
    """Procesa un PDF con OCR usando OCRmyPDF."""
    try:
        comando = f"ocrmypdf -l {idioma} --force-ocr --deskew --output-type pdf {shlex.quote(pdf_original)} {shlex.quote(archivo_salida)}"
        ejecutar_comando(comando)
    except RuntimeError as e:
        raise gr.Error(f"Error al procesar el archivo con OCR: {e}")

def leer_pdf(pdf_path):
    """Extrae texto de un archivo PDF."""
    try:
        reader = PdfReader(pdf_path)
        texto = ""
        for pagina in reader.pages:
            texto += pagina.extract_text() + "\n"
        return texto.strip() or "No se pudo extraer texto del PDF."
    except Exception as e:
        logger.error(f"Error al leer el PDF: {e}")
        return f"Error al leer el PDF: {e}"

def flujo_principal(pdf_file, idioma="spa"):
    """Procesa un PDF subido, realiza OCR y extrae texto."""
    if not pdf_file:
        raise gr.Error("No se subi贸 ning煤n archivo.")

    # Crear archivos temporales para el procesamiento
    with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as temp_input:
        temp_input.write(pdf_file.read())
        input_pdf = temp_input.name

    with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as temp_output:
        output_pdf = temp_output.name

    texto_original = leer_pdf(input_pdf)

    try:
        # Procesar con OCR
        crear_pdf_con_texto_incrustado(input_pdf, output_pdf, idioma)
        texto_ocr = leer_pdf(output_pdf)
        return gr.File(input_pdf, label="PDF Original"), texto_original, gr.File(output_pdf, label="PDF con OCR"), texto_ocr
    except gr.Error as e:
        logger.error("Error durante el procesamiento del PDF.")
        raise e
    finally:
        # Limpiar archivos temporales
        if os.path.exists(input_pdf):
            os.remove(input_pdf)
        if os.path.exists(output_pdf):
            os.remove(output_pdf)

# Interfaz Gradio
with gr.Blocks() as interfaz:
    gr.Markdown("## Procesador OCR para PDFs")
    
    # Carga de archivo y selecci贸n de idioma
    with gr.Row():
        archivo_pdf = gr.File(label="Sube tu archivo PDF", file_types=[".pdf"])
        idioma_ocr = gr.Dropdown(["spa", "eng", "fra", "deu"], label="Idioma OCR", value="spa")
        boton_procesar = gr.Button("Procesar OCR")
    
    # Resultados del procesamiento
    with gr.Row():
        texto_original = gr.Textbox(label="Texto Original", lines=10, interactive=False)
        texto_ocr = gr.Textbox(label="Texto con OCR", lines=10, interactive=False)
    
    with gr.Row():
        pdf_original_vista = gr.File(label="Descargar PDF Original", interactive=False)
        pdf_ocr_vista = gr.File(label="Descargar PDF con OCR", interactive=False)
    
    # Conectar la l贸gica con la interfaz
    boton_procesar.click(
        fn=flujo_principal,
        inputs=[archivo_pdf, idioma_ocr],
        outputs=[pdf_original_vista, texto_original, pdf_ocr_vista, texto_ocr]
    )

if __name__ == "__main__":
    interfaz.launch()