XLSB to JPG API
Upload an .xlsb workbook to POST /v2/convert/xlsb/to/jpg and get a JPEG of each printed page. The sample stores no page setup, so it sends PageSize=letter with ImageResolution=100 and gets two 850 × 1,100 images.
- Endpoint
- POST /v2/
convert/ xlsb/ to/ jpg - Accepts
- xlsb
- Sample timing
- 0.773 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/xlsb/to/jpg \
-H "Authorization: Bearer $PDFCONVERSIONAPI_KEY" \
-F File=@meter-readings.xlsb \
--form-string PageSize=letter \
--form-string ImageResolution=100 \
-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/xlsb/to/jpg",
headers={"Authorization": f"Bearer {key}"},
files=[("File", open("meter-readings.xlsb", "rb"))],
data={
"PageSize": "letter",
"ImageResolution": "100",
},
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 = "meter-readings.xlsb";
form.append("File", new Blob([await readFile(file)]), file);
form.append("PageSize", "letter");
form.append("ImageResolution", "100");
const url = "https://api.pdfconversionapi.com/v2/convert/xlsb/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.773,
"Files": [
{
"FileName": "meter-readings-1.jpg",
"FileExt": "jpg",
"FileSize": 83920,
"FileData": "/9j/4AAQSkZJRgABAgEAZABk…"
},
{
"FileName": "meter-readings-2.jpg",
"FileExt": "jpg",
"FileSize": 40434,
"FileData": "/9j/4AAQSkZJRgABAgEAZABk…"
}
]
}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
- meter-readings.xlsb (3.3 KB)
- Output
- meter-readings-1.jpg (82 KB)meter-readings-2.jpg (39 KB)
- Source
- A fictional cold-storage unit's meter readings in Excel binary format (two sheets with dates, times and formulas) that we wrote record by record for this site (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 | Paper for every printed sheet. The sample has no page setup, so default prints it on A4 (1,240 × 1,753 at 150 DPI); letter gives 8.5 × 11 inch pages instead.Values: default, letter, lettersmall, tabloid, ledger, legal, statement, executive, a3, a4, a4small, a5, b4, b5 |
ImageResolutioninteger, default 150 | Pixels per inch. At 100 a Letter page is 850 × 1,100 and the JPEG records 100 DPI; left out, pages are drawn at 150 and no DPI is stored. ConvertAPI's image default is 200.Values: 36–600 |
ImageQualityinteger, default 85 | JPEG quality. The sample's Readings page at 100 DPI is 83,920 bytes at the default and 59,389 at 50.Values: 1–100 |
PageOrientationenum, default default | Turn every printed sheet. landscape with the default paper gives 1,169 × 826 pixels at 100 DPI.Values: default, portrait, landscape |
WorksheetNamestring | Print only this sheet, matched without regard to case, for example Daily. |
PageRangestring | Printed pages to draw: the sample's Readings sheet is page 1 and Daily is page 2.Values: e.g. 1, 2, 1-2 |
Passwordstring | Open password of an encrypted .xlsb. In our test, an encrypted copy of the sample printed with the right password and returned 422 "the input file is password-protected" without it. |
What carries over, and what doesn't
Kept
- Date and time formats stored in the binary file: the Readings column prints as 2026-03-02 00:00 through 2026-03-02 23:00
- Two-decimal numbers (3.18, 101.29), bold headers and the TRUE/FALSE peak flags
- The stored results of the SUM and AVERAGE formulas: Total 101.29 and Average 96.86
- Both sheets in tab order, one JPEG each
Lost or not yet supported
- A sheet without page setup prints on A4, not Letter. Send
PageSizewhen you need a specific paper. - Gridlines aren't printed, as in Excel's default print settings, so a sheet without cell borders shows plain columns of numbers.
- Calibri is drawn with Carlito, a font with the same letter widths.
- JPEG compression softens small text; the PNG route keeps it sharp.
Limits
- Up to 2,000 pages per request; pages at most 16,000 pixels per side and 100 million pixels.
- Requests up to 10 MB on the Free plan or 100 MB on paid plans; 120 seconds per conversion, then 504.
- A file that is not an XLSB returns 422 "the input file could not be read: it could not be opened as XLSB".
Where teams use it
Previews of large data workbooks
Show what an XLSB data workbook holds without downloading or opening it: a JPEG of its first page is enough to recognize the file in a list.
Sharing a daily readings sheet as a picture
Send the printed page of an operations log to a channel or an email where people only need to look, not edit.
Questions
Why did my XLSB print on A4 paper?
When a sheet stores no page setup, the default paper of the office engine is A4. The sample has none, which is why it sends PageSize=letter. Sheets that do store a paper size print on it unless you override it.
Do macros in the .xlsb run?
No. XLSB files can carry VBA, but every conversion starts the office suite with a new profile in which macro execution is switched off.
Can I convert XLSB to XLSX instead?
There is no xlsb/to/xlsx route; it returns 404. For the data, /v2/convert/xlsb/to/json and xlsb/to/csv read the binary format directly, and xlsb/to/pdf prints it.
Convert your first XLSB file in a minute.