NewConnect Claude, Gemini, ChatGPT, and other AI agents to API Ninjas via our MCP server →

PDF to PNG API

PNG keeps every pixel exactly as the page was drawn. On pages built from type, rules and flat color, such as contracts, spreadsheets, charts, floor plans and wiring diagrams, that means not a speck of blur around a letter or a line. It matters whenever software reads the image next, or someone enlarges, crops or compares it.

The PDF to PNG API is the PDF to Image API with format=png. You get each page as a lossless PNG inside JSON, next to the page's text, or a single page as raw .png bytes when you send Accept: image/png.

Each page counts as 10 API calls against your monthly quota. Requests that fail are not counted, and the X-Api-Calls-Charged response header shows how many API calls each request used. See pricing.

Where PNG Beats JPG

  • Fine print. Footnotes, legal terms and the digits in table cells keep hard edges at any zoom level.
  • Line art, charts and diagrams. Hairlines and solid fills stay solid, with no halo along the edges.
  • Input for OCR and models. No compression noise for a text recognizer or a vision model to misread.
  • More processing later. Crop, annotate, diff two revisions of a drawing, or re-encode for the web later, without losses piling up.

On text-heavy pages the lossless format costs little: about a fifth more than JPG at 72 and 150 DPI, and the same size at 300 DPI.

When Not to Use PNG

  • Scans and photo pages. PNG comes out 5 to 6 times larger than JPG with nothing visible gained; the PDF to JPG API suits them better.
  • Images for web pages. WebP (format=webp) is roughly half the size of JPG and far smaller than PNG.
  • Many pages per call at 300 DPI. Big PNGs leave room for only a few pages in each response.
  • Transparent backgrounds. Pages are always drawn on white, so PNG output has a white background like every other format.

PNG vs JPG vs WebP: Size per Page

Page contentdpiPNGJPGWebPPNG vs JPG
Text (a contract)72150 KB120 KB70 KB1.2x
150430 KB360 KB210 KB1.2x
300920 KB920 KB460 KB1.0x
Tables (a data dictionary)7290 KB90 KB50 KB1.0x
150310 KB300 KB150 KB1.0x
300740 KB840 KB350 KB0.9x
Photos72240 KB40 KB30 KB6x
150760 KB140 KB80 KB5x
3002.6 MB450 KB240 KB6x

Measured on three sample documents, rounded; JPG and WebP at their default quality of 85. At 300 DPI, PNG is no larger than JPG on text and tables.

Save One Page as a PNG File (Node.js)

Send Accept: image/png together with format=png and the response body is the PNG itself, for the first page in pages. This script posts the PDF as the raw request body and writes page 3 of a wiring diagram to disk:

// Node.js 18+, no packages needed: save page 3 of a PDF as a PNG file const fs = require('fs'); async function savePageAsPng(pdfPath, pageNumber, pngPath) { const response = await fetch( `https://api.api-ninjas.com/v1/pdftoimage?format=png&dpi=200&pages=${pageNumber}`, { method: 'POST', headers: { 'X-Api-Key': 'YOUR_API_KEY', 'Content-Type': 'application/pdf', // the body is the PDF itself 'Accept': 'image/png', // reply with the PNG bytes, not JSON }, body: fs.readFileSync(pdfPath), }); if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`); fs.writeFileSync(pngPath, Buffer.from(await response.arrayBuffer())); } savePageAsPng('wiring-diagram.pdf', 3, 'wiring-diagram-page-3.png').catch(console.error);
Response too large? One response holds about 4 MB of images. A photo page at 300 DPI is around 2.6 MB as PNG, so it travels alone and next_page points at the following page. When a single page is too big by itself, the request fails with Page 1 is too large to return at 300 DPI as PNG. Use a lower dpi or format=jpg. Lower dpi, ask for fewer pages at a time with pages, or send photo pages as JPG.

https://api.api-ninjas.com/v1/pdftoimage

Converts the pages of a PDF to lossless PNG images with format=png. Returns each page as a base64 image with its size and its text, or one page as a raw image file. Accepts GET or POST: use POST to upload the PDF, or GET with url.

Parameters

Send the PDF in one of three ways: as file (a multipart form upload), as url, or as the raw request body with Content-Type: application/pdf (up to about 4 MB). The other parameters can be query parameters or multipart form fields.

  • file  optional

    The PDF, as a multipart form upload (multipart/form-data), up to about 4 MB. Send one PDF per request.

  • url  optional

    A public http:// or https:// link to the PDF, up to 25 MB, e.g. https://example.com/report.pdf. Works with GET or POST.

  • pages  optional

    The pages to convert: one page (1), a range (2-5), a list (1,3,7-9) or a range to the end (4-, page 4 to the last page). Page 1 is the first page. Default: every page, up to 10 per request (see limits).

  • format  set to png

    png for PNG images. Without it the endpoint returns JPGs (jpg, the default); webp is also available. The live demo offers all three so you can compare sizes.

  • dpi  optional

    Resolution in dots per inch, from 30 to 300. Default 150. At 150 DPI a US Letter page is about 1275 x 1650 pixels; at 300 DPI, 2550 x 3300.

  • password  optional

    The password of a password-protected PDF.

Headers

  • X-Api-Key  required

    API Key associated with your account.

  • Accept  optional

    image/png or image/* returns the first requested page as a raw image file instead of JSON. Send it together with format=png.

  • Content-Type  optional

    application/pdf when the request body is the PDF itself. Multipart uploads set their own content type.

Response

The /v1/pdftoimage endpoint returns a JSON object with the following fields, or an error if the request is unsuccessful (see errors).

  • page_count

    Number of pages in the PDF.

  • next_page

    The next requested page that is not in this response, because of the per-request limits, or null when every requested page was returned. To continue, send the same request with pages starting at next_page, e.g. pages=11-.

  • pages

    The converted pages, in the order requested, each with the fields below.

  • pages[].page

    Page number in the PDF (1 is the first page).

  • pages[].format

    jpg, png or webp.

  • pages[].width, pages[].height

    Image size in pixels.

  • pages[].text

    The text on the page, as plain text. Empty for scanned pages, whose text is part of an image; to read those, send the page image to the Image to Text API.

  • pages[].image

    The image file, base64-encoded.

With an image Accept header, the response body is the raw image of the first requested page, with Content-Type image/png. Every successful response has an X-Api-Calls-Charged header with the number of API calls the request counted.

Limits

  • Up to 10 pages per request.
  • Each response carries up to about 4 MB of images. At high DPI fewer pages fit (around four text pages at 300 DPI); the rest are left for the next request, from next_page.
  • Pages wider or taller than 5,000 pixels, or larger than 12 megapixels, at the requested DPI are scaled down to fit.
  • Uploads up to about 4 MB; PDFs from url up to 25 MB.

API Calls

Each page returned counts as 10 API calls: a response with 3 pages counts as 30. Requests that fail are not counted. If your remaining quota covers fewer pages than you asked for, the response returns the pages it covers, and next_page points at the rest.

Live Demo

Live demo · no API key required
Form data and query parameters
file
Using the sample invoice PDF (2 pages) until you choose a file.
pages
format
dpi

Get a free API key to get started — no credit card required.

Headers
X-Api-KeyLog in or sign up to get your API key
POST
https://api.api-ninjas.com/v1/pdftoimage?pages=1&format=png&dpi=150
Sample response
Page 1 of the PDF as PNG
Page 1: 1275 x 1651 px PNG
{
"page_count": 2,
"next_page": null,
"pages": [
{
"page": 1,
"format": "png",
"width": 1275,
"height": 1651,
"text": "INVOICE Example Supplies Ltd.\n100 Example Street\nSpringfield, ST 00000\nInvoice number INV-1042\nInvoice date 2026-11-04\nDue date 2026-12-04\nBill to\nSample Customer Inc.\n200 Sample Avenue\nRiverside, ST 00000\nItem Qty Unit price Amount\nCopy paper, 500 sheets 10 6.50 65.00\nToner cartridge 2 48.00 96.00\nDesk organizer 3 12.00 36.00\nBallpoint pens, box of 12 5 4.20 21.00\nSubtotal 218.00\nTax (8%) 17.44\nTotal due USD 235.44\nThank you for your business. Page 1 of 2",
"image": "iVBORw0KGgoAAAANSUhEUgAABPsAAAZzCAIAAAAC+qX8AAEAAElEQVR4nOzd..."
}
]
}

The live demo converts one page at up to 150 DPI, from PDFs up to 2 MB. No API key is needed to try it.

Code Examples

# Convert pages of document.pdf; the JSON holds each page as a base64 image curl -X POST "https://api.api-ninjas.com/v1/pdftoimage?pages=1-3&format=png&dpi=150" \ -H "X-Api-Key: YOUR_API_KEY" \ -F "file=@document.pdf" # Or save page 1 as a PNG file curl -X POST "https://api.api-ninjas.com/v1/pdftoimage?pages=1&format=png&dpi=150" \ -H "X-Api-Key: YOUR_API_KEY" \ -H "Accept: image/png" \ -F "file=@document.pdf" \ --output page-1.png

Errors

An invalid request returns HTTP 400 with a JSON body holding a readable error message, and is not counted against your quota. Authentication and quota errors use the standard format described in error codes.

CauseExample error
No PDF in the requestSend a PDF as file (a multipart form upload) or as url (a link to the PDF).
The file is not a PDFThe file is not a PDF.
A password-protected PDF without passwordThis PDF is password-protected. Send its password in the password parameter.
A wrong passwordThe password is incorrect for this PDF.
pages outside the PDF, e.g. pages=5 for a 3-page PDFpages is outside this PDF, which has 3 pages.
A pages value that is not a page listpages must be page numbers or ranges such as 1, 2-5, 1,3,7-9 or 4- (page 4 to the end).
A format other than jpg, png or webpformat must be jpg, png or webp.
A number out of range, e.g. dpi=600dpi must be between 30 and 300.
A PDF at url over 25 MBThe PDF at url is larger than 25 MB.
One page alone is too large for a responsePage 1 is too large to return at 300 DPI as PNG. Use a lower dpi or format=jpg.

Frequently Asked Questions

  • Yes, but you must have a premium subscription. Commercial use of the PDF to PNG API is not permitted on the free tier. See our pricing page to choose a plan that fits your needs.
  • Sign up for a free account to instantly get your API key, then pass it in the X-Api-Key header on every request. The documentation above includes ready-to-run examples in cURL, Python, JavaScript, Node.js, and more.
  • Your API requests will simply be denied once you hit your monthly quota — you will never be charged more than the plan you signed up for. To increase your quota, you can upgrade your plan any time on our pricing page.
  • The API responds with a standard HTTP status code and a JSON error message describing the problem. See our error codes reference for the full list of codes and how to resolve each one, or contact support if you need help.
  • Send the PDF to /v1/pdftoimage with format=png: as a multipart file upload, as the raw body with Content-Type: application/pdf, or as a url. The JSON response holds each page as a base64 PNG with its size and text. With Accept: image/png as well, the response is the PNG of the first requested page as a file.
  • No. Every page is drawn on a white background, the way it looks in a PDF viewer or on paper, and PNG output has that white background too.
  • Often, yes: PNG has no compression noise around letters for a recognizer to stumble on, and at 300 DPI a text page is about the same size in both formats (around 920 KB in our measurements). PDFs that contain real text, rather than scans, don't need OCR at all: each page's text field already holds it. For scanned pages, send the images to the Image to Text API.
  • Pages made of photos or scans compress poorly without loss: in our measurements a photo page was 5 to 6 times larger as PNG than as JPG, for example about 760 KB against 140 KB at 150 DPI. Text and table pages stay close to JPG size. For photo-heavy PDFs, use the PDF to JPG API or format=webp.
  • No. PNG is lossless, so quality only applies to jpg and webp. The size of a PNG depends on dpi and on what is on the page.