pdf-to-jpeg

Convert a PDF document to JPEG image(s). Single-page PDFs produce a JPEG file; multi-page PDFs produce a ZIP archive containing one JPEG per page.


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_live_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)

{
    "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

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_live_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

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_live_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

$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_live_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

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_live_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 conversion limit reached
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 (Free: 5 MB)
Render resolution 144 DPI (2x scale)
Output quality Maximum (JPEG quality 100)
Monthly conversions Plan-dependent