Guía del producto y de la API

Generador de datos de tabla

Abrir el generador

Selecciona una tabla en el lienzo. En la pestaña Datos del Inspector, elige Abrir Generador de datos. Las pestañas de campos, origen y vista previa separan la estructura de la tabla de sus datos.

Columnas y filas de resumen

En Campos, añade columnas y define cada encabezado y campo de datos. Ajusta ancho, formato y apariencia avanzada. Puedes añadir filas de total, subtotal o nota bajo la tabla; la sección Totales explica sus cálculos.

Totales

En una fila de total o subtotal, elige un Cálculo: Suma, Media, Mínimo, Máximo o Contar filas. El resultado se escribe en la Columna de valor y se calcula con todas las filas de esa columna; si la fila no tiene formato propio, usa el de la columna.

JSON
"summaryRows": [
  { "type": "total", "label": "Total general",
    "aggregate": "sum", "targetColumnKey": "total" }
]

Solo cuentan las celdas que llegan como números: se omiten las vacías y un importe enviado como texto («1,250.00») deja el resultado vacío. Un subtotal también abarca todas las filas, no cada página. Si eliges Campo de datos, el cuadro Valor lee desde la raíz de tus datos, no desde la tabla: por ejemplo {{ grandTotal }}.

Origen y JSON de ejemplo

En Origen, elige el array de datos de la tabla y edita el JSON de ejemplo. El campo de columna debe coincidir con una propiedad de los objetos del array. Para mostrar quantity de items, define el campo como quantity. Resuelve cualquier aviso de JSON no válido antes de continuar.

Apariencia predeterminada de tabla

Artículo Cantidad Total
Diagnóstico de averías21.700,00
Módulo de conectividad12.850,00
Calibración en las instalaciones1850,00

Las medidas son los valores predeterminados del producto: encabezado 40px, fila 40px, relleno de celda 10px y borde 1px. La plantilla puede cambiar cada uno.

Un elemento de tabla, de principio a fin

Una tabla se vincula a un array de tus datos y dibuja una fila por elemento. El elemento siguiente es el que se incluye en la plantilla de factura; la llamada inferior proporciona tres filas a la misma tabla.

JSON
{
  "id": "invoice-items",
  "type": "table",
  "placementMode": "flow",
  "binding": "lineItems",
  "layout": { "x": 0, "y": 330, "width": 100, "widthUnit": "percent", "height": 220 },
  "style": {
    "tableHeaderHeight": 36,
    "tableRowHeight": 34,
    "tableRepeatHeader": true,
    "tablePreventRowSplit": true
  },
  "columns": [
    { "key": "name", "label": "Descripción", "valueTemplate": "{{ name }}",
      "align": "left", "widthPercent": 46 },
    { "key": "quantity", "label": "Cantidad", "valueTemplate": "{{ quantity }}",
      "align": "right", "widthPercent": 14 },
    { "key": "unitPrice", "label": "Precio unitario", "valueTemplate": "{{ unitPrice }}",
      "align": "right", "widthPercent": 20,
      "format": { "kind": "currency", "currency": "USD", "decimals": 2 } },
    { "key": "total", "label": "Importe", "valueTemplate": "{{ total }}",
      "align": "right", "widthPercent": 20,
      "format": { "kind": "currency", "currency": "USD", "decimals": 2 } }
  ]
}
cURL
curl -X POST https://api.pdfgine.com/api/v1/render \
  -H "X-PDFgine-Key: $PDFGINE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "templateCode": "invoice",
        "format": "pdf",
        "locale": "es",
        "data": {
          "document": { "title": "Resumen de factura" },
          "referenceNo": "DOC-2026-0042",
          "issueDate": "2026-09-06",
          "currency": "USD",
          "customer": "Northwind Trading Ltd.",
          "lineItems": [
            { "name": "Diagnóstico de averías", "quantity": 2, "unitPrice": 850.00 },
            { "name": "Módulo de conectividad", "quantity": 1, "unitPrice": 2850.00 },
            { "name": "Calibración en las instalaciones", "quantity": 1, "unitPrice": 850.00 }
          ]
        }
      }'

binding indica el array de tus datos, key indica el campo de cada elemento y valueTemplate es lo que se imprime. tableRepeatHeader repite el encabezado en cada página y tablePreventRowSplit evita que una fila se divida en un salto de página.

Aplicar y probar tablas largas

Comprueba el orden de columnas, campos vacíos y resúmenes en Vista previa y aplica los cambios. Prueba después cero, una y muchas filas en la vista previa del documento. Texto largo y alturas de encabezado y fila afectan a la paginación; no te bases solo en ejemplos cortos.

Gráficos e informes →

Elementos dataset

Un elemento dataset renderiza la colección vinculada como una tabla y obtiene sus columnas de los datos, sin que tengas que declararlas. Úsalo cuando la estructura de la colección dependa de los datos enviados, no de la plantilla.

Valor vinculado Qué muestra el documento
[{ "name": "…", "quantity": 2 }] Una columna por campo, en el orden en que aparecen por primera vez. Una fila que omite un campo mantiene igualmente esa columna.
[{ "party": { "name": "…" } }] Los objetos anidados se aplanan en columnas con puntos, como party.name, hasta tres niveles de profundidad. Un array dentro de una fila permanece en una sola celda.
["urgent", "warranty"] Una columna cuyas celdas son los propios valores; el encabezado es el último segmento de la vinculación.
{ "status": "released" } Una sola fila, con una columna por campo del objeto.
[] No se dibuja nada. Un elemento dataset sin vincular tampoco dibuja nada.

Los encabezados de columna son los nombres de los campos. Un dataset no tiene etiquetas propias; usa un elemento de tabla si quieres nombrar las columnas.

Los errores más habituales

  • Una vinculación a un array que no existe en tus datos dibuja una tabla vacía, no un error. Si la tabla está en blanco, compara la vinculación con la clave de tu solicitud.
  • La clave de una columna es una propiedad de los objetos del array. Una sola clave mal escrita vacía una columna mientras el resto de la tabla parece correcto.
  • Los importes y las cantidades deben llegar como números. Una cadena omite el formato y la columna pierde la alineación y el separador de miles.
  • Una tabla larga ocupa varias páginas. Sin tableRepeatHeader, la segunda empieza directamente con filas; sin tablePreventRowSplit, una fila puede quedar dividida.
  • Prueba con cero, una y muchas filas. Una tabla que solo se ha probado con tres filas oculta tanto el caso vacío como los saltos de página.