---
seo_title: API de cualquier archivo a PDF | EnConvert
meta_desc: Convierte Word, Excel, PowerPoint, HTML, Markdown, EPUB e imágenes a PDF con POST /v1/convert/anything-to-pdf, un único endpoint REST para cualquier archivo a PDF.
keywords: api de cualquier archivo a pdf, convertir cualquier archivo a pdf api, docx a pdf api, word a pdf api, imagen a pdf api, html a pdf api, markdown a pdf api, convertir documentos a pdf api rest
---

# API de cualquier archivo a PDF

El endpoint `POST /v1/convert/anything-to-pdf` convierte casi cualquier archivo que subas — Word, Excel, PowerPoint, OpenDocument, Apple Pages y Numbers, HTML, Markdown, texto plano, EPUB, imágenes y SVG — en un PDF. Detecta automáticamente el formato del archivo que envías, lo redirige al motor de renderizado adecuado y devuelve un único PDF. Un solo endpoint reemplaza toda la pila de PDF específica por formato: subes un archivo y recibes un PDF, sea cual sea el tipo de origen.

Es el superconjunto de una sola llamada de los endpoints de PDF específicos por formato ([html-to-pdf](/es/docs/endpoints/documents-to-pdf/html-to-pdf), doc-to-pdf, excel-to-pdf y los demás): usa esos cuando ya conoces el tipo de entrada y quieres un control detallado de la página, y usa este cuando la entrada podría ser cualquier cosa. Este endpoint funciona solo con archivos; para renderizar a PDF una página web en vivo, usa [url-to-pdf](/es/docs/endpoints/web-pages/url-to-pdf). Para el equivalente en Markdown que convierte cualquier archivo en Markdown limpio, consulta [anything-to-markdown](/es/docs/anything-to-markdown).

---

## Endpoint

```
POST /v1/convert/anything-to-pdf
```

**Content-Type:** `multipart/form-data`

**Formato de salida:** PDF (`.pdf`, `application/pdf`). El tipo de entrada se detecta automáticamente a partir de la extensión del nombre del archivo subido y de sus magic bytes; no especificas un formato de entrada.

---

## Formatos de entrada admitidos

El tipo de entrada se detecta a partir de la extensión del archivo (validada contra los magic bytes del archivo). Estos son todos los formatos que acepta el endpoint:

| Categoría | Formatos | Extensiones | Notas |
|----------|---------|------------|-------|
| Word | DOCX, DOC | `.docx`, `.doc` | Renderizado con LibreOffice, conservando estilos, tablas y diseño. |
| Excel | XLSX, XLS | `.xlsx`, `.xls` | Hojas de cálculo renderizadas a un PDF paginado mediante LibreOffice. |
| PowerPoint | PPTX, PPT | `.pptx`, `.ppt` | Una página de PDF por diapositiva, mediante LibreOffice. |
| OpenDocument | ODT, ODS, ODP, OTS | `.odt`, `.ods`, `.odp`, `.ots` | Documentos de texto, hoja de cálculo, presentación y plantilla de hoja de cálculo, mediante LibreOffice. |
| Apple iWork | Pages, Numbers | `.pages`, `.numbers` | Documentos de Apple Pages y Numbers, mediante LibreOffice. |
| Texto enriquecido / datos | RTF, CSV | `.rtf`, `.csv` | Documentos RTF y tablas CSV renderizados mediante LibreOffice. |
| Web / marcado | HTML, XHTML | `.html`, `.htm`, `.xhtml` | Renderizado con WeasyPrint, respetando el propio CSS del documento. |
| Markdown | Markdown | `.md`, `.markdown`, `.mdown`, `.mkd` | Renderizado a un PDF con estilos, con encabezados, tablas y bloques de código. |
| Texto plano | Text | `.txt`, `.text` | Renderizado con una disposición monoespaciada que conserva los espacios en blanco. |
| Libros electrónicos | EPUB | `.epub` | Capítulos convertidos en orden de lectura (spine) a un PDF de texto. |
| Imágenes | PNG, JPEG, GIF, BMP, TIFF, WebP, HEIC | `.png`, `.jpg`, `.jpeg`, `.gif`, `.bmp`, `.tiff`, `.tif`, `.webp`, `.heic`, `.heif` | Cada imagen se convierte en un PDF de una sola página; la transparencia se aplana sobre fondo blanco. |
| Vectorial | SVG | `.svg` | Renderizado como vector (no rasterizado) con CairoSVG. |
| PDF | PDF | `.pdf` | Aceptado y devuelto tal cual; útil para la normalización a escala de grises (ver `pdf_options`). |

<div class="alert alert-info">
<strong>Nota:</strong> A diferencia de los endpoints de PDF específicos por formato, aquí <em>no</em> se aplica la geometría de página (tamaño de página personalizado, márgenes, orientación, encabezados y pies de página), porque el formato de entrada se detecta automáticamente y cada tipo se renderiza con un motor distinto. En este endpoint solo se respeta <code>grayscale</code>. Para un control total de la página, envía HTML o Markdown a <a href="/es/docs/endpoints/documents-to-pdf/html-to-pdf">html-to-pdf</a> o markdown-to-pdf. Para convertir una URL en vivo a PDF, usa <a href="/es/docs/endpoints/web-pages/url-to-pdf">url-to-pdf</a>.
</div>

---

## Autenticación

Este endpoint admite autenticación tanto con clave privada como con clave pública.

### Clave privada

Incluye tu clave secreta en la cabecera `X-API-Key`. Úsala para llamadas de servidor a servidor donde la clave nunca se expone al cliente.

```
X-API-Key: sk_live_your_private_key
```

### Clave pública con JWT

Para uso del lado del cliente, primero genera un token JWT con tu clave pública y luego pásalo como token Bearer.

**Paso 1 -- Obtén un token:**

```
POST /v1/auth/token
X-API-Key: pk_live_your_public_key
```

**Paso 2 -- Usa el token:**

```
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
```

El flujo completo, incluidos el bloqueo por dominio y la renovación del token, está en [la guía de autenticación](/es/docs/authentication). Cada clave de API lleva una lista de endpoints permitidos; si `/v1/convert/anything-to-pdf` no está en la lista de la clave, la petición se rechaza con `403`.

---

## Parámetros de la petición

Envía el archivo como `multipart/form-data`. El documento va en el campo `file`; el resto son campos de formulario opcionales.

| Parámetro | Tipo | Obligatorio | Predeterminado | Descripción |
|-----------|------|----------|---------|-------------|
| `file` | file | Sí | -- | El archivo de documento, imagen o marcado que se va a convertir. Su extensión debe ser uno de los formatos de entrada admitidos anteriores. |
| `output_filename` | `string` | No | Nombre de entrada | Nombre personalizado para el archivo de salida. La extensión `.pdf` se añade automáticamente. |
| `direct_download` | `boolean` | No | `true` | Se acepta por paridad de forma con las peticiones de los demás endpoints de conversión. |
| `job_id` | `string` | No | -- | ID de trabajo proporcionado por el cliente para la recuperación tras un timeout. Cuando una conversión síncrona supera los límites de timeout del proxy inverso, consulta `GET /v1/convert/status/{job_id}` para obtener el resultado. |
| `pdf_options` | `string` | No | `null` | Cadena JSON con opciones de PDF. En este endpoint solo se respeta `grayscale`; ver más abajo. |

### Opciones de PDF

Pásalas como una cadena JSON en el campo de formulario `pdf_options`. Como el formato de entrada se detecta automáticamente y cada formato se renderiza con un motor distinto, aquí solo se aplica `grayscale` de forma uniforme.

| Parámetro | Tipo | Predeterminado | Descripción |
|-----------|------|---------|-------------|
| `grayscale` | `boolean` | `false` | Convierte el PDF de salida a escala de grises mediante posprocesamiento con Ghostscript. Se aplica a todos los tipos de entrada, incluida una subida que ya sea PDF. |

Para un tamaño de página personalizado, márgenes, orientación, encabezados o pies de página, convierte HTML o Markdown a través de los endpoints específicos [html-to-pdf](/es/docs/endpoints/documents-to-pdf/html-to-pdf) o markdown-to-pdf, que aceptan el esquema completo de `pdf_options`.

---

## Respuesta

La conversión se ejecuta en el proceso y el archivo `.pdf` resultante se almacena; después, el endpoint devuelve un cuerpo JSON con una URL de descarga prefirmada:

```json
{
    "presigned_url": "https://spaces.example.com/...signed...",
    "object_key": "env/files/{project_id}/anything-to-pdf/report_20260714_101530123.pdf",
    "filename": "report_20260714_101530123.pdf",
    "file_size": 51240,
    "conversion_time_seconds": 2.1,
    "job_id": null
}
```

Los mismos valores se reflejan en las cabeceras de respuesta (`X-Object-Key`, `X-File-Size`, `X-Conversion-Time`, `X-Filename`) para que puedas leerlos sin analizar el cuerpo. Descarga el PDF desde `presigned_url`; el enlace tiene una vida corta.

---

## Cómo se convierte cada formato

Cada formato se normaliza a un PDF, de modo que obtienes una salida coherente sin importar el tipo de origen.

- **Word / Excel / PowerPoint** — Renderizados con LibreOffice en modo headless, conservando estilos, tablas y diseño; las presentaciones producen una página por diapositiva. Los formatos binarios heredados (`.doc`, `.xls`, `.ppt`) los gestiona el mismo motor.
- **OpenDocument, Apple Pages / Numbers, RTF, CSV** — También renderizados con LibreOffice, de modo que los documentos ODF, las exportaciones de iWork, el texto enriquecido y las tablas CSV se paginan de forma limpia.
- **HTML / XHTML** — Renderizados con WeasyPrint, que respeta el propio CSS del documento. Los recursos externos referenciados por URL pueden no resolverse; incrusta tu CSS en línea y codifica las imágenes en base64 para obtener mejores resultados.
- **Markdown** — Convertido a HTML (encabezados, tablas al estilo GitHub-Flavored, bloques de código) y renderizado con WeasyPrint en un PDF limpio y con estilos.
- **Texto plano** — Renderizado con una disposición monoespaciada que conserva los espacios en blanco y ajusta las líneas largas, de modo que los registros y el código siguen siendo legibles.
- **EPUB** — Los documentos de contenido se leen en orden de spine (lectura) y se renderizan capítulo a capítulo en un PDF de texto; el documento de navegación se omite.
- **Imágenes (PNG, JPEG, GIF, BMP, TIFF, WebP, HEIC)** — Cada imagen se convierte en un PDF de una sola página mediante Pillow. La transparencia se aplana sobre un fondo blanco y solo se usa el primer fotograma de una imagen de varios fotogramas (GIF animado, TIFF de varias páginas).
- **SVG** — Renderizado como gráficos vectoriales reales con CairoSVG, de modo que el resultado se mantiene nítido a cualquier nivel de zoom.
- **PDF** — Un PDF subido se valida y se devuelve sin cambios, lo que convierte a este endpoint en una forma cómoda de normalizar a escala de grises un PDF existente.

---

## Formato de salida

El resultado es un PDF estándar (`application/pdf`):

- **Los documentos** conservan su paginación, encabezados, tablas y estilos del motor de renderizado de origen.
- **Las imágenes** producen una única página del tamaño de la imagen; **SVG** se mantiene vectorial.
- **Escala de grises** — cuando `pdf_options.grayscale` es `true`, el PDF final se desatura mediante una pasada de posprocesamiento con Ghostscript.

Si necesitas Markdown limpio en lugar de un PDF — por ejemplo, para alimentar un pipeline de LLM o RAG — envía el mismo archivo a [anything-to-markdown](/es/docs/anything-to-markdown) o [el endpoint de ingest](/es/docs/v2-ingest).

---

## Formatos admitidos por endpoint

Los endpoints de subida de archivos comparten la misma detección automática de formato, pero apuntan a salidas distintas. Este endpoint (`anything-to-pdf`) acepta el conjunto más amplio: los 36 formatos siguientes. [`anything-to-markdown`](/es/docs/anything-to-markdown) y [`/v2/ingest`](/es/docs/v2-ingest) aceptan entre sí los mismos 22 formatos de documento (las imágenes, SVG y los formatos de Apple/OTS son solo para PDF), y `/v2/ingest` además acepta fuentes web — una lista de URL, un sitemap o un rastreo — no solo archivos.

| Categoría | Extensiones | anything-to-pdf | anything-to-markdown | /v2/ingest |
|----------|------------|:---:|:---:|:---:|
| PDF | `.pdf` | ✓ | ✓ | ✓ |
| Word | `.docx`, `.doc` | ✓ | ✓ | ✓ |
| Excel | `.xlsx`, `.xls` | ✓ | ✓ | ✓ |
| PowerPoint | `.pptx`, `.ppt` | ✓ | ✓ | ✓ |
| CSV | `.csv` | ✓ | ✓ | ✓ |
| Texto enriquecido | `.rtf` | ✓ | ✓ | ✓ |
| OpenDocument | `.odt`, `.ods`, `.odp` | ✓ | ✓ | ✓ |
| Plantilla ODF | `.ots` | ✓ | — | — |
| Apple iWork | `.pages`, `.numbers` | ✓ | — | — |
| Web / marcado | `.html`, `.htm`, `.xhtml` | ✓ | ✓ | ✓ |
| Markdown / texto | `.md`, `.markdown`, `.mdown`, `.mkd`, `.txt`, `.text` | ✓ | ✓ | ✓ |
| Libros electrónicos | `.epub` | ✓ | ✓ | ✓ |
| Imágenes | `.png`, `.jpg`, `.jpeg`, `.gif`, `.bmp`, `.tiff`, `.tif`, `.webp`, `.heic`, `.heif` | ✓ | — | — |
| Vectorial | `.svg` | ✓ | — | — |

Un ✓ significa que el endpoint acepta ese formato como subida de archivo; un — significa que no. Las imágenes y SVG se convierten a PDF aquí, pero los endpoints con salida en Markdown los rechazan (el OCR de imágenes es un pipeline aparte). Los límites de tamaño por archivo dependen del plan (Free: 5 MB) en los tres endpoints.

---

## Ejemplos de código

### curl (clave privada)

```bash
curl -X POST https://api.enconvert.com/v1/convert/anything-to-pdf \
  -H "X-API-Key: sk_live_your_private_key" \
  -F "file=@quarterly-report.docx"
```

### Python (clave privada)

```python
import requests

with open("quarterly-report.docx", "rb") as f:
    response = requests.post(
        "https://api.enconvert.com/v1/convert/anything-to-pdf",
        headers={"X-API-Key": "sk_live_your_private_key"},
        files={"file": ("quarterly-report.docx", f)},
    )

response.raise_for_status()
result = response.json()

# Download the PDF from the pre-signed URL.
pdf = requests.get(result["presigned_url"]).content
with open("quarterly-report.pdf", "wb") as out:
    out.write(pdf)
```

### Node.js (clave privada)

```javascript
import { readFile, writeFile } from "node:fs/promises";

const form = new FormData();
form.append(
    "file",
    new Blob([await readFile("quarterly-report.docx")]),
    "quarterly-report.docx"
);

const response = await fetch(
    "https://api.enconvert.com/v1/convert/anything-to-pdf",
    { method: "POST", headers: { "X-API-Key": "sk_live_your_private_key" }, body: form }
);

const result = await response.json();
const pdf = await fetch(result.presigned_url).then((r) => r.arrayBuffer());
await writeFile("quarterly-report.pdf", Buffer.from(pdf));
```

### PHP (clave privada)

```php
$ch = curl_init("https://api.enconvert.com/v1/convert/anything-to-pdf");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ["X-API-Key: sk_live_your_private_key"],
    CURLOPT_POSTFIELDS => [
        "file" => new CURLFile("quarterly-report.docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "quarterly-report.docx"),
    ],
]);

$data = json_decode(curl_exec($ch), true);
curl_close($ch);

echo $data["presigned_url"];
```

---

## Respuestas de error

| Estado | Condición |
|--------|-----------|
| `400 Bad Request` | Tipo de archivo no admitido, un archivo vacío o un documento corrupto/ilegible (p. ej., una imagen no válida o un EPUB con formato incorrecto). |
| `400 Bad Request` | Los bytes del archivo no coinciden con su extensión declarada (discordancia de magic bytes). |
| `400 Bad Request` | JSON de `pdf_options` no válido. |
| `401 Unauthorized` | Clave de API o token JWT ausente o no válido. |
| `402 Payment Required` | Se alcanzó el límite mensual de conversiones o el límite de almacenamiento. |
| `403 Forbidden` | `/v1/convert/anything-to-pdf` no está entre los endpoints permitidos de la clave de API. |
| `413 Payload Too Large` | La subida supera el límite de tamaño por archivo de tu plan. |
| `500 Internal Server Error` | La conversión falló inesperadamente. |

La referencia completa de códigos de estado está en [la guía de códigos de error](/es/docs/error-codes).

---

## Límites

| Límite | Valor |
|-------|-------|
| Tamaño máximo de subida | Según el plan (Free: 5 MB) |
| Conversiones mensuales | Según el plan (Free: 100) |
| Retención de archivos | Según el plan (Free: 1 hora) |
| Opciones de geometría de página | No se aplican en este endpoint (solo `grayscale`) |
| Formatos de entrada admitidos | Ver la tabla de [formatos de entrada admitidos](#supported-input-formats) |

---

## Preguntas frecuentes

### ¿Cómo convierto cualquier archivo a PDF con una API?

Envía una petición `POST` a `/v1/convert/anything-to-pdf` como `multipart/form-data` con tu archivo en el campo `file` y tu clave en la cabecera `X-API-Key`. El endpoint detecta automáticamente el formato, lo renderiza a PDF y devuelve JSON con un `presigned_url` al `.pdf` terminado. No necesitas indicarle el tipo de entrada: lo deciden la extensión y los magic bytes.

### ¿Qué formatos de archivo puedo convertir a PDF?

Word (`.docx`, `.doc`), Excel (`.xlsx`, `.xls`), PowerPoint (`.pptx`, `.ppt`), OpenDocument (`.odt`, `.ods`, `.odp`, `.ots`), Apple Pages y Numbers, RTF, CSV, HTML/XHTML, Markdown, texto plano, EPUB, imágenes (`.png`, `.jpg`, `.jpeg`, `.gif`, `.bmp`, `.tiff`, `.webp`, `.heic`) y SVG. Un PDF existente se acepta y se devuelve tal cual. La lista completa con notas por formato está en la tabla de [formatos de entrada admitidos](#supported-input-formats).

### ¿Puedo convertir Word, Excel o PowerPoint a PDF a través de la API?

Sí. Los documentos de Office — modernos (`.docx`, `.xlsx`, `.pptx`) y heredados (`.doc`, `.xls`, `.ppt`) — se renderizan con LibreOffice, conservando estilos, tablas y diseño, con una página por diapositiva en las presentaciones. Sube el archivo y recibes el PDF de vuelta.

### ¿Cómo convierto una imagen como PNG, JPEG o HEIC a PDF?

Súbela al mismo endpoint. Cada imagen se convierte en un PDF de una sola página, con la transparencia aplanada sobre un fondo blanco; también se admiten las fotos `.heic`/`.heif` del iPhone y los vectores `.svg`. Para una imagen de varios fotogramas (GIF animado o TIFF de varias páginas), se usa el primer fotograma.

### ¿Puedo definir un tamaño de página, márgenes o encabezados personalizados en el PDF?

En este endpoint no: solo se respeta `grayscale`, porque el formato de entrada se detecta automáticamente y cada tipo usa un motor de renderizado distinto. Para un control total de la página (tamaño de página, márgenes, orientación, encabezados, pies de página), envía HTML o Markdown a los endpoints [html-to-pdf](/es/docs/endpoints/documents-to-pdf/html-to-pdf) o markdown-to-pdf, que aceptan el esquema completo de `pdf_options`.

### ¿En qué se diferencia esto de los endpoints doc-to-pdf o html-to-pdf?

Los endpoints específicos por formato aceptan cada uno un solo tipo de entrada y exponen todas las opciones de geometría de página; `anything-to-pdf` los acepta todos tras una única llamada y detecta automáticamente el formato, lo que resulta ideal cuando la entrada podría ser cualquier cosa. Usa un endpoint específico cuando conoces el tipo y quieres control de página; usa este cuando quieres una única vía de subida para muchos formatos.
