File size: 3,824 Bytes
4466e02
 
 
 
 
 
 
5b8b49d
4466e02
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b81ef43
5b8b49d
4466e02
b81ef43
4466e02
 
 
 
 
 
 
 
 
5b8b49d
4466e02
 
 
 
 
 
 
 
5b8b49d
4466e02
 
 
 
 
5b8b49d
4466e02
 
 
 
 
 
 
 
 
5b8b49d
 
4466e02
 
 
 
 
 
 
 
 
b81ef43
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
from gradio_pdf import PDF  # Importamos el componente PDF espec铆fico de gradio_pdf

# 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:
            text = pagina.extract_text()
            if text:
                texto += 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.")

    # Utilizar la ruta proporcionada por el archivo subido
    input_pdf = pdf_file

    # Crear un archivo temporal para la salida del OCR
    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 pdf_file, texto_original, output_pdf, 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(output_pdf):
            os.remove(output_pdf)

# Interfaz Gradio usando el componente PDF
with gr.Blocks() as interfaz:
    gr.Markdown("## Procesador OCR para PDFs en Hugging Face")

    # Carga de archivo y selecci贸n de idioma
    with gr.Row():
        archivo_pdf = PDF(label="Sube tu archivo PDF")  # Usamos PDF en lugar de gr.File
        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 = PDF(label="Vista del PDF Original", interactive=False)
        pdf_ocr_vista = PDF(label="Vista del 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()