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

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