Nobody searches for a blank PDF to read it. You need a fixture: a file with known properties you can feed an upload form, a parser, or a test suite, and trust that whatever breaks is your code's fault and not the file's.
That changes what "the right file" means. It is not a download. It is a file whose bytes you can account for.
What a Blank PDF Actually Is
A zero-byte file is not a PDF; every real parser rejects it. The minimum skeleton is four parts: a %PDF-1.4 header, a handful of body objects (catalog, page tree, page), a cross-reference table of byte offsets, and a trailer ending in %%EOF. A page needs no content stream at all; /MediaBox alone renders a blank sheet.
Measured with pdf-lib, the library this site is built on:
| File | Bytes |
|---|---|
| Hand-built minimal valid PDF | 329 |
| pdf-lib, one blank Letter page | 577 |
| pdf-lib, 100 blank pages | 1,736 |
| pdf-lib, 1,000 blank pages | 12,713 |
| One page + one fillable text field | 1,521 |
| One page + text, checkbox, dropdown, radio | 5,380 |
Two facts fall out of that table. Blank pages are nearly free, about 12 bytes each, so a thousand of them fit in 13 KB. And you cannot make a "1 MB blank PDF" by adding pages. Size comes from content (images and fonts), not from page count.
Why "a 1 MB PDF" Is a Real Request
The searches that look strangest (sample pdf 10 mb, dummy pdf 1mb, blank pdf 100 pages) are boundary probes. Somewhere upstream of you is a limit with a number on it:
| Wall | Default limit |
|---|---|
nginx client_max_body_size |
1 MB |
PHP upload_max_filesize |
2 MB |
| AWS API Gateway payload | 10 MB |
| Gmail attachment | 25 MB |
"A 1 MB PDF" is not a document. It is the answer to "does the upload form reject exactly at the limit, or one byte early?" For that test you need a file of a known size, which is the thing a fixed download can never give you, and a generator can.
Blank, Fillable, or Sample: Pick the Right Fixture
The three words people type are three different files.
Blank is the minimal repro. Does your parser handle a page with no content stream, zero fonts, no metadata? A 577-byte blank page is the smallest honest input a PDF pipeline can see.
Fillable means AcroForm fields, and it is a different object graph: the catalog gains an /AcroForm dictionary, each field is a /FT /Tx (text), /Btn (checkbox) or /Ch (dropdown) object holding the value, and the visible box is a separate /Widget annotation holding the rectangle. One field costs about a kilobyte of overhead. Searching "blank PDF" when you need a form fixture gets you the wrong file.
Sample usually means "a file with known contents" (real text, maybe a table, a known page count) for testing extraction or RAG ingestion. The degenerate case matters there too: a blank PDF is how you check the loader returns zero chunks instead of crashing.
Generate It Instead of Downloading It
The incumbent sites (file-examples.com, sample-files.com, smallpdf's sample page) all ship fixed files at fixed sizes. Two problems with that. The size you need is never the size they picked; sample-files.com's own table contradicts itself, listing its 20-page file at both 42 KB and 3.5 MB. And a downloaded fixture is someone else's bytes: producer strings, metadata, occasionally junk you did not ask for and cannot see.
A generated file is deterministic. Same inputs, same bytes, reproducible in CI, with nothing in it you did not put there.
Making One Now
- Open Create PDF
- Pick a page size (A3, A4, A5, Letter, Legal, or an e-ink device size) and a page count up to 100
- Choose plain, or a pattern if what you actually wanted was paper: lined, grid, dot grid, Cornell
- Download. It generates in your browser, so the fixture's bytes are yours alone
For the fillable case, PDF to Form converts an existing form PDF into a web form, and Flatten PDF bakes filled fields into the page when you need the opposite. If the "blank PDF" you wanted was really printable paper, Graph Paper and Lined Paper generate ruled sheets at true size.
The file was never the point. The known quantity was.
Make a blank PDF — generated in your browser, nothing uploaded.
Rohman

