PPSX to PNG API
POST /v2/convert/ppsx/to/png draws slides as lossless PNG. Sent with PageRange=2-3 and ImageWidth=1280, our museum loop returned only the opening-hours table and the visitor chart, as 1,280 × 720 files of 84,825 and 52,026 bytes.
- Endpoint
- POST /v2/
convert/ ppsx/ to/ png - Accepts
- ppsx
- Sample timing
- 0.654 s 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/ppsx/to/png \
-H "Authorization: Bearer $PDFCONVERSIONAPI_KEY" \
-F File=@pilot-house-welcome.ppsx \
--form-string PageRange=2-3 \
--form-string ImageWidth=1280 \
-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/ppsx/to/png",
headers={"Authorization": f"Bearer {key}"},
files=[("File", open("pilot-house-welcome.ppsx", "rb"))],
data={
"PageRange": "2-3",
"ImageWidth": "1280",
},
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 = "pilot-house-welcome.ppsx";
form.append("File", new Blob([await readFile(file)]), file);
form.append("PageRange", "2-3");
form.append("ImageWidth", "1280");
const url = "https://api.pdfconversionapi.com/v2/convert/ppsx/to/png";
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.654,
"Files": [
{
"FileName": "pilot-house-welcome-2.png",
"FileExt": "png",
"FileSize": 84825,
"FileData": "iVBORw0KGgoAAAANSUhEUgAA…"
},
{
"FileName": "pilot-house-welcome-3.png",
"FileExt": "png",
"FileSize": 52026,
"FileData": "iVBORw0KGgoAAAANSUhEUgAA…"
}
]
}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
- pilot-house-welcome.ppsx (46 KB)
- Output
- pilot-house-welcome-2.png (83 KB)pilot-house-welcome-3.png (51 KB)
- Source
- A six-slide welcome loop for a fictional harbor museum, set to advance by itself, with one hidden staff slide. We made it for this page. (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 |
|---|---|
PageRangestring | Slides to draw, counted after hidden ones are taken out. Each file keeps its number: 2-3 gives pilot-house-welcome-2.png and -3.png. 6 returns 400, since the show plays 5 slides.Values: e.g. 2-3, 1,5 |
ImageWidthinteger | Exact width, height in proportion. 1280 gives 1,280 × 720 and 320 gives a 320 × 180 thumbnail.Values: 1–20,000 |
ImageResolutioninteger, default 150 | Pixels per inch of slide, also stored in the PNG when you send it. The default draws 1,999 × 1,125; 72 gives 959 × 540.Values: 36–600 |
TransparentColorstring | Pixels of exactly this color become transparent. white on the lamp-room slide cleared 71.8% of its pixels and left the text, title and picture.Values: a name, #RRGGBB or R,G,B |
ColorSpaceenum, default default | gray writes a one-channel PNG: 55,709 bytes for the welcome slide at 150 DPI, against 143,611 in color.Values: default, rgb, gray, monochrome |
ConvertHiddenSlidesboolean, default false | Draw hidden slides as well. The staff checklist becomes page 4 and the tour slide moves to 5. |
BackgroundColorstring, default white | Paints under each page where the slide leaves the image bare. Every slide in this show fills the image out to all four edges, so red and black gave the same pixels as no option on every slide, at 150 DPI and at 1,280 wide. |
Passwordstring | Needed for a show saved with a password; without it the API answers 422. |
FileNamestring | Replaces pilot-house-welcome in the file names; the page number stays. |
Not supported yet
Setting one of these to anything but its default returns 400.
| Option | What to do instead |
|---|---|
ConvertSpeakerNotes | Notes are not drawn. Values other than Disabled return 400. |
PageSize | The slide's own shape is used; any value but default returns 400 "PageSize is not supported yet for PPSX files". |
What carries over, and what doesn't
Kept
- Text edges with no compression noise, down to the small red holiday-hours line
- The chart's series colors as set in the deck: navy for adults, red for children
- The table's blue header row and banded rows
- RGB files with no alpha channel, until
TransparentColoradds one
Lost or not yet supported
- Playback: the 8-second timing, fades and loop.
- Calibri, drawn as Carlito, which has the same letter widths.
- The speaker note on the hours slide.
- Small files: the five slides at 150 DPI total 613,601 bytes as PNG and 289,358 as lossless WebP, for the same pixels.
Limits
- At most 2,000 pages per request.
- 16,000 pixels per side and 100 million pixels per page; larger requests get 413.
- Requests up to 10 MB on the Free plan or 100 MB on paid plans; 120 seconds for the conversion, then 504.
Where teams use it
Slides on a web page
Put the opening hours or the visitor chart from the lobby loop on the museum's site without retyping them. PageRange picks those slides, and PNG keeps small table text sharp.
Cut-outs for other layouts
With TransparentColor=white the white slide background drops away, so the title, text and picture can sit on a colored newsletter or flyer background.
Questions
Why do the files start at -2 instead of -1?
Each PNG is named after its page in the show, so PageRange=2-3 returns -2.png and -3.png. That keeps names stable when you render a few slides at a time.
Does BackgroundColor do anything for a slide show?
No. All six slides fill the image with their own background, right to every edge, so a red BackgroundColor gave the same pixels as leaving it out. To remove a background, use TransparentColor instead.
How do I make small thumbnails?
Send ImageWidth=320; the 16:9 slide gives 320 × 180. The welcome slide at that size is 13,019 bytes.
Which slide numbers does PageRange use?
The numbers of the slides the show plays. Slide 5 of the file, Lamp room tours, is page 4 because slide 4 is hidden. Add ConvertHiddenSlides=true and the file's own numbering applies.
Convert your first PPSX file in a minute.