Skip to content

GRADIO APP #2103

@xmorpher

Description

@xmorpher

GRADIO APP
save it as: app.py ,

import gradio as gr
from markitdown import MarkItDown
import tempfile
import os
import shutil

def convertir_pdf_a_markdown(ruta_archivo):
    # Estos prints te ayudarán a ver en la terminal de Python qué está pasando realmente
    print(f"\n--- INICIO DE CONVERSIÓN ---")
    print(f"1. Ruta recibida de Gradio: {ruta_archivo}")
    
    if ruta_archivo is None:
        print("ERROR: No se recibió ningún archivo.")
        return "Por favor, sube un archivo PDF primero.", None

    if not os.path.exists(ruta_archivo):
        print(f"ERROR: Gradio dijo que el archivo estaba aquí, pero no existe.")
        return "Error interno: El archivo no se encontró en el servidor.", None

    dir_temporal = None
    try:
        # 2. Copiar el archivo a una carpeta temporal segura.
        # Esto evita que Gradio elimine el archivo original mientras markitdown lo lee (es critical para PDFs de 20MB)
        dir_temporal = tempfile.mkdtemp()
        ruta_pdf_segura = os.path.join(dir_temporal, "documento_seguro.pdf")
        
        print(f"2. Copiando archivo a ruta segura ({ruta_pdf_segura})...")
        shutil.copy(ruta_archivo, ruta_pdf_segura)
        
        # 3. Convertir con MarkItDown
        print("3. Iniciando MarkItDown...")
        md_converter = MarkItDown()
        
        print("4. Convirtiendo (puede tardar unos segundos en un PDF de 20MB)...")
        resultado = md_converter.convert(ruta_pdf_segura)
        texto_markdown = resultado.text_content
        
        print(f"5. Conversión terminada. Tamaño del texto: {len(texto_markdown)} caracteres.")
        
        if not texto_markdown.strip():
            print("ADVERTENCIA: El texto está vacío. ¿El PDF es una imagen escaneada?")
            return "El PDF se procesó pero no tiene texto extraíble (podría ser una imagen escaneada).", None

        # 4. Guardar el resultado en un .md para descargar
        archivo_md = tempfile.NamedTemporaryFile(delete=False, suffix=".md", mode='w', encoding='utf-8')
        archivo_md.write(texto_markdown)
        archivo_md.close()
        
        print(f"6. Archivo .md creado en: {archivo_md.name}")
        print("--- FIN EXITOSO ---\n")

        return texto_markdown, archivo_md.name

    except Exception as e:
        print(f"!!! ERROR DURANTE LA CONVERSIÓN !!!")
        print(f"Tipo de error: {type(e).__name__}")
        print(f"Detalle: {str(e)}")
        return f"Ocurrió un error en Python (mira la terminal): {str(e)}", None
        
    finally:
        # Limpiar la carpeta temporal segura
        if dir_temporal and os.path.exists(dir_temporal):
            shutil.rmtree(dir_temporal)

# --- INTERFAZ DE GRADIO ---
with gr.Blocks(title="PDF a Markdown", theme=gr.themes.Soft()) as interfaz:
    gr.Markdown("# 📄 Convertidor de PDF a Markdown")
    
    with gr.Row():
        with gr.Column(scale=1):
            # type="filepath" es vital para no enviar 20MB en formato texto/base64, lo cual causa el error "Too many arguments"
            archivo_input = gr.File(label="1. Sube tu archivo PDF", file_types=[".pdf"], type="filepath")
            boton_convertir = gr.Button("⚡ Convertir a Markdown", variant="primary")

        with gr.Column(scale=2):
            texto_output = gr.Textbox(label="2. Vista previa del Markdown", lines=25, show_copy_button=True)
            archivo_output = gr.File(label="3. Descarga tu archivo .md")

    # LA SOLUCIÓN CLAVE AQUÍ: Poner los inputs DENTRO de una lista explícita [archivo_input]
    # Si no está en una lista, algunas versiones de Gradio se confunden y lanzan "Too many arguments"
    boton_convertir.click(
        fn=convertir_pdf_a_markdown,
        inputs=[archivo_input], 
        outputs=[texto_output, archivo_output]
    )

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions