---
seo_title: Word to PDF API: Convert DOC & DOCX Files to PDF | EnConvert
meta_desc: Convert Word to PDF via REST API. POST /v1/convert/doc-to-pdf turns .doc and .docx files into high-fidelity PDFs with LibreOffice, preserving fonts and layout.
keywords: word to pdf api, convert docx to pdf api, word to pdf rest api, doc to pdf api, docx to pdf conversion api, word document to pdf api, docx to pdf api python, word to pdf api node js
---

# Word to PDF API

The Word to PDF API converts Microsoft Word documents (`.doc`, `.docx`) to PDF via `POST /v1/convert/doc-to-pdf`, using LibreOffice's high-fidelity rendering engine. The document's own formatting, fonts, and page layout are preserved in the PDF output. The response is raw PDF bytes by default, or JSON metadata with a presigned download URL when `direct_download=false`.

---

## Endpoint

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

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

**Accepted input:** `.docx or .doc` files

**Output format:** `.pdf` (`application/pdf`)

---

## Authentication

Requires either a private API key or a JWT token from a public key.

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

Or:

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

---

## Request Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `file` | file | Yes | -- | The `.docx or .doc` file to convert. |
| `output_filename` | `string` | No | Input filename | Custom output filename. The `.pdf` extension is added automatically. |
| `direct_download` | `boolean` | No | `true` | When `true`, returns raw PDF bytes. When `false`, returns JSON metadata with a presigned download URL. |
| `pdf_options` | `string` | No | `null` | JSON string. Only the `grayscale` option is supported for this endpoint (see below). |

### PDF Options

For document converters powered by LibreOffice, page layout (size, margins, orientation) is determined by the document's own settings. The only `pdf_options` field that applies is:

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `grayscale` | `boolean` | `false` | Convert the output PDF to grayscale via Ghostscript post-processing. |

<div class="alert alert-info">
<strong>Note:</strong> Page size, margins, orientation, scale, headers, and footers from <code>pdf_options</code> do not apply to this endpoint. The PDF output preserves the formatting defined in the original document. To change page layout, modify the source document before uploading.
</div>

---

## Conversion Details

- Uses **LibreOffice** (via unoserver) for server-side document rendering
- The document's own formatting, fonts, page layout, and embedded media are preserved
- Conversion timeout: 120 seconds
- The output faithfully reproduces the document as it would appear when printed from LibreOffice

---

## Response

### Direct Download (`direct_download=true`, default)

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

Returns raw PDF bytes.

### Metadata Response (`direct_download=false`)

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

---

## Code Examples

### Python

```python
import requests

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

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

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

### With Grayscale Output

```python
import requests
import json

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

---

## Error Responses

| Status | Condition |
|--------|-----------|
| `400 Bad Request` | File is not a `.docx or .doc` file |
| `400 Bad Request` | Document conversion failed (corrupt or unsupported file) |
| `400 Bad Request` | Invalid `pdf_options` JSON |
| `401 Unauthorized` | Missing or invalid API key / JWT token |
| `402 Payment Required` | Monthly ops allowance exhausted |
| `402 Payment Required` | Storage limit reached |
| `413 Payload Too Large` | File exceeds plan's maximum file size |
| `500 Internal Server Error` | Conversion timed out (120-second limit) |

---

## Limits

| Limit | Value |
|-------|-------|
| Max file size | Plan-dependent (Founding: 5 MB) |
| Conversion timeout | 120 seconds |
| Monthly conversions | Plan-dependent |

## Frequently asked questions

### How do I convert a DOCX file to PDF with a REST API?

Send a `multipart/form-data` request to `POST /v1/convert/doc-to-pdf` with your `.docx` or `.doc` file in the `file` field, authenticated via `X-API-Key` or a Bearer JWT. By default the response is the raw PDF bytes with `Content-Type: application/pdf`.

### Does Word to PDF conversion preserve fonts and formatting?

Yes. The endpoint uses LibreOffice (via unoserver) for server-side rendering, so the document's own formatting, fonts, page layout, and embedded media are preserved. The output reproduces the document as it would appear when printed from LibreOffice.

### Can I change page size, margins, or orientation when converting Word to PDF?

No. Page layout is determined by the document's own settings, and the only supported `pdf_options` field on this endpoint is `grayscale`. To change page layout, modify the source document before uploading.

### Why did my Word to PDF conversion fail or time out?

A `400 Bad Request` means the file is not `.docx` or `.doc`, is corrupt or unsupported, or the `pdf_options` JSON is invalid. A `500 Internal Server Error` means the conversion exceeded the 120-second timeout.

### Can I get a download URL instead of the PDF bytes?

Yes. Set `direct_download=false` and the endpoint returns JSON metadata including a `presigned_url`, `object_key`, `filename`, `file_size`, and `conversion_time_seconds`.
