Cualquier diseñador editorial que haya tenido que maquetar un catálogo industrial de 800 referencias, una tarifa de precios anual o un lote de 400 cartas para un juego de mesa conoce el sufrimiento del «copiar y pegar» manual: semanas enteras arrastrando fotografías, revisando referencias SKU y rezando para que el departamento comercial no cambie un 5% los precios veinticuatro horas antes de entrar en máquina.
Aunque Adobe InDesign incluye de serie la herramienta Combinación de datos (Data Merge), en la práctica la mayoría de los estudios abandonan su uso porque el archivo CSV exportado desde Excel falla al cargar tildes, rompe las rutas de las imágenes o descuadra los registros cuando una descripción contiene un salto de línea. En esta guía técnica veremos cómo resolver definitivamente estas limitaciones construyendo un preprocesador en Python con Pandas que entrega a InDesign un flujo de datos blindado, acompañado de estilos GREP y generación automática de códigos QR.
1. Por qué falla el CSV de Excel en InDesign (y cómo lo repara Python)
El motor de Data Merge de InDesign fue programado bajo especificaciones muy estrictas que chocan frontalmente con el comportamiento por defecto de Microsoft Excel en español:
- El conflicto del delimitador: En configuraciones regionales europeas, Excel exporta los archivos CSV separados por punto y coma (
;) porque la coma se reserva para los decimales. Sin embargo, InDesign espera comas (,) o tabuladores (\t). - Corrupción de caracteres Unicode: Si entregas un archivo en UTF-8 sin cabecera BOM, InDesign interpreta erróneamente la codificación en Windows/macOS, transformando
Diseño 15,90 €enDiseño 15,90 €. La codificación infalible es UTF-16 Little Endian (UTF-16) separado por tabuladores (.txt). - El prefijo de imagen (
@): Para que InDesign vincule fotos o PDFs vectoriales automáticamente, el nombre de la columna debe empezar por arroba (ej.@foto_producto). En Excel, escribir una arroba al principio activa un error de fórmula. - Saltos de línea internos: Si una celda de Excel tiene dos párrafos separados con Alt + Enter, InDesign corta la fila a la mitad y arruina el resto del catálogo.
catalogo.xlsx limpio para que el cliente edite precios cómodamente, y ejecuta un script de Python de 30 líneas que valide la existencia física de cada fotografía en el disco duro y exporte un archivo indesign_ready.txt en formato UTF-16 tabulado.
2. Script de Python (Pandas) para Preparar y Auditar el Origen de Datos
El siguiente script lee el Excel comercial, formatea precios con dos decimales exactos, limpia saltos de línea reemplazándolos por el token ||BR||, verifica si falta alguna foto de producto en la carpeta de vínculos (asignando una imagen comodín de «Sin Foto» para que InDesign no arroje errores de vínculo roto) y exporta el fichero en UTF-16:
import os
import pandas as pd
def preparar_datos_indesign(ruta_excel, carpeta_imagenes, salida_txt):
# 1. Cargar Excel comercial
df = pd.read_excel(ruta_excel, dtype={'SKU': str})
# 2. Limpiar saltos de línea dentro de descripciones
for col in df.select_dtypes(include='object').columns:
df[col] = (
df[col]
.fillna('')
.astype(str)
.str.replace(r'\r\n|\r|\n', ' ||BR|| ', regex=True)
.str.strip()
)
# 3. Formatear precio (ej. 124.5 -> "124,50 €")
df['PRECIO_FMT'] = df['PRECIO'].apply(
lambda x: f"{float(x):,.2f} €".replace(",", "X").replace(".", ",").replace("X", ".")
)
# 4. Construir ruta absoluta para @imagen y auditar existencia en disco
img_fallback = os.path.abspath(os.path.join(carpeta_imagenes, "placeholder_cmyk.tif"))
rutas_validadas = []
faltantes = []
for sku in df['SKU']:
ruta_foto = os.path.abspath(os.path.join(carpeta_imagenes, f"{sku}.tif"))
if os.path.exists(ruta_foto):
rutas_validadas.append(ruta_foto)
else:
faltantes.append(sku)
rutas_validadas.append(img_fallback)
# Columna con prefijo '@' para InDesign Data Merge
df['@foto_producto'] = rutas_validadas
# 5. Exportar en UTF-16 separado por tabuladores (100% compatible con InDesign)
df.to_csv(salida_txt, sep='\t', index=False, encoding='utf-16')
print(f"✔ Archivo generado: {salida_txt} ({len(df)} referencias)")
if faltantes:
print(f"⚠ Atención: {len(faltantes)} SKUs sin foto propia: {faltantes[:10]}")
if __name__ == "__main__":
preparar_datos_indesign("tarifa_2026.xlsx", "./links_cmyk", "indesign_ready.txt")
3. Generación Masiva de Códigos QR y EAN-13 Vectoriales con Python
Aunque InDesign puede generar códigos QR nativos usando la columna #qrcode, su motor interno ofrece un control limitado sobre el grosor del módulo o la incrustación de logotipos, y no genera códigos de barras comerciales EAN-13. Con las librerías segno o python-barcode podemos renderizar cientos de códigos en formato vectorial EPS o PDF en negro 100% K puro (evitando el peligroso negro enriquecido en 4 tintas que arruina la lectura del láser en supermercados):
import segno
import os
def generar_qrs_vectoriales(df, carpeta_qrs):
os.makedirs(carpeta_qrs, exist_ok=True)
rutas_qr = []
for _, fila in df.iterrows():
sku = fila['SKU']
url_ficha = f"https://tudominio.com/p/{sku}"
ruta_eps = os.path.abspath(os.path.join(carpeta_qrs, f"qr_{sku}.eps"))
# Crear QR con nivel de corrección de errores 'M' y salida vectorial EPS
qr = segno.make(url_ficha, error='m')
qr.save(ruta_eps, scale=4, border=1, dark='black')
rutas_qr.append(ruta_eps)
df['@qr_vector'] = rutas_qr
return df
4. Comparativa de Tecnologías para Automatización de Catálogos
Según la complejidad de la retícula editorial (si todos los productos ocupan el mismo módulo o si hay tablas dinámicas de distinto tamaño), conviene elegir la arquitectura adecuada:
| Solución Técnica | Coste Adicional | Caso de Uso Ideal | Limitación Principal |
|---|---|---|---|
| Python + InDesign Data Merge | 0 € (Incluido en CC) | Catálogos de rejilla modular (4, 6, 12 productos por página), mazos de cartas, etiquetas y carnets. | Todos los módulos de una misma plantilla tienen dimensiones fijas. |
| InDesign XML + XSLT + Estilos | 0 € (Incluido en CC) | Listados continuos de texto fluido, diccionarios, guías telefónicas y tarifas técnicas densas. | Curva de aprendizaje técnica elevada para maquetar tablas complejas. |
| Scripts ExtendScript / UXP (JS) | 0 € (Desarrollo propio) | Automatización posfusión: eliminar marcos vacíos, colorear celdas según stock o exportar pliegos. | Requiere conocimientos de programación sobre el DOM de InDesign. |
| Plugins Comerciales (EasyCatalog) | ~1.200 € / licencia | Catálogos de ferretería/repuestos con miles de tablas de longitud variable y sincronización bidireccional. | Alto coste por puesto de trabajo en el estudio. |
5. Trucos Avanzados de Maquetación: Estilos GREP y Limpieza Posfusión
Una vez importado el archivo indesign_ready.txt desde el panel Ventana > Utilidades > Combinación de datos en modo Varios registros por página, aplicamos tres automatismos dentro del Estilo de Párrafo de InDesign para que el acabado tipográfico sea indistinguible de un diseño artesanal:
-
Decimales y Símbolo de Euro en Superíndice Automático (GREP Style): Dentro de las opciones del estilo de párrafo del precio, abre la pestaña Estilos GREP, selecciona un estilo de carácter con tamaño reducido al 65% y desplazamiento vertical superior, y aplica la expresión regular
,\d{2}\s?€. Automáticamente,49,95 €elevará el,95 €sin tocar un solo carácter a mano. -
Conversión de Saltos de Línea (
||BR||): En el documento fusionado final, abre Buscar/Cambiar (Ctrl+F), busca el texto||BR||y cámbialo por^n(salto de línea forzado que mantiene el mismo estilo de párrafo). - Ocultación de Campos Vacíos: Activa siempre en las Opciones de colocación de contenido del panel Data Merge la casilla «Quitar líneas en blanco para campos vacíos». Si un producto no tiene subtítulo de oferta, el texto inferior subirá limpiamente sin dejar huecos antiestéticos.
6. Preguntas Frecuentes sobre Automatización con InDesign y Python
¿Por qué InDesign Data Merge no reconoce la columna de imágenes @imagen?
Microsoft Excel interpreta el símbolo @ al inicio de una celda como una función reservada y bloquea su escritura. Si trabajas en Excel, debes escribir '@imagen (con un apóstrofe simple delante) o bien generar el fichero directamente desde Python con Pandas como hemos visto en el bloque de código superior.
¿Qué codificación de archivo necesita InDesign para no romper tildes ni símbolos de euro?
Adobe InDesign exige que el archivo de origen de datos esté codificado en UTF-16 (concretamente UTF-16 Little Endian con BOM). En Pandas basta con especificar encoding='utf-16' y sep='\t' al invocar to_csv().
¿Cómo evitar que el documento combinado final pese gigabytes y vaya lento?
Data Merge no incrusta las imágenes, sino que crea vínculos externos hacia tu carpeta de imágenes. Asegúrate de que las imágenes estén previamente optimizadas a 300 ppp al tamaño real de caja en CMYK (consulta nuestra guía de automatización de imágenes con Python) en lugar de vincular fotos en bruto de 45 Megapíxeles.