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()
GRADIO APP
save it as: app.py ,