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
.jpegfile directly - Multi-page PDFs return a
.ziparchive containingpage_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 |