---
seo_title: API OTS en PDF : modèles de classeur Calc en PDF | EnConvert
meta_desc: Convertissez des modèles de classeur OpenDocument (.ots) en PDF avec POST /v1/convert/ots-to-pdf. Rendu LibreOffice, octets PDF ou URL de téléchargement présignée.
keywords: api ots en pdf, convertir ots en pdf api, ots vers pdf api, modèle calc en pdf api, modèle opendocument en pdf api, api rest ots en pdf, convertir ots en pdf python, fichier ots en pdf api
---

# API OTS en PDF

L'API OTS en PDF convertit les fichiers OpenDocument Spreadsheet Template (`.ots`, le format de modèle de classeur de LibreOffice et OpenOffice Calc) en PDF via l'endpoint `POST /v1/convert/ots-to-pdf`. Envoyez un fichier `.ots` en `multipart/form-data` et recevez les octets PDF bruts en retour, ou définissez `direct_download=false` pour obtenir des métadonnées JSON avec une URL de téléchargement présignée. Le rendu est effectué côté serveur par LibreOffice : la mise en forme, les polices et la mise en page propres au modèle sont préservées dans le PDF généré.

---

## Endpoint

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

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

**Entrée acceptée :** fichiers `.ots`

**Format de sortie :** `.pdf` (`application/pdf`)

---

## Authentification

Requiert une clé API privée ou un jeton JWT issu d'une clé publique.

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

Ou :

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

---

## Paramètres de la requête

| Paramètre | Type | Requis | Défaut | Description |
|-----------|------|----------|---------|-------------|
| `file` | file | Oui | -- | Le fichier `.ots` à convertir. |
| `output_filename` | `string` | Non | Nom du fichier d'entrée | Nom de fichier de sortie personnalisé. L'extension `.pdf` est ajoutée automatiquement. |
| `direct_download` | `boolean` | Non | `true` | Avec `true`, renvoie les octets PDF bruts. Avec `false`, renvoie des métadonnées JSON avec une URL de téléchargement présignée. |
| `pdf_options` | `string` | Non | `null` | Chaîne JSON. Seule l'option `grayscale` est prise en charge pour cet endpoint (voir ci-dessous). |

### Options PDF

Pour les convertisseurs de documents basés sur LibreOffice, la mise en page (taille, marges, orientation) est déterminée par les paramètres du document lui-même. Le seul champ `pdf_options` pris en compte est :

| Paramètre | Type | Défaut | Description |
|-----------|------|---------|-------------|
| `grayscale` | `boolean` | `false` | Convertit le PDF de sortie en niveaux de gris via un post-traitement Ghostscript. |

<div class="alert alert-info">
<strong>Note :</strong> La taille de page, les marges, l'orientation, l'échelle, les en-têtes et les pieds de page de <code>pdf_options</code> ne s'appliquent pas à cet endpoint. Le PDF généré conserve la mise en forme définie dans le document d'origine. Pour changer la mise en page, modifiez le document source avant de l'envoyer.
</div>

---

## Détails de la conversion

- Utilise **LibreOffice** (via unoserver) pour le rendu des documents côté serveur
- La mise en forme, les polices, la mise en page et les médias intégrés du document sont préservés
- Délai maximal de conversion : 120 secondes
- La sortie reproduit fidèlement le document tel qu'il serait imprimé depuis LibreOffice

---

## Réponse

### Téléchargement direct (`direct_download=true`, par défaut)

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

Renvoie les octets PDF bruts.

### Réponse avec métadonnées (`direct_download=false`)

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

---

## Exemples de code

### Python

```python
import requests

with open("document.ots", "rb") as f:
    response = requests.post(
        "https://api.enconvert.com/v1/convert/ots-to-pdf",
        headers={"X-API-Key": "sk_your_private_key"},
        files={"file": ("document.ots", 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.ots"));

const response = await fetch("https://api.enconvert.com/v1/convert/ots-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/ots-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.ots")]
]);
$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.ots")
file, _ := os.Open("document.ots")
io.Copy(part, file)
writer.Close()

req, _ := http.NewRequest("POST", "https://api.enconvert.com/v1/convert/ots-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)
```

### Avec sortie en niveaux de gris

```python
import requests
import json

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

---

## Réponses d'erreur

| Statut | Condition |
|--------|-----------|
| `400 Bad Request` | Le fichier n'est pas un fichier `.ots` |
| `400 Bad Request` | Échec de la conversion du document (fichier corrompu ou non pris en charge) |
| `400 Bad Request` | JSON `pdf_options` invalide |
| `401 Unauthorized` | Clé API / jeton JWT manquant ou invalide |
| `402 Payment Required` | Quota mensuel d'ops épuisé |
| `402 Payment Required` | Limite de stockage atteinte |
| `413 Payload Too Large` | Le fichier dépasse la taille maximale autorisée par le plan |
| `500 Internal Server Error` | Délai de conversion dépassé (limite de 120 secondes) |

---

## Limites

| Limite | Valeur |
|-------|-------|
| Taille maximale de fichier | Selon le plan (Founding : 5 MB) |
| Délai maximal de conversion | 120 secondes |
| Conversions mensuelles | Selon le plan |

## Questions fréquentes

### Comment convertir un modèle de classeur OTS en PDF avec une API REST ?

Envoyez une requête `POST` à `/v1/convert/ots-to-pdf` avec le fichier `.ots` dans un corps `multipart/form-data`, authentifiée par un en-tête `X-API-Key` ou un JWT `Authorization: Bearer`. La réponse contient par défaut les octets du PDF converti.

### Puis-je convertir des fichiers de modèle LibreOffice ou OpenOffice Calc en PDF avec cette API ?

Oui. L'endpoint accepte les fichiers `.ots`, le format OpenDocument Spreadsheet Template utilisé par LibreOffice et OpenOffice Calc, et les rend côté serveur avec LibreOffice : la sortie correspond à ce que donnerait l'impression du document depuis LibreOffice.

### Puis-je obtenir une URL de téléchargement au lieu des octets PDF bruts ?

Oui. Définissez `direct_download=false` et l'API renvoie des métadonnées JSON incluant une `presigned_url`, le `filename` de sortie, `file_size` et `conversion_time_seconds`.

### Puis-je changer la taille de page, les marges ou l'orientation du PDF généré ?

Non. La mise en page provient des paramètres du document OTS lui-même ; le seul champ `pdf_options` pris en charge est `grayscale`. Pour changer la mise en page, modifiez le document source avant de l'envoyer.

### Pourquoi l'endpoint ots-to-pdf renvoie-t-il 400 Bad Request ?

Une erreur `400 Bad Request` est renvoyée lorsque le fichier envoyé n'est pas un `.ots`, lorsque le document est corrompu ou non pris en charge, ou lorsque la valeur de `pdf_options` n'est pas du JSON valide.
