EXR to PDF API
Send an .exr to /v2/convert/exr/to/pdf and get a one-page PDF holding the render as a 16-bit image, with its alpha as a soft mask. The sample adds 6 mm margins, so the 180 × 225 pt picture sits on a 214 × 259 pt page.
- Endpoint
- POST /v2/
convert/ exr/ to/ pdf - Accepts
- exr
- Sample timing
- 31 ms median of 5 runsHow we measure
- Request size
- Up to 10 MB on the Free plan or 100 MB on paid plans, all files together
Request and response
Every sample below ran against the API before this page was published. Set PDFCONVERSIONAPI_KEY to your key and run it as is.
curl -sS -X POST \
https://api.pdfconversionapi.com/v2/convert/exr/to/pdf \
-H "Authorization: Bearer $PDFCONVERSIONAPI_KEY" \
-F File=@glowing-bulb-render.exr \
--form-string MarginHorizontal=6 \
--form-string MarginVertical=6 \
-o response.json
# FileData is base64. Save the first file in converted/,
# or print the JSON error.
if jq -e '.Files' response.json > /dev/null; then
mkdir -p converted
name=$(jq -r '.Files[0].FileName' response.json)
jq -r '.Files[0].FileData' response.json \
| base64 --decode > "converted/$name"
else
cat response.json
fiimport base64
import os
import requests
key = os.environ["PDFCONVERSIONAPI_KEY"]
response = requests.post(
"https://api.pdfconversionapi.com/v2/convert/exr/to/pdf",
headers={"Authorization": f"Bearer {key}"},
files=[("File", open("glowing-bulb-render.exr", "rb"))],
data={
"MarginHorizontal": "6",
"MarginVertical": "6",
},
timeout=180,
)
result = response.json()
if not response.ok:
raise SystemExit(f"{result['Code']}: {result['Message']}")
os.makedirs("converted", exist_ok=True)
for file in result["Files"]:
path = os.path.join("converted", file["FileName"])
with open(path, "wb") as out:
out.write(base64.b64decode(file["FileData"]))
print(path, file["FileSize"], "bytes")
import { mkdir, readFile, writeFile } from "node:fs/promises";
import { join } from "node:path";
const form = new FormData();
const file = "glowing-bulb-render.exr";
form.append("File", new Blob([await readFile(file)]), file);
form.append("MarginHorizontal", "6");
form.append("MarginVertical", "6");
const url = "https://api.pdfconversionapi.com/v2/convert/exr/to/pdf";
const key = process.env.PDFCONVERSIONAPI_KEY;
const response = await fetch(url, {
method: "POST",
headers: { Authorization: `Bearer ${key}` },
body: form,
});
const result = await response.json();
if (!response.ok) {
throw new Error(`${result.Code}: ${result.Message}`);
}
await mkdir("converted", { recursive: true });
for (const file of result.Files) {
const path = join("converted", file.FileName);
await writeFile(path, Buffer.from(file.FileData, "base64"));
console.log(path, file.FileSize, "bytes");
}
{
"ConversionCost": 1,
"ConversionTime": 0.031,
"Files": [
{
"FileName": "glowing-bulb-render.pdf",
"FileExt": "pdf",
"FileSize": 164640,
"FileData": "JVBERi0xLjcKJYCAgIAKMSAw…"
}
]
}Response from our test run on 2026-11-03. ConversionTime shows the median of 5 runs. FileData is shortened here; the real response carries the whole file as base64.
The sample, converted
The same file the code sends. Download the input and the output and compare them yourself.

- Input
- glowing-bulb-render.exr (187 KB)
- Output
- glowing-bulb-render.pdf (161 KB)
- Source
- A glowing light bulb we drew in code and saved as a 240 × 300 OpenEXR render: half-float RGBA, premultiplied alpha, ZIP compression, values up to 12.0. (CC0-1.0). How it was made
- Made by
- 2026-11-04, API build
9eeeb0640aba
Parameters
Send these as form fields next to the file. Names are case-insensitive. If you set one of the documented options below that we don't support yet, the request fails with a 400 that names it instead of returning a file made without it.
| Parameter | What it does |
|---|---|
PageSizeenum, default default | Left out (or default, auto), the page is the render's size at 96 px per inch, 180 × 225 pt here. A named sheet centers the render without enlarging it: on a4 it stays 180 × 225 pt in the middle of the page.Values: default, auto, a3, a4, a5, letter, legal |
PageOrientationenum, default default | landscape swaps a named sheet's sides (letter becomes 792 × 612 pt). It does nothing when the page takes the render's size.Values: default, portrait, landscape |
Rotateinteger | Turns the render clockwise by this many degrees. 90 gave a 225 × 180 pt page; 45 gave a 286.38 pt square page holding the tilted frame.Values: -360 to 360 |
MarginHorizontalinteger, default 0 | Space left and right, in millimetres. The sample's 6 mm adds 17.01 pt on each side; on a fixed sheet the render shrinks if the margins leave too little room.Values: 0–500 (mm) |
MarginVerticalinteger, default 0 | Space above and below. PageSize=a5 with 300 mm side margins left no room and returned 400.Values: 0–500 (mm) |
FileNamestring | Base name of the PDF; FileName=studio-bulb gave studio-bulb.pdf. |
StoreFileboolean, default false | true keeps the PDF for 3 hours behind a link in Files[].Url. |
What carries over, and what doesn't
Kept
- 16 bits per channel: the image and its soft mask hold the same values as the PNG route, pixel for pixel
- Transparency, as a 16-bit soft mask beside a DeviceRGB image
- Size: one pixel per 0.75 pt, so 240 × 300 px draws as 180 × 225 pt (2.5 × 3.125 in)
Lost or not yet supported
- Color management. The image is plain DeviceRGB with no ICC profile, so its linear values display as if they were sRGB and look dark.
- Highlights over 1.0, which are stored as the 16-bit maximum.
- Proper soft edges: the colors keep their premultiplied values, so the halo is dimmer than in the render.
- Image options.
ImageWidth,ColorSpace,AlphaColorandImageResolutionare accepted and change nothing on this route.
Limits
- One EXR, one page, per request.
/v2/convert/images/to/pdfalso reads EXR files among several images, but embeds them at 8 bits per channel. - Up to 10 MB on the Free plan or 100 MB on paid plans per request.
- 100,000,000 pixels at most per render.
- Margins from 0 to 500 mm, and they must leave room for the image.
- 120 seconds, then the request ends with 504.
Where teams use it
Look-development sheets for sign-off
Art directors and clients can review renders as a PDF attached to a ticket or an email. One page per frame, with margins so the render doesn't touch the edge, is easy to annotate in any PDF reader.
Renders in generated reports
Build systems that assemble PDF reports can convert each EXR still to its own page, then join the pages with the merge route.
Questions
How big is the page?
Without PageSize, the page is the render at 96 pixels per inch plus your margins. The 240 × 300 sample is 180 × 225 pt, and 6 mm margins make the page 214.02 × 259.02 pt.
Can I put the render on A4 or Letter?
Yes, with PageSize. The render is centered and only ever shrunk to fit, never enlarged, so this small sample sits at 180 × 225 pt in the middle of an A4 sheet. Add PageOrientation=landscape for a wide sheet.
Does Rotate take any angle?
Any whole number of degrees from -360 to 360, turned clockwise. Quarter turns swap the page's width and height; other angles make the page large enough for the turned frame. Values outside that range return 400.
What shows through the transparent parts?
Whatever the viewer paints behind the page. The PDF draws no background of its own, so the soft mask lets the page color through around the bulb; the preview on this page was drawn on white.
Convert your first EXR file in a minute.