PDF__OCR / app.py
eberhenriquez94's picture
a
e642214 verified
raw
history blame
2.41 kB
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()