PUB to TIFF API
POST /v2/convert/pub/to/tiff returns all pages of a Microsoft Publisher file in one multi-page TIFF. Our 2-page flyer comes back as a single book-sale-flyer.tiff of 203,079 bytes holding two 1,275 × 1,650 RGB pages, LZW-compressed.
- Endpoint
- POST /v2/
convert/ pub/ to/ tiff - Accepts
- pub
- Sample timing
- 0.613 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/pub/to/tiff \
-H "Authorization: Bearer $PDFCONVERSIONAPI_KEY" \
-F File=@book-sale-flyer.pub \
-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/pub/to/tiff",
headers={"Authorization": f"Bearer {key}"},
files=[("File", open("book-sale-flyer.pub", "rb"))],
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 = "book-sale-flyer.pub";
form.append("File", new Blob([await readFile(file)]), file);
const url = "https://api.pdfconversionapi.com/v2/convert/pub/to/tiff";
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.613,
"Files": [
{
"FileName": "book-sale-flyer.tiff",
"FileExt": "tiff",
"FileSize": 203079,
"FileData": "SUkqAJYJAgABAAAAAQAAAAEA…"
}
]
}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
- book-sale-flyer.pub (10 KB)
- Output
- book-sale-flyer.tiff (198 KB)
- Source
- A two-page flyer for a fictional library book sale; we wrote our text and shapes into a small Publisher test file from an open-source office suite's test data (MPL-2.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 |
|---|---|
MultiPageboolean, default true | true puts every page in one LZW-compressed TIFF. false returns one uncompressed TIFF per page instead: 6,311,516 bytes each for the flyer, against 203,079 for both pages together. |
ImageResolutioninteger, default 150 | DPI of every page, written to the resolution tags when sent. 72 gave two 612 × 792 pages in an 81,506-byte file.Values: 36–600 |
ImageWidthinteger | Width of every page in pixels.Values: 1–20000 |
ImageHeightinteger | Height of every page in pixels.Values: 1–20000 |
ScaleProportionsboolean, default true | false stretches the pages to the exact box. |
ScaleImageboolean, default true | false crops instead of scaling. |
ScaleIfLargerboolean, default false | true keeps pages from being enlarged. |
TransparentColorstring | One exact color to clear on every page: white at 72 DPI cleared 366,681 of the 484,704 pixels of the front page.Values: color name, #RRGGBB or R,G,B |
ColorSpaceenum, default default | Applies to every page, and the multi-page file keeps the result: gray gives one-channel pages (122,199 bytes for the flyer), monochrome one-channel black and white (34,953 bytes), rgb the same three-channel file as the default (203,079 bytes). cmyk returns 400.Values: default, rgb, gray, monochrome |
PageRangestring | Pages to include. A single page, such as 1, comes back as a plain uncompressed TIFF, 6,311,516 bytes at 150 DPI. |
FileNamestring | Name of the TIFF: <stem>.tiff for the multi-page file, <stem>-1.tiff and so on for single pages. |
StoreFileboolean, default false | Return a 3-hour link instead of the file. |
Not supported yet
Setting one of these to anything but its default returns 400.
| Option | What to do instead |
|---|---|
TiffType | The multi-page file is always LZW-compressed, and ColorSpace sets gray or RGB pages; TiffType=gray returns 400 "TiffType is not supported yet for PUB → TIFF". |
ImageResolutionH, ImageResolutionV | Use ImageResolution. |
Also refused when set: FillOrder, TextAntialiasing, GraphicsAntialiasing, UseCIEColor.
What carries over, and what doesn't
Kept
- All pages, in order, in one file
- Exact pixels: LZW is lossless
- The page size: 1,275 × 1,650 per Letter page at 150 DPI
- The DPI tags when
ImageResolutionis sent (72 per inch in the 72 DPI probe)
Lost or not yet supported
- Compression on single pages: with
MultiPage=false, or aPageRangeof one page, each page is an uncompressed TIFF of 6,311,516 bytes at 150 DPI, 31 times the 203,079-byte LZW file that holds both pages. - 1-bit pages:
ColorSpace=monochromeleaves only black and white, but each page still takes a byte per pixel before compression (34,953 bytes for the flyer). - The DPI tags in the default output, which doesn't send
ImageResolution.
Limits
- Multi-page output is written only when more than one page is converted.
- 100,000,000 pixels and 16,000 pixels per side per page; 2,000 pages per request.
- Up to 10 MB on the Free plan or 100 MB on paid plans per request and 120 seconds per conversion.
Where teams use it
Filing a publication as one image document
Document management and records systems that store page images as multi-page TIFF can take a flyer or newsletter as one file, pages in order.
Print vendors that take TIFF
A vendor intake that wants raster pages at a given DPI can get the whole publication at ImageResolution=300 in a single upload.
Questions
Do I get one TIFF or one per page?
One, by default: MultiPage=true is ConvertAPI's documented default for this pair and ours, so the flyer comes back as book-sale-flyer.tiff with two pages. Send MultiPage=false for separate files.
Why is a single-page TIFF so much larger?
Pages written on their own are uncompressed, three bytes per pixel: 6,311,516 bytes for one Letter page at 150 DPI. The multi-page file uses LZW, which fits both pages in 203,079 bytes.
Can I get a gray or 1-bit TIFF?
Gray, yes: ColorSpace=gray stores each page of the multi-page file as one 8-bit channel, 122,199 bytes for the flyer. A 1-bit TIFF isn't available yet: monochrome pages hold only black and white but keep 8 bits per pixel, and TiffType returns 400. A single gray page, PageRange=1, is uncompressed: 2,103,972 bytes at 150 DPI.
Convert your first PUB file in a minute.