---
seo_title: API de Pages a PDF: convierte Apple Pages a PDF | EnConvert
meta_desc: Convierte documentos Apple Pages (.pages) a PDF con POST /v1/convert/pages-to-pdf. Subida multipart, renderizado LibreOffice, bytes PDF o URL prefirmada.
keywords: apple pages a pdf api, convertir archivo pages a pdf, pages a pdf api rest, .pages a pdf api, convertir pages a pdf programáticamente, iwork pages a pdf api, pages a pdf python, pages a pdf api curl
---

# API de Apple Pages a PDF

La API de Apple Pages a PDF convierte documentos de Apple iWork Pages (`.pages`) a PDF a través del endpoint `POST /v1/convert/pages-to-pdf`. Sube un archivo `.pages` como `multipart/form-data` y recibe de vuelta los bytes del PDF en bruto, o establece `direct_download=false` para obtener metadatos JSON con una URL de descarga prefirmada. El renderizado lo gestiona LibreOffice en el servidor, por lo que el formato, las fuentes y el diseño del propio documento se conservan en el PDF de salida.

---

## Endpoint

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

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

**Entrada aceptada:** archivos `.pages`

**Formato de salida:** `.pdf` (`application/pdf`)

---

## Autenticación

Requiere una clave API privada o un token JWT emitido a partir de una clave pública.

```
X-API-Key: sk_your_private_key
```

O bien:

```
Authorization: Bearer <jwt_token>
```

---

## Parámetros de la solicitud

| Parámetro | Tipo | Requerido | Por defecto | Descripción |
|-----------|------|----------|---------|-------------|
| `file` | file | Sí | -- | El archivo `.pages` a convertir. |
| `output_filename` | `string` | No | Nombre del archivo de entrada | Nombre de archivo de salida personalizado. La extensión `.pdf` se añade automáticamente. |
| `direct_download` | `boolean` | No | `true` | Con `true`, devuelve los bytes del PDF en bruto. Con `false`, devuelve metadatos JSON con una URL de descarga prefirmada. |
| `pdf_options` | `string` | No | `null` | Cadena JSON. Solo se soporta la opción `grayscale` en este endpoint (ver abajo). |

### Opciones de PDF

Para los conversores de documentos basados en LibreOffice, el diseño de página (tamaño, márgenes, orientación) lo determinan los ajustes del propio documento. El único campo de `pdf_options` que aplica es:

| Parámetro | Tipo | Por defecto | Descripción |
|-----------|------|---------|-------------|
| `grayscale` | `boolean` | `false` | Convierte el PDF de salida a escala de grises mediante posprocesado con Ghostscript. |

<div class="alert alert-info">
<strong>Nota:</strong> El tamaño de página, los márgenes, la orientación, la escala, los encabezados y los pies de página de <code>pdf_options</code> no aplican a este endpoint. El PDF de salida conserva el formato definido en el documento original. Para cambiar el diseño de página, modifica el documento de origen antes de subirlo.
</div>

---

## Detalles de la conversión

- Usa **LibreOffice** (vía unoserver) para el renderizado de documentos en el servidor
- Se conservan el formato, las fuentes, el diseño de página y los medios incrustados del propio documento
- Tiempo límite de conversión: 120 segundos
- La salida reproduce fielmente el documento tal y como se imprimiría desde LibreOffice

---

## Respuesta

### Descarga directa (`direct_download=true`, por defecto)

```
HTTP 200 OK
Content-Type: application/pdf
Content-Disposition: inline; filename="document_20260405_123456789.pdf"
```

Devuelve los bytes del PDF en bruto.

### Respuesta con metadatos (`direct_download=false`)

```json
{
    "presigned_url": "https://spaces.example.com/...",
    "object_key": "env/files/{project_id}/pages-to-pdf/document_20260405_123456789.pdf",
    "filename": "document_20260405_123456789.pdf",
    "file_size": 67890,
    "conversion_time_seconds": 3.5
}
```

---

## Ejemplos de código

### Python

```python
import requests

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

with open("output.pdf", "wb") as out:
    out.write(response.content)
```

### Node.js

```javascript
const form = new FormData();
form.append("file", fs.createReadStream("document.pages"));

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

fs.writeFileSync("output.pdf", Buffer.from(await response.arrayBuffer()));
```

### PHP

```php
$ch = curl_init("https://api.enconvert.com/v1/convert/pages-to-pdf");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ["X-API-Key: sk_your_private_key"],
    CURLOPT_POSTFIELDS => ["file" => new CURLFile("document.pages")]
]);
$pdf = curl_exec($ch);
curl_close($ch);
file_put_contents("output.pdf", $pdf);
```

### Go

```go
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, _ := writer.CreateFormFile("file", "document.pages")
file, _ := os.Open("document.pages")
io.Copy(part, file)
writer.Close()

req, _ := http.NewRequest("POST", "https://api.enconvert.com/v1/convert/pages-to-pdf", body)
req.Header.Set("Content-Type", writer.FormDataContentType())
req.Header.Set("X-API-Key", "sk_your_private_key")
resp, _ := http.DefaultClient.Do(req)
```

### Con salida en escala de grises

```python
import requests
import json

with open("document.pages", "rb") as f:
    response = requests.post(
        "https://api.enconvert.com/v1/convert/pages-to-pdf",
        headers={"X-API-Key": "sk_your_private_key"},
        files={"file": ("document.pages", f)},
        data={"pdf_options": json.dumps({"grayscale": True})}
    )
```

---

## Respuestas de error

| Estado | Condición |
|--------|-----------|
| `400 Bad Request` | El archivo no es un archivo `.pages` |
| `400 Bad Request` | La conversión del documento falló (archivo corrupto o no soportado) |
| `400 Bad Request` | JSON de `pdf_options` inválido |
| `401 Unauthorized` | Clave API o token JWT ausente o inválido |
| `402 Payment Required` | Cuota mensual de ops agotada |
| `402 Payment Required` | Límite de almacenamiento alcanzado |
| `413 Payload Too Large` | El archivo supera el tamaño máximo de archivo del plan |
| `500 Internal Server Error` | La conversión superó el tiempo límite (límite de 120 segundos) |

---

## Límites

| Límite | Valor |
|-------|-------|
| Tamaño máximo de archivo | Depende del plan (Founding: 5 MB) |
| Tiempo límite de conversión | 120 segundos |
| Conversiones mensuales | Depende del plan |

## Preguntas frecuentes

### ¿Cómo convierto un archivo Apple Pages a PDF con una API REST?

Envía una solicitud `POST` a `/v1/convert/pages-to-pdf` con el archivo `.pages` en un cuerpo `multipart/form-data`, autenticada con un encabezado `X-API-Key` o un JWT `Authorization: Bearer`. La respuesta contiene los bytes del PDF convertido por defecto.

### ¿Puedo obtener un enlace de descarga en lugar de los bytes del PDF en bruto?

Sí. Establece `direct_download=false` y la API devuelve metadatos JSON que incluyen `presigned_url`, el `filename` de salida, `file_size` y `conversion_time_seconds`.

### ¿Puedo cambiar el tamaño de página, los márgenes o la orientación del PDF de salida?

No. El diseño de página se toma de los ajustes del propio documento de Pages; el único campo de `pdf_options` soportado es `grayscale`. Para cambiar el diseño, modifica el documento de origen antes de subirlo.

### ¿Por qué el endpoint pages-to-pdf devuelve 400 Bad Request?

Se devuelve un `400 Bad Request` cuando lo subido no es un archivo `.pages`, cuando el documento está corrupto o no está soportado, o cuando el valor de `pdf_options` no es JSON válido.

### ¿Cuáles son los límites de tamaño de archivo y de tiempo para la conversión de Pages a PDF?

El tamaño máximo de archivo depende del plan (5 MB en el plan Founding) y cada conversión tiene un tiempo límite de 120 segundos; una conversión que expira devuelve `500 Internal Server Error`.
