---
seo_title: PDF to JPEG API: Render PDF Pages as Images | EnConvert
meta_desc: Convert PDF to JPEG images via POST /v1/convert/pdf-to-jpeg. Renders each page at 144 DPI; multi-page PDFs return a ZIP with one JPEG per page.
keywords: pdf to image api, pdf to jpg api, pdf to jpeg api, render pdf pages as images api, convert pdf to jpg programmatically, pdf page to image rest api, pdf to jpeg zip api, pdf to image converter api
---

# PDF to JPEG API

Convert a PDF to JPEG images with the `POST /v1/convert/pdf-to-jpeg` endpoint, which renders every PDF page as a raster image. Single-page PDFs return a JPEG file directly; multi-page PDFs return a ZIP archive containing one JPEG per page. Responses return raw file bytes by default, or JSON metadata with a presigned download URL when `direct_download=false`.

---

## Endpoint

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

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

**Accepted input:** `.pdf` files

**Output format:** `.jpeg` (`image/jpeg`) for single-page PDFs, `.zip` (`application/zip`) for multi-page PDFs

---

## 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 `.pdf` file to convert. |
| `output_filename` | `string` | No | Input filename | Custom output filename. The `.jpeg` or `.zip` extension is added automatically. |
| `direct_download` | `boolean` | No | `true` | When `true`, returns raw file bytes. When `false`, returns JSON metadata with a presigned download URL. |

---

## Conversion Details

- Uses **PyMuPDF** to render PDF pages to raster images at 2x resolution (144 DPI)
- Uses **Pillow** for JPEG encoding with maximum quality
- Transparency is flattened onto a white background (JPEG does not support alpha)
- Single-page PDFs return a `.jpeg` file directly
- Multi-page PDFs return a `.zip` archive containing `page_1.jpeg`, `page_2.jpeg`, etc.
- Output format is automatically determined based on the number of pages

---

## Response

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

**Single-page PDF:**

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

Returns raw JPEG image bytes.

**Multi-page PDF:**

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

Returns a ZIP archive containing one JPEG per page.

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

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

---

## Code Examples

### Python

```python
import requests

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

# Check if response is a ZIP (multi-page) or JPEG (single-page)
content_type = response.headers.get("Content-Type", "")
if "zip" in content_type:
    with open("document_pages.zip", "wb") as out:
        out.write(response.content)
else:
    with open("document_20260405_123456789.jpeg", "wb") as out:
        out.write(response.content)
```

### Node.js

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

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

const contentType = response.headers.get("content-type");
const buffer = Buffer.from(await response.arrayBuffer());

if (contentType.includes("zip")) {
    fs.writeFileSync("document_pages.zip", buffer);
} else {
    fs.writeFileSync("document_20260405_123456789.jpeg", buffer);
}
```

### PHP

```php
$ch = curl_init("https://api.enconvert.com/v1/convert/pdf-to-jpeg");
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.pdf")]
]);
$output = curl_exec($ch);
$contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
curl_close($ch);

if (str_contains($contentType, "zip")) {
    file_put_contents("document_pages.zip", $output);
} else {
    file_put_contents("document_20260405_123456789.jpeg", $output);
}
```

### Go

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

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

---

## Error Responses

| Status | Condition |
|--------|-----------|
| `400 Bad Request` | File is not a `.pdf` file |
| `400 Bad Request` | PDF has no pages |
| `400 Bad Request` | Image conversion failed (corrupt or unsupported PDF) |
| `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 |

---

## Limits

| Limit | Value |
|-------|-------|
| Max file size | Plan-dependent (Founding: 5 MB) |
| Render resolution | 144 DPI (2x scale) |
| Output quality | Maximum (JPEG quality 100) |
| Monthly conversions | Plan-dependent |

---

## Frequently asked questions

### How do I convert a PDF to JPEG images with a REST API?

Send a `multipart/form-data` POST request to `/v1/convert/pdf-to-jpeg` with the `.pdf` file in the `file` field, authenticated via `X-API-Key` or a Bearer JWT. You get raw file bytes back by default, or set `direct_download=false` to receive JSON with a presigned download URL.

### How does the API handle multi-page PDFs?

Single-page PDFs return a `.jpeg` file directly, while multi-page PDFs return a `.zip` archive containing `page_1.jpeg`, `page_2.jpeg`, and so on. The output format is determined automatically from the page count, so check the `Content-Type` header (`image/jpeg` vs `application/zip`) when saving the response.

### What resolution are PDF pages rendered at?

Pages are rendered with PyMuPDF at 2x resolution (144 DPI) and encoded as JPEG at maximum quality (100). Neither setting is configurable.

### Does PDF to JPEG conversion keep transparency?

No. JPEG does not support an alpha channel, so transparency is flattened onto a white background.

### Why does the PDF to JPEG endpoint return a 400 error?

`400 Bad Request` is returned when the file is not a `.pdf`, when the PDF has no pages, or when the conversion fails because the PDF is corrupt or unsupported.
