Informes financieros personalizados para 12.000 clientes: cómo lo resuelve InDesign Server

LS

Laura Sanz

Especialista en Autoedición Editorial

27 de marzo de 2026 · 19 min de lectura

Compartir:
Automatización de informes financieros con InDesign Server

A esta compañía la llamaremos Finvera. Es una gestora de fondos de inversión con sede en Madrid y oficinas en Lisboa, Frankfurt y Ginebra. Cada trimestre —y especialmente al cierre de año fiscal— Finvera está obligada por regulación a enviar a cada uno de sus 12.400 clientes un informe personalizado con la evolución de su cartera, los rendimientos obtenidos, los movimientos registrados y las proyecciones para el próximo periodo.

Esos informes deben llegar antes del día 10 del mes siguiente al cierre, deben estar disponibles en el idioma contratado por cada cliente —español, inglés, alemán o francés— y deben incluir los datos reales e individualizados de cada cartera. No hay dos informes iguales.

Antes de automatizar el proceso, Finvera tenía un equipo de 6 personas dedicadas en exclusiva durante las dos semanas previas al plazo a generar estos informes de forma semimanual usando Word, Excel y Acrobat. Errores, noches sin dormir, y en alguna ocasión, envíos fuera de plazo con las consecuentes reclamaciones de clientes. La solución fue Adobe InDesign Server.

12.400

informes individuales por trimestre

4

idiomas simultáneos

94%

reducción del tiempo de producción

0

reclamaciones por datos erróneos desde la automatización

El reto real: regulación, volumen e idiomas simultáneos

En el sector financiero, la personalización documental no es un capricho de marketing: es una obligación regulatoria. La normativa MiFID II y los requisitos de comunicación periódica de la CNMV obligan a que cada cliente reciba información específica de su cartera, no documentación genérica. Esto significa que no se puede simplemente «rellenar un formulario»: cada informe tiene una estructura variable dependiente del perfil del cliente.

La situación antes de la automatización

  • 6 personas trabajando 12 días seguidos en el cierre trimestral, incluyendo fines de semana
  • Los datos de cartera se copiaban manualmente desde el sistema de custodia a plantillas Word: una por cliente
  • Cuatro plantillas Word diferentes por idioma, sin coherencia visual entre ellas. Los cambios de marca requerían actualizar los 4 documentos por separado
  • Los gráficos de rendimiento se generaban en Excel y se pegaban como imagen: calidad inconsistente, no accesibles, sin datos reales vinculados
  • En el cierre de 2024 se detectaron errores en 214 informes que hubo que reenviar manualmente con nota de disculpa
  • Coste estimado del proceso: 47.000 € por trimestre en horas de personal y revisiones

Estructura típica de un informe Finvera (variable por cliente)

Portada personalizada

Nombre del cliente, número de cuenta, fecha de informe, gestor asignado

Resumen ejecutivo

Valor total de cartera, rentabilidad del periodo, comparativa con benchmark

Composición de cartera

Tabla con posiciones actuales: activo, peso %, valor, rentabilidad desde compra

Evolución gráfica

Gráfico de línea con evolución del valor los últimos 12 meses

Movimientos del periodo

Listado de compras, ventas y cobros de dividendos en el trimestre

Análisis de riesgo

Volatilidad, VaR, perfil de riesgo y comparativa con perfil contratado

Proyección orientativa

Escenario base, pesimista y optimista a 12 meses (según perfil)

Datos fiscales

Retenciones aplicadas, plusvalías realizadas, información para declaración

Arquitectura de la solución

La solución se estructura en cinco capas que se comunican secuencialmente. InDesign Server actúa como el motor de composición en el centro de la arquitectura, recibiendo datos estructurados y devolviendo PDFs de alta calidad listos para distribución.

Sistema de Custodia

Datos de cartera reales

ETL + XML

Un fichero por cliente

InDesign Server

Motor de composición

PDF/A firmado

ES · EN · DE · FR

Portal cliente

+ Envío por email

Requisito regulatorio: PDF/A y firma digital

En el sector financiero, los documentos entregados al cliente deben cumplir el estándar PDF/A-2b (archivo a largo plazo, sin dependencias externas) y, en el caso de Finvera, llevan una firma digital cualificada mediante un certificado de persona jurídica emitido por la entidad. InDesign Server exporta el PDF base y un proceso posterior aplica la firma usando Adobe Acrobat Server antes del envío.

El proceso paso a paso

1

Extracción y normalización de datos: el XML por cliente

Fuente de verdad — cada cliente tiene su propio fichero

El primer día del mes siguiente al cierre del trimestre, el sistema ETL de Finvera extrae los datos del sistema de custodia (Clearstream) y los transforma en un fichero XML individual para cada cliente. Este proceso genera 12.400 archivos XML en aproximadamente 40 minutos.

Cada XML contiene todos los datos del informe de ese cliente, incluyendo el idioma preferido, el nombre del gestor asignado, todas las posiciones de cartera y los metadatos necesarios para la portada. Los valores monetarios se almacenan siempre con punto como separador decimal y sin formato; el formateo regional (comas, puntos, símbolo de moneda) se aplica en InDesign mediante estilos de párrafo específicos por idioma.

<!-- Fragmento del XML individual — cliente FV-00472 -->
<informe_cliente>
  <metadata>
    <id_cliente>FV-00472</id_cliente>
    <nombre>Familia Bernabeú Castelló</nombre>
    <num_cuenta>ES76-0049-1800-6023-1000-4721</num_cuenta>
    <gestor>Ana Morales Ríos</gestor>
    <idioma>es</idioma>
    <trimestre>Q1 2026</trimestre>
    <fecha_informe>2026-04-10</fecha_informe>
    <perfil_riesgo>Moderado</perfil_riesgo>
  </metadata>

  <resumen>
    <valor_cartera>487250.40</valor_cartera>
    <rentabilidad_periodo>3.42</rentabilidad_periodo>
    <rentabilidad_anual>8.17</rentabilidad_anual>
    <benchmark_periodo>2.91</benchmark_periodo>
  </resumen>

  <posiciones>
    <posicion>
      <activo>Fondo Monetario EUR - Clase A</activo>
      <isin>LU0012345678</isin>
      <peso_pct>22.5</peso_pct>
      <valor>109631.34</valor>
      <rentabilidad_desde_compra>4.82</rentabilidad_desde_compra>
      <tipo>Renta Fija</tipo>
    </posicion>
    <!-- ... 18 posiciones más ... -->
  </posiciones>

  <movimientos>
    <operacion tipo="compra" fecha="2026-01-15">
      <activo>iShares MSCI World ETF</activo>
      <importe>25000.00</importe>
    </operacion>
    <!-- ... -->
  </movimientos>
</informe_cliente>

Clave de diseño del XML

El campo <idioma> en el XML determina qué plantilla InDesign se usa. Los textos fijos del informe (encabezados de tabla, pie legal, disclaimers regulatorios) no se incluyen en el XML —viven en la plantilla correspondiente al idioma— y solo los datos variables del cliente viajan en el fichero de datos. Esto simplifica enormemente el mantenimiento de traducciones.

2

Las plantillas maestras: diseño financiero exigente

Diseño — cuatro plantillas, una identidad visual

Se diseñaron cuatro plantillas InDesign (una por idioma) de 20-28 páginas. Aunque el número de páginas varía según el tamaño de la cartera del cliente, todas comparten los mismos estilos maestros. Las plantillas incluyen marcos de texto variables etiquetados para datos de cliente, marcos de tabla vinculados que se expanden automáticamente según el número de posiciones de cartera, y marcadores de posición para gráficos generados dinámicamente.

Estructura de páginas de la plantilla

Pág. 1PortadaNombre cliente, gestor, trimestre, valor cartera resumido, fecha
Pág. 2Resumen ejecutivoRendimiento, valor total, benchmark, tabla de resumen, gráfico sparkline
Págs. 3–NComposición de carteraTabla dinámica: tantas filas como posiciones tenga el cliente
Pág. N+1Gráfico de evoluciónImagen PNG del gráfico generada por el motor de charts
Pág. N+2Movimientos del trimestreTabla dinámica de operaciones del periodo
Pág. N+3Análisis de riesgoDatos de volatilidad, VaR, perfil de riesgo actual vs. contratado
Última pág.Datos fiscales + pie legalRetenciones, plusvalías. Textos legales fijos en el idioma de la plantilla

Tablas de longitud variable

InDesign Server recorre el nodo <posiciones> y añade filas a la tabla usando el estilo de celda «Fila de dato». Si la tabla supera la caja contenedora, el script crea automáticamente una nueva página clonada de la página maestra antes de continuar.

Gráficos dinámicos

Los gráficos de evolución de cartera se generan como imágenes PNG antes de llamar a InDesign Server, usando una librería de charting en Node.js (Chart.js en canvas headless). InDesign Server los recibe como rutas de imagen y los vincula al marco gráfico de la plantilla.

3

Infraestructura: InDesign Server en modo clúster

Escalabilidad — procesar 12.400 PDFs en una ventana de tiempo acotada

Generar 12.400 informes en un tiempo razonable requiere paralelización. Finvera despliega InDesign Server en cuatro nodos Windows Server de 32 GB de RAM cada uno. Un orquestador central (un proceso Python) reparte los XMLs pendientes entre los cuatro nodos usando una cola de trabajo. Cada nodo procesa aproximadamente 50 informes por hora, lo que permite completar toda la generación en menos de 7 horas ejecutándose de madrugada del día 1.

Configuración del clúster

Nodos InDesign Server4 instancias en paralelo
Sistema operativoWindows Server 2022 (64 bit)
RAM por nodo32 GB RAM, 8 vCPU
OrquestadorPython 3.12 con cola de workers
Comunicación con IDSAPI SOAP / ExtendScript .jsx
Almacenamiento compartidoNAS montado por todos los nodos
Tiempo total (12.400 docs)< 7 horas en ventana nocturna
Licencia InDesign ServerAdobe IDS 19 (4 licencias concurrentes)

¿Por qué no usar un único nodo más potente?

InDesign Server es monohilo por instancia: una instancia procesa un documento a la vez. Añadir más RAM o CPU a un solo nodo no mejora el rendimiento. La única manera de escalar es lanzar múltiples instancias en paralelo. Por eso el modelo de clúster es el único enfoque viable para volúmenes altos.

4

El script de composición personalizada

Automatización — del XML al PDF en un único proceso

Cada nodo InDesign Server ejecuta un script ExtendScript al recibir un trabajo de la cola. El script recibe la ruta del XML del cliente, determina el idioma y selecciona la plantilla correspondiente, fusiona los datos, gestiona las páginas dinámicas para carteras grandes y exporta el PDF en el perfil adecuado.

// Script de composición por cliente — simplificado
function generarInformeCliente(xmlPath) {
  var xmlData = parseClienteXML(xmlPath);
  var lang    = xmlData.metadata.idioma;  // 'es' | 'en' | 'de' | 'fr'
  var clientId = xmlData.metadata.id_cliente;

  // 1. Abrir la plantilla correspondiente al idioma
  var plantillaPath = '/plantillas/informe_' + lang + '.indd';
  var doc = app.open(File(plantillaPath));

  // 2. Rellenar marcos de texto variables (portada, encabezados)
  setTextFrame(doc, 'tf_nombre_cliente', xmlData.metadata.nombre);
  setTextFrame(doc, 'tf_num_cuenta',     xmlData.metadata.num_cuenta);
  setTextFrame(doc, 'tf_gestor',         xmlData.metadata.gestor);
  setTextFrame(doc, 'tf_trimestre',      xmlData.metadata.trimestre);
  setTextFrame(doc, 'tf_valor_cartera',  formatMoney(xmlData.resumen.valor_cartera, lang));
  setTextFrame(doc, 'tf_rentabilidad',   formatPct(xmlData.resumen.rentabilidad_periodo, lang));

  // 3. Construir tabla de posiciones (longitud variable)
  buildPortfolioTable(doc, xmlData.posiciones, lang);

  // 4. Insertar gráfico de evolución pregenerado
  var chartPath = '/charts_generados/' + clientId + '_evolucion.png';
  placeImage(doc, 'img_evolucion', File(chartPath));

  // 5. Construir tabla de movimientos del trimestre
  buildMovimientosTable(doc, xmlData.movimientos, lang);

  // 6. Datos fiscales
  setTextFrame(doc, 'tf_retenciones', formatMoney(xmlData.fiscal.retenciones, lang));
  setTextFrame(doc, 'tf_plusvalias',  formatMoney(xmlData.fiscal.plusvalias,  lang));

  // 7. Verificar que no hay overset text en ningún marco
  checkOverset(doc, clientId);

  // 8. Exportar PDF/A-2b
  var pdfPreset = app.pdfExportPresets.item('Finvera_PDFA2b');
  var outputPath = '/output/' + clientId + '_informe_' + lang + '.pdf';
  doc.exportFile(ExportFormat.PDF_TYPE, File(outputPath), false, pdfPreset);

  doc.close(SaveOptions.NO);
  markJobDone(clientId);
}

function buildPortfolioTable(doc, posiciones, lang) {
  var tabla = doc.pages[2].textFrames.itemByName('tabla_posiciones');
  for (var i = 0; i < posiciones.length; i++) {
    var pos = posiciones[i];
    // Si la tabla supera la página, añadir nueva página clonada
    if (tabla.overflows) {
      addPageFromMaster(doc, 'A-Cartera');
      tabla = doc.pages[doc.pages.length - 1]
                 .textFrames.itemByName('tabla_posiciones_cont');
    }
    appendTableRow(tabla, [
      pos.activo, pos.isin, pos.tipo,
      formatPct(pos.peso_pct, lang),
      formatMoney(pos.valor, lang),
      formatPct(pos.rentabilidad_desde_compra, lang)
    ]);
  }
}

Gestión de errores por cliente

Si el script detecta un error en un cliente concreto (datos faltantes, imagen de gráfico no encontrada, overset irresolvable), no detiene el proceso global. Registra el error en un fichero de log con el ID del cliente y el tipo de fallo, y continúa con el siguiente trabajo de la cola. Al terminar, el orquestador genera un informe de incidencias que se envía al equipo editorial para revisión manual únicamente de los casos con error.

5

Firma digital y cumplimiento PDF/A

Regulación — el paso que muchos proyectos olvidan

Una vez generados los PDFs por InDesign Server, un proceso posterior ejecuta Adobe Acrobat Server para aplicar la firma digital cualificada de Finvera sobre cada documento. La firma se aplica por lotes mediante la API de Acrobat Server y valida contra el certificado de la entidad almacenado en un HSM (Hardware Security Module) corporativo.

Fase 1

InDesign Server genera el PDF base con perfil de color Finvera y estructura PDF/A-2b sin firma

Fase 2

Acrobat Server aplica la firma digital cualificada sobre el PDF usando el certificado del HSM corporativo

Fase 3

Validación automática: se verifica que la firma sea válida y que el documento supere la conformidad PDF/A-2b

Fase 4

El PDF firmado se archiva en el repositorio documental regulatorio y se copia al portal del cliente

Fase 5

Notificación automática al cliente: email con enlace seguro al portal o adjunto directo según preferencia

6

Distribución multicanal y trazabilidad

Entrega — cada informe al canal correcto, con confirmación de recepción

El proceso de distribución respeta las preferencias de cada cliente registradas en el CRM: descarga desde portal web, email con PDF adjunto, o en el caso de clientes institucionales, entrega directa en su plataforma de documentos mediante SFTP. El sistema registra la entrega de cada documento y genera la evidencia necesaria para el cumplimiento regulatorio.

Portal web cliente

  • Área privada con historial de informes
  • Descarga en cualquier momento
  • Notificación push y email de aviso
  • 68% de los clientes

Email con adjunto

  • PDF adjunto directo al correo
  • Para carteras de hasta 5 posiciones
  • Acuse de lectura registrado
  • 24% de los clientes

SFTP / API institucional

  • Clientes family office y bancas privadas
  • Ingesta automática en su DMS
  • Confirmación por webhook
  • 8% de los clientes (alto patrimonio)

Línea de tiempo del cierre trimestral

Día 1 del mes (00:00h)

ETL extrae datos de custodia y genera 12.400 ficheros XML individuales. Duración: ~40 minutos.

Día 1 (01:00h)

Motor de charting Node.js genera los gráficos PNG de evolución de cartera para cada cliente. Duración: ~90 minutos.

Día 1 (03:00h)

Los 4 nodos InDesign Server arrancan y procesan la cola de XMLs. Ritmo: ~200 PDFs/hora en total. Duración: ~7 horas.

Día 1 (10:00h)

Acrobat Server aplica firma digital a los PDFs generados. Validación de conformidad PDF/A-2b. Duración: ~2 horas.

Día 1 (12:00h)

El equipo editorial recibe el informe de incidencias. En el último trimestre: 3 clientes con dato faltante, revisión manual en <30 minutos.

Día 2 (08:00h)

Distribución activada: notificaciones en portal web, emails a clientes y SFTP a clientes institucionales. 12.400 documentos entregados.

Día 10 (límite regulatorio)

Fecha límite de obligación regulatoria MiFID II. Finvera entrega con 8 días de antelación.

Resultados al año de implantación

Reducción de tiempos y recursos

Personas dedicadas al cierre

6 personas × 12 días1 técnico supervisando

Tiempo de producción total

10-12 días1 día (proceso nocturno)

Coste por cierre trimestral

~€47.000~€2.800 (infraestructura)

Errores detectados por trimestre

200+ incidencias2-4 casos aislados

Impacto en negocio y regulación

Ahorro anual estimado~€176.800 / año
Informes entregados con 8 días de antelación100%
Satisfacción de cliente (NPS)+34 puntos vs. año anterior
Reclamaciones por datos incorrectos0 en 4 trimestres
Consistencia visual entre idiomas100%
ROI del proyecto (primer año)> 800%

Testimonio de la directora de Operaciones de Finvera

«Antes del proyecto, los cierres trimestrales eran una pesadilla para el equipo. La gente trabajaba los fines de semana, había errores que llegaban al cliente y las personas más talentosas del departamento pasaban dos semanas haciendo copy-paste de Excel. Ahora ese proceso no existe. El sistema trabaja de madrugada y a las 8 de la mañana del día siguiente tenemos 12.400 informes listos, firmados y distribuidos. Fue la inversión más inteligente que hemos hecho en los últimos cinco años.»

— Elena Vidal, Directora de Operaciones, Finvera

Decisiones clave y errores que conviene evitar

Separar completamente datos variables de textos fijos

Los disclaimers legales, los encabezados de tabla y los textos de contexto regulatorio son fijos por idioma y viven en la plantilla InDesign, no en el XML. Solo los datos del cliente viajan en el fichero de datos. Esto reduce el tamaño de los XMLs a la mitad y simplifica enormemente el mantenimiento de los textos legales cuando cambian por actualización normativa.

Generar los gráficos antes de llamar a InDesign Server

InDesign Server no es un motor de gráficos: es un motor de composición. No intentes generar los gráficos dentro del script de InDesign; es frágil y lento. Genera las imágenes PNG en un proceso independiente (Node.js, Python con matplotlib, etc.) y pásalas como rutas de archivo. InDesign Server solo necesita colocarlas en el marco correcto.

No subestimes el formateo numérico por idioma

Un error frecuente es almacenar los valores monetarios con el formato del idioma de destino ya aplicado en el XML. Cuando el script necesita hacer operaciones matemáticas (calcular totales, porcentajes de cambio), los valores formateados con comas y puntos dan resultados incorrectos. Almacena siempre valores numéricos puros y aplica el formateo regional dentro del script de InDesign Server, justo antes de escribirlos en el marco de texto.

Las páginas dinámicas requieren pruebas con carteras extremas

Prueba siempre el script con los clientes que tienen más posiciones de cartera (en Finvera, un family office con 87 posiciones). El manejo de tablas que desbordan varias páginas es el punto de fallo más común. Define un límite máximo de filas por página y testea exhaustivamente el clone de páginas maestras antes de poner en producción.

Implementa un dashboard de progreso en tiempo real

El orquestador de Finvera expone una interfaz web sencilla donde el técnico de guardia puede ver en tiempo real el porcentaje de informes completados, los errores acumulados y el tiempo estimado de finalización. Esto evita que el proceso sea una caja negra y permite detectar y resolver problemas a las 3 de la madrugada sin entrar por SSH al servidor.

¿Este enfoque es viable si mi empresa es más pequeña?

La arquitectura descrita para Finvera es la versión «enterprise» con clúster de cuatro nodos. Pero InDesign Server escala perfectamente hacia abajo. Una aseguradora que necesita generar 800 pólizas personalizadas al mes, un despacho de abogados que emite 300 informes de due diligence trimestralmente, o una gestora boutique con 400 clientes pueden operar perfectamente con un único nodo InDesign Server.

Un solo nodo IDS

Hasta 500 docs/mes

Windows Server 2022, 16 GB RAM. Proceso nocturno completado en 2-4 horas. Licencia: ~€500/mes.

Dos nodos IDS

500 – 5.000 docs/mes

Procesamiento en paralelo. Orquestador sencillo en Python. Completado en ventana de 6-8 horas. Licencia: ~€1.000/mes.

Clúster 4+ nodos

+5.000 docs/mes

Arquitectura de Finvera. Orquestador con cola de prioridades, dashboard de monitorización. Licencia: ~€2.000+/mes.

Cuando la personalización masiva es un requisito, InDesign Server es la respuesta

El caso de Finvera demuestra que la generación masiva de documentos PDF personalizados en múltiples idiomas no es solo un problema tecnológico: es un problema de arquitectura de datos y diseño de plantillas. InDesign Server es el motor de renderizado más potente del mercado para documentos con alta exigencia visual, pero su efectividad depende directamente de la calidad del XML de entrada y del rigor con el que se diseñen las plantillas.

La inversión inicial en la correcta estructuración de datos, el diseño de plantillas robustas y la escritura de scripts defensivos —que manejan errores sin romper el proceso global— es lo que separa un proyecto de automatización documental exitoso de uno que abandona tras el primer cierre.

Consultar sobre implementación →

Artículos relacionados