WPD to JPG API
POST /v2/convert/wpd/to/jpg lays out a WordPerfect document and returns one JPEG per page. The sample sends ImageQuality=90 and gets hearing-notice-1.jpg and hearing-notice-2.jpg, each 1,275 × 1,650 pixels at the default 150 DPI.
- Endpoint
- POST /v2/
convert/ wpd/ to/ jpg - Accepts
- wpd
- Sample timing
- 0.609 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/wpd/to/jpg \
-H "Authorization: Bearer $PDFCONVERSIONAPI_KEY" \
-F File=@hearing-notice.wpd \
--form-string ImageQuality=90 \
-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/wpd/to/jpg",
headers={"Authorization": f"Bearer {key}"},
files=[("File", open("hearing-notice.wpd", "rb"))],
data={
"ImageQuality": "90",
},
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 = "hearing-notice.wpd";
form.append("File", new Blob([await readFile(file)]), file);
form.append("ImageQuality", "90");
const url = "https://api.pdfconversionapi.com/v2/convert/wpd/to/jpg";
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.609,
"Files": [
{
"FileName": "hearing-notice-1.jpg",
"FileExt": "jpg",
"FileSize": 189774,
"FileData": "/9j/4AAQSkZJRgABAgAAAQAB…"
},
{
"FileName": "hearing-notice-2.jpg",
"FileExt": "jpg",
"FileSize": 145121,
"FileData": "/9j/4AAQSkZJRgABAgAAAQAB…"
}
]
}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
- hearing-notice.wpd (1.8 KB)
- Output
- hearing-notice-1.jpg (185 KB)hearing-notice-2.jpg (142 KB)
- Source
- A two-page WordPerfect 5.1 public hearing notice for a fictional township, which we wrote byte by byte from the file format description (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 |
|---|---|
ImageQualityinteger, default 85 | JPEG compression level. Page 1 of the notice weighed 122,240 bytes at 50, 169,690 at the default 85, 189,774 at 90 and 313,968 at 100. 0 returns 400 "ImageQuality must be between 1 and 100".Values: 1 to 100 |
ImageResolutioninteger, default 150 | Dots per inch of paper. At 100 a Letter page is 850 × 1,100 pixels and the JPEG header says 100 DPI; when you leave it out the page is drawn at 150 and the header holds no DPI.Values: 36 to 600 |
ColorSpaceenum, default default | gray writes a one-channel JPEG: 156,359 bytes for page 1 at quality 90. cmyk returns 400 "ColorSpace cmyk is not supported yet; use rgb, gray or monochrome".Values: default, rgb, gray, monochrome |
PageRangestring | Pages to draw. PageRange=2 returns hearing-notice-2.jpg only; 3 returns 400 because the notice has 2 pages.Values: Page numbers and ranges |
ImageWidthinteger | Width in pixels, with the height following the Letter shape: 800 gave 800 × 1,035.Values: 1 to 20,000 |
ImageHeightinteger | Height in pixels. With ImageWidth too, the page fits inside that box unless ScaleProportions=false.Values: 1 to 20,000 |
BackgroundColorstring | Paper color. The notice has no fill of its own, so #fff4d6 turned the whole sheet cream around the black text.Values: Color name, #RRGGBB or R,G,B |
FileNamestring | Stem of the numbered files; hearing-notice unless you set it. |
StoreFileboolean, default false | Return links to the stored JPEGs, valid for 3 hours, in place of the image data. |
What carries over, and what doesn't
Kept
- The US Letter shape the document prints on: 1,275 × 1,650 pixels at 150 DPI, 850 × 1,100 at 100
- Every formatting code you can see on paper: the line through the first hearing date, the underlined comment deadline, the raised 'nd' and the small disclaimer at the foot of page 2
- Neutral black and white: the drawn page holds only shades of gray, so
ColorSpace=graychanges nothing you can see - One numbered file per page, in document order
Lost or not yet supported
- Crisp edges on small type: the 7.2 pt disclaimer is drawn at 15 pixels per em at 150 DPI, and JPEG compression softens edges more as quality drops.
- Text you can select or search. Use the PDF route when the words matter.
- A DPI value, unless you send
ImageResolution: the sample's JFIF header says only that pixels are square. - Transparency. JPEG has no alpha channel, so the page is always on an opaque background.
Limits
- Page setup options such as
PageSizeandPageOrientationreturn 400 "... is not supported yet for WPD files"; the paper size comes from the document. ImageResolutionoutside 36 to 600 returns 400 "ImageResolution must be between 36 and 600".- Up to 2,000 pages per request; a page over 100 million pixels returns 413, which
ImageWidth=9000already does for a Letter page. - Requests up to 10 MB on the Free plan or 100 MB on paid plans, all files and fields together, and 120 seconds per conversion (then 504).
Where teams use it
Previewing .wpd uploads
A document portal can't display a WordPerfect file in the browser. A JPEG of the first page (PageRange=1) shows users what they uploaded before anyone opens or downloads the original.
Pasting a page into a ticket or an email
When the person on the other end has nothing that opens .wpd, a page image is enough to read a notice or letter. At the default settings a full Letter page of the sample is 169,690 bytes.
Questions
Which ImageQuality suits pages of text?
The default 85 gave page 1 of the sample in 169,690 bytes with clean 12 pt body text. We used 90 for the sample. At 50 the file shrinks by 28% to 122,240 bytes and the body text was still easy to read in our test.
Why does the JPEG carry no DPI?
Pages are drawn at 150 DPI by default, but the number is written into the file only when you send ImageResolution. With ImageResolution=100 the header says 100 DPI and the page is 850 × 1,100 pixels.
Can I get grayscale JPEGs?
Yes, with ColorSpace=gray. The notice is black text on white to begin with, so it looks the same; the file drops from 189,774 to 156,359 bytes for page 1 at quality 90 because one channel is stored instead of three.
What happens to struck-out and superscript text?
Both are drawn as in the document. A line runs through 'January 12, 2027', which wraps from the end of one line to the start of the next, and the 'nd' after '2' sits raised in smaller type.
Convert your first WPD file in a minute.