Rellenar formulario PDF
Rellenar formulario es una API que mete datos en una plantilla PDF que ya tiene campos de formulario (esos PDF donde puedes hacer clic y escribir). Perfecto para generar contratos, solicitudes o fichas rellenas desde n8n, Make o Zapier, sin montar servidores.
Cómo funciona
Necesitas una plantilla PDF con campos de formulario ya creados (no vale un PDF normal sin campos; los formularios rellenables se hacen con Adobe Acrobat u otro editor de formularios). Le mandas la plantilla y un objeto con los valores, y te devuelve el PDF relleno.
¿No sabes qué campos tiene tu plantilla? Llama a la API SIN el objeto de datos y te devuelve la lista de campos disponibles (su nombre y tipo) en vez de rellenar nada: así puedes descubrirlos antes de automatizar. Esto también gasta 1 crédito, igual que rellenar.
Lo único que necesitas
- Tu API key. La creas en tu panel con "+ Crear llave". Se muestra una sola vez, así que cópiala y guárdala.
- En tu plataforma de automatización, un paso de tipo "HTTP Request" / "Hacer una petición HTTP" (lo tienen n8n, Make, Zapier, Pipedream…).
- Tu plantilla PDF con campos de formulario.
Paso 1: descubre los campos de tu plantilla
En el nodo HTTP Request de n8n:
- Method:
POST - URL:
https://api.cofferdock.com/pdf-fill-form - Send Headers: actívalo y añade dos:
x-api-key= tu llave, yContent-Type=application/pdf - Send Body: actívalo → elige la opción para mandar un archivo binario (en n8n: "n8n Binary File", con la propiedad binaria de tu plantilla, normalmente
data)
La respuesta trae la lista de campos con su nombre y tipo, por ejemplo: { "fields": [{ "name": "nombre_cliente", "type": "text" }, { "name": "acepto", "type": "checkbox" }] }. Usa esos nombres exactos en el paso 2.
Paso 2: rellena la plantilla
Cambia el cuerpo a JSON (para poder mandar la plantilla y los datos juntos):
- Send Body: JSON →
{ "file": "<tu plantilla en base64>", "data": { "nombre_cliente": "Ana García", "acepto": true } } - Send Headers:
x-api-key= tu llave,Content-Type=application/json - En Options → Response → Response Format: elige File (la respuesta ya es el PDF relleno)
Convierte tu plantilla a base64 con un nodo Code y la expresión {{'{{'}}$binary.data.toString('base64'){{'}}'}}, o con el nodo Move Binary Data.
Si un nombre de campo no existe en la plantilla (por ejemplo un typo), esa llamada NO falla: rellena los campos que sí reconoce y avisa de los que no en la cabecera X-Warnings (o en warnings si pides output=json).
Opciones (en el JSON)
| Opción | Por defecto | Para qué sirve |
|---|---|---|
data | - | Objeto con { "nombre_del_campo": "valor" }. Si lo omites, la API responde con la lista de campos en vez de rellenar. |
flatten | false | true deja el PDF "congelado": los valores ya no se pueden editar en un lector de PDF. |
Resumen de la API
- Endpoint:
POST https://api.cofferdock.com/pdf-fill-form - Auth: cabecera
x-api-key: TU_LLAVE. - Entrada: la plantilla va como
application/pdfa pelo (condatacomo JSON url-encoded en Query) o como JSON con{ file, data, flatten, inspect }. - Modo: sin
data(o coninspect=true) → inspección, devuelvefields. Condata(aunque sea{}) → relleno. - Salida del relleno: PDF binario por defecto; con
output=jsondevuelve{ pdf, warnings, meta }en base64. - Campos desconocidos: no bloquean la llamada, van a
warnings(o a la cabeceraX-Warningsen modo binario, con el número de avisos). - Límites: plantilla hasta 20 MB (50 MB en Business/Scale) en modo
application/pdf, o ~4 MB reales en JSON con base64. 30 peticiones/min por IP. 1 llamada = 1 crédito (inspeccionar o rellenar, por igual).
Tipos de campo soportados
| Tipo | Valor esperado en data |
|---|---|
text | Cualquier texto. |
checkbox | true/false. |
radio / dropdown / list | Uno de los valores de options (los ves en el modo inspección). |
button / signature | No se pueden rellenar por API; si aparecen en data, van a warnings. |
Ejemplos
curl (inspeccionar campos):
curl -X POST "https://api.cofferdock.com/pdf-fill-form" \
-H "x-api-key: TU_LLAVE" \
-H "Content-Type: application/pdf" \
--data-binary @plantilla.pdf
JavaScript (Node 18+, rellenar):
const fs = require('fs');
const r = await fetch('https://api.cofferdock.com/pdf-fill-form', {
method: 'POST',
headers: { 'x-api-key': 'TU_LLAVE', 'Content-Type': 'application/json' },
body: JSON.stringify({
file: fs.readFileSync('plantilla.pdf').toString('base64'),
data: { nombre_cliente: 'Ana García', acepto: true },
}),
});
fs.writeFileSync('relleno.pdf', Buffer.from(await r.arrayBuffer()));
Python (rellenar y aplanar):
import requests, base64
r = requests.post(
'https://api.cofferdock.com/pdf-fill-form',
headers={'x-api-key': 'TU_LLAVE', 'Content-Type': 'application/json'},
json={
'file': base64.b64encode(open('plantilla.pdf', 'rb').read()).decode(),
'data': {'nombre_cliente': 'Ana García', 'acepto': True},
'flatten': True,
},
)
open('relleno.pdf', 'wb').write(r.content)
Respuesta del modo inspección
{ "success": true, "mode": "inspect",
"fields": [
{ "name": "nombre_cliente", "type": "text", "value": "" },
{ "name": "acepto", "type": "checkbox", "value": false },
{ "name": "pais", "type": "dropdown", "options": ["ES","US","MX"], "value": null }
],
"meta": { "total_fields": 3, "used": 12, "remaining": 488 } }
Respuesta del relleno (con output=json)
{ "success": true, "mode": "fill", "pdf": "JVBERi0xLjQ…", "mime_type": "application/pdf",
"warnings": ["Unknown field: \"nombre_clientee\""],
"meta": { "fields_filled": 2, "flattened": false, "used": 13, "remaining": 487 } }
Lo que recibes
En modo inspección: un JSON con la lista de campos. En modo relleno: el PDF relleno directamente (o en base64 con output=json).