pdf-servicio
HTML → PDF y PDF → imagen, con la misma API que pdf.co. Para usarlo desde cualquier proyecto con una llamada HTTP.
Cómo empezar
- Pide una clave para tu proyecto (cada proyecto tiene la suya, con su nombre).
- Mándala en el encabezado
x-api-keyen cada pedido. - El cuerpo puede ir en JSON o como formulario.
Esta instancia: https://pdfjh.neboaiconsulting.com
HTML → PDF
POST /v1/pdf/convert/from/html
| Campo | Qué es |
|---|---|
html | El HTML completo. Obligatorio. Las imágenes y fuentes por URL pública se cargan solas. |
name | Nombre del archivo (sin o con .pdf). |
paperSize | Letter (por defecto), A4, Legal, Tabloid, A3, A5… o medidas: "210mm 297mm". |
margins | Como en CSS: "10mm" o "3mm 10mm 2mm 10mm" (arriba, derecha, abajo, izquierda). |
landscape | true para horizontal. |
header, footer | HTML del encabezado y pie de cada página. Admite <span class="pageNumber"> y <span class="totalPages">. Dale tamaño de letra explícito (p. ej. style="font-size:9px") y deja margen para que quepa. |
inline | true: responde el PDF directo (application/pdf, con el número de páginas en X-Page-Count) en vez de una URL. |
Respuesta (como pdf.co):
{ "url": "https://…/archivos/3f9c…/Cotizacion.pdf", "pageCount": 2, "name": "Cotizacion.pdf",
"error": false, "status": 200, "credits": 0, "remainingCredits": 0 }
La URL es pública pero imposible de adivinar, y el archivo se borra a las 24 horas: descárgalo y guárdalo donde lo necesites.
curl
curl -X POST https://pdfjh.neboaiconsulting.com/v1/pdf/convert/from/html \
-H "x-api-key: TU_CLAVE" -H "Content-Type: application/json" \
-d '{"html":"<h1>Hola</h1>","name":"prueba","paperSize":"A4","margins":"10mm"}'
JavaScript (Node 18+ o navegador desde tu servidor)
const r = await fetch('https://pdfjh.neboaiconsulting.com/v1/pdf/convert/from/html', {
method: 'POST',
headers: { 'x-api-key': process.env.PDF_CLAVE, 'Content-Type': 'application/json' },
body: JSON.stringify({ html, name: 'Factura 123', paperSize: 'Letter', margins: '10mm', inline: true }),
});
if (!r.ok) throw new Error((await r.json()).message);
const pdf = Buffer.from(await r.arrayBuffer()); // con inline: true, el PDF directo
n8n (cambiar un nodo de pdf.co)
En el nodo HTTP Request: la URL pasa a https://pdfjh.neboaiconsulting.com/v1/pdf/convert/from/html y la autenticación a Generic Credential Type → Header Auth, con nombre x-api-key y la clave como valor. Los parámetros y lo que sigue al nodo ({{ $json.url }}, pageCount) quedan igual.
Página web → PDF
POST /v1/pdf/convert/from/url — igual que la anterior, pero con url (pública, http o https) en vez de html.
PDF → imágenes
POST /v1/pdf/convert/to/jpg · POST /v1/pdf/convert/to/png
| Campo | Qué es |
|---|---|
url | URL pública del PDF (hasta 25 MB). Obligatorio. |
pages | Como pdf.co, empezando en 0: "0", "0,2-3", "1-". Sin él, todas. |
resolution | DPI, de 36 a 300. Por defecto 150. |
name | Base del nombre de las imágenes (nombre-1.jpg, nombre-2.jpg…). |
{ "urls": ["https://…/archivos/…/doc-1.jpg", "https://…/archivos/…/doc-2.jpg"], "pageCount": 2,
"name": "doc.jpg", "error": false, "status": 200, "credits": 0, "remainingCredits": 0 }
Errores
Con la forma de pdf.co: { "error": true, "status": 400, "message": "…" }.
| Código | Cuándo |
|---|---|
| 400 | Falta un campo, una opción no vale, la URL no es pública o el PDF no es PDF. |
| 401 | Sin clave o clave no válida. |
| 413 | El cuerpo pasa de 30 MB. |
| 503 | Hay demasiadas conversiones en espera (se hacen de a una): reintenta en unos segundos. |
Límites
- Una conversión a la vez por instancia; hasta 60 s cada una.
- El HTML no puede cargar nada de la red interna del servidor (ni
localhost, ni IPs privadas, nifile:): solo recursos públicos. - Fuentes instaladas: Liberation (mismas medidas que Arial, Times New Roman y Courier New), DejaVu y Noto Color Emoji. Otras, por
@font-faceo Google Fonts.