import gradio as gr import pandas as pd import requests import base64 import os from weasyprint import HTML def obtener_url_hd(url): """ Transforma la URL para saltarse la compresión de 400x0 píxeles y obtener el archivo maestro original directo de Amazon S3. """ if "filters:format(webp)/" in str(url): raw_s3 = str(url).split("filters:format(webp)/")[1] if not raw_s3.startswith("http"): raw_s3 = "https://" + raw_s3 return raw_s3 # Alternativa por si el formato cambia: pedir tamaño grande de 1200px return str(url).replace("400x0", "1200x0") def generar_catalogo(file_obj): if file_obj is None: return "Por favor, sube un archivo CSV válido.", None try: # 1. Leer el archivo CSV cargado por el usuario df = pd.read_csv(file_obj.name) # Verificar que tenga las columnas necesarias columnas_requeridas = ['name', 'price', 'image_url'] for col in columnas_requeridas: if col not in df.columns: return f"Falta la columna obligatoria '{col}' en tu archivo CSV.", None # 2. Construir la cabecera del HTML con diseño elegante estilo joyería html_content = """

Catálogo de Joyería Exclusiva

Generado Automáticamente en Alta Definición (Ultra-HD)

""" # 3. Descargar imágenes limpiando la URL para forzar ALTA DEFINICIÓN for _, row in df.iterrows(): name = str(row['name']) price = str(row['price']) url_original = str(row['image_url']) # ¡AQUÍ SE PRODUCE LA MAGIA HD! Transformamos la URL comprimida a la URL maestra url_hd = obtener_url_hd(url_original) clean_name = name.replace("Unisex6mm", "").replace("Unisex4mm", "").replace("Male10mm", "").replace("Male6MM", "").replace("Male11mm", "").replace("Male8MM", "").strip() gender_badge = "Unisex" if "Unisex" in name else "Hombre" if "Male" in name else "Exclusivo" img_src = url_hd # Fallback por si acaso try: headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'} r = requests.get(url_hd, headers=headers, timeout=20) if r.status_code == 200: encoded_img = base64.b64encode(r.content).decode('utf-8') # Identificar formato real del archivo HD mime_type = "image/jpeg" if "png" in url_hd.lower(): mime_type = "image/png" elif "webp" in url_hd.lower(): mime_type = "image/webp" img_src = f"data:{mime_type};base64,{encoded_img}" except Exception as e: print(f"No se pudo incrustar directamente la imagen HD {url_hd}: {e}") img_src = url_hd # Agregar tarjeta de producto al catálogo HTML con el botón de compra corregido html_content += f"""
{gender_badge}
{clean_name}
{price}
""" html_content += """
""" # 4. Compilar el HTML a PDF usando WeasyPrint con las imágenes en alta fidelidad output_pdf = "catalogo_ultra_hd.pdf" HTML(string=html_content).write_pdf(output_pdf) return "¡Catálogo procesado con éxito! Se ha generado el catálogo con los botones de compra directo.", output_pdf except Exception as e: return f"Ocurrió un error inesperado al procesar el archivo: {str(e)}", None # 5. Diseñar la interfaz gráfica en Gradio with gr.Blocks(theme=gr.themes.Soft()) as demo: gr.Markdown("# 💎 Generador de Catálogos Joyeros en Ultra-HD (Versión Enlaces Directos)") gr.Markdown("Esta versión genera el catálogo eliminando el atributo que provocaba el mensaje de advertencia del lector de PDF.") with gr.Row(): with gr.Column(): archivo_input = gr.File(label="Sube tu archivo CSV (products.csv)", file_types=[".csv"]) btn_procesar = gr.Button("✨ Generar PDF con Botón de Compra Directo", variant="primary") with gr.Column(): estado_output = gr.Textbox(label="Estado del Proceso", placeholder="Esperando archivo...") archivo_output = gr.File(label="Descarga tu PDF Aquí") btn_procesar.click( fn=generar_catalogo, inputs=archivo_input, outputs=[estado_output, archivo_output] ) if __name__ == "__main__": demo.launch()