---
seo_title: API OTS in PDF: converti modelli Calc in PDF | EnConvert
meta_desc: Converti file OpenDocument Spreadsheet Template (.ots) in PDF con POST /v1/convert/ots-to-pdf. Rendering LibreOffice, byte PDF o URL di download prefirmato.
keywords: api ots in pdf, convertire ots in pdf api, ots in pdf api rest, modello calc in pdf api, convertire ots in pdf python, openoffice ots in pdf api, modello foglio di calcolo in pdf api, file ots in pdf api
---

# API OTS in PDF

L'API OTS in PDF converte file OpenDocument Spreadsheet Template (`.ots`, il formato di modello di foglio di calcolo di LibreOffice e OpenOffice Calc) in PDF tramite l'endpoint `POST /v1/convert/ots-to-pdf`. Carica un file `.ots` come `multipart/form-data` e ricevi in risposta i byte PDF grezzi, oppure imposta `direct_download=false` per ottenere metadati JSON con un URL di download prefirmato. Il rendering è gestito lato server da LibreOffice, quindi formattazione, font e layout del modello vengono preservati nell'output PDF.

---

## Endpoint

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

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

**Input accettato:** file `.ots`

**Formato di output:** `.pdf` (`application/pdf`)

---

## Autenticazione

Richiede una chiave API privata oppure un token JWT ottenuto da una chiave pubblica.

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

Oppure:

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

---

## Parametri della richiesta

| Parametro | Tipo | Obbligatorio | Default | Descrizione |
|-----------|------|----------|---------|-------------|
| `file` | file | Sì | -- | Il file `.ots` da convertire. |
| `output_filename` | `string` | No | Nome del file di input | Nome file di output personalizzato. L'estensione `.pdf` viene aggiunta automaticamente. |
| `direct_download` | `boolean` | No | `true` | Se `true`, restituisce i byte PDF grezzi. Se `false`, restituisce metadati JSON con un URL di download prefirmato. |
| `pdf_options` | `string` | No | `null` | Stringa JSON. Per questo endpoint è supportata solo l'opzione `grayscale` (vedi sotto). |

### Opzioni PDF

Per i convertitori di documenti basati su LibreOffice, il layout di pagina (dimensioni, margini, orientamento) è determinato dalle impostazioni del documento stesso. L'unico campo di `pdf_options` che si applica è:

| Parametro | Tipo | Default | Descrizione |
|-----------|------|---------|-------------|
| `grayscale` | `boolean` | `false` | Converte il PDF di output in scala di grigi tramite post-elaborazione con Ghostscript. |

<div class="alert alert-info">
<strong>Nota:</strong> Dimensioni di pagina, margini, orientamento, scala, intestazioni e piè di pagina di <code>pdf_options</code> non si applicano a questo endpoint. L'output PDF preserva la formattazione definita nel documento originale. Per cambiare il layout di pagina, modifica il documento sorgente prima del caricamento.
</div>

---

## Dettagli della conversione

- Usa **LibreOffice** (tramite unoserver) per il rendering dei documenti lato server
- Formattazione, font, layout di pagina e contenuti multimediali incorporati del documento vengono preservati
- Timeout di conversione: 120 secondi
- L'output riproduce fedelmente il documento come apparirebbe stampandolo da LibreOffice

---

## Risposta

### Download diretto (`direct_download=true`, predefinito)

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

Restituisce i byte PDF grezzi.

### Risposta con metadati (`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
}
```

---

## Esempi di codice

### 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)
```

### Con output in scala di grigi

```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})}
    )
```

---

## Risposte di errore

| Stato | Condizione |
|--------|-----------|
| `400 Bad Request` | Il file non è un file `.ots` |
| `400 Bad Request` | Conversione del documento non riuscita (file corrotto o non supportato) |
| `400 Bad Request` | JSON di `pdf_options` non valido |
| `401 Unauthorized` | Chiave API o token JWT mancante o non valido |
| `402 Payment Required` | Quota mensile di ops esaurita |
| `402 Payment Required` | Limite di archiviazione raggiunto |
| `413 Payload Too Large` | Il file supera la dimensione massima prevista dal piano |
| `500 Internal Server Error` | Timeout della conversione (limite di 120 secondi) |

---

## Limiti

| Limite | Valore |
|-------|-------|
| Dimensione massima del file | Dipende dal piano (Founding: 5 MB) |
| Timeout di conversione | 120 secondi |
| Conversioni mensili | Dipende dal piano |

## Domande frequenti

### Come converto un modello di foglio di calcolo OTS in PDF con una API REST?

Invia una richiesta `POST` a `/v1/convert/ots-to-pdf` con il file `.ots` in un body `multipart/form-data`, autenticandoti con un header `X-API-Key` o un JWT `Authorization: Bearer`. Di default la risposta contiene i byte del PDF convertito.

### Posso convertire file modello di LibreOffice o OpenOffice Calc in PDF con questa API?

Sì. L'endpoint accetta file `.ots`, il formato OpenDocument Spreadsheet Template usato da LibreOffice e OpenOffice Calc, e li renderizza lato server con LibreOffice, quindi l'output corrisponde a come il documento verrebbe stampato da LibreOffice.

### Posso ottenere un URL di download invece dei byte PDF grezzi?

Sì. Imposta `direct_download=false` e l'API restituisce metadati JSON che includono `presigned_url`, il `filename` di output, `file_size` e `conversion_time_seconds`.

### Posso cambiare dimensioni di pagina, margini o orientamento del PDF di output?

No. Il layout di pagina deriva dalle impostazioni del documento OTS stesso; l'unico campo `pdf_options` supportato è `grayscale`. Per cambiare il layout, modifica il documento sorgente prima del caricamento.

### Perché l'endpoint ots-to-pdf restituisce 400 Bad Request?

Un `400 Bad Request` viene restituito quando il file caricato non è un `.ots`, quando il documento è corrotto o non supportato, o quando il valore di `pdf_options` non è JSON valido.
