PDF Viewer
Open a PDF and read it in a full-screen reader — continuous scrolling, zoom, and a dark surface by default. The file is opened by your own browser, so it is never uploaded, which makes this safe for contracts, statements and scans you would not hand to a website.
Runs entirely in your browser — nothing is uploaded
Drop a PDF here to view it
Opens full screen. Nothing is uploaded — your browser does the reading.
How to use it
- Drop a PDF onto the box above, or click Choose a file. The reader opens full screen.
- Scroll to read. Pages run continuously, one after another, like any document viewer.
- To jump somewhere specific, type a page number in the toolbar and press Enter. The indicator also follows your scrolling, so it always says where you are.
- Use − and + to zoom. 100% means fitted to the width of the reader.
- Use ☀ / ☾ to switch between the dark and light reading surface. Dark is the default.
- Click ← Close or press Escape when you are done — that releases the file from memory and returns you to this page.
How it works
This viewer is built on pdf.js, the PDF rendering engine Mozilla develops and ships inside Firefox. It is written entirely in JavaScript and WebAssembly, which is what makes a genuinely local PDF viewer possible: the parsing, font handling and rasterising all happen in your browser rather than on a server that returns page images.
When you open a file, its bytes are read into memory and handed to pdf.js, which parses the document structure in a background worker thread — that is why the interface stays responsive on a large file. Opening the document only reads its catalogue and page tree, not the page contents.
Continuous scrolling without rendering everything
Scrolling through a whole document and rendering a whole document are different things, and conflating them is how browser-based readers run out of memory. A single A4 page rasterised at a modern screen’s pixel density is around 18 MB of canvas. Painting four hundred of them would ask for several gigabytes.
So the reader separates the two. Every page immediately gets a correctly sized box — measured from the document’s own page geometry, which is metadata rather than content — so the scrollbar tells the truth about how long the document is and jumping to page 380 lands in the right place. But only the handful of pages near your scroll position are actually painted onto canvases. The browser reports which pages are approaching the viewport, those get rendered, and pages that scroll away have their canvases released back to the browser. Memory therefore stays flat: a four-hundred-page document costs the same as a four-page one.
Because each page’s box is white before its canvas paints, scrolling never flashes — you see paper, then the content appears on it. A render still in progress is cancelled if you scroll past it or change the zoom, so a fast scroll cannot leave half-drawn pages behind or queue up work you no longer want.
Zooming does not touch the document at all. Page geometry was measured once at open time, so a new zoom level is arithmetic on numbers already in memory; only the visible canvases are repainted at the new scale.
The dark surface
Dark is the default because a reader is something you look at for a while, and a black surface around white paper is easier on the eyes than a bright field. The pages themselves are always rendered white in both themes. Inverting the actual page content is a different feature from a dark interface — it wrecks photographs, logos, charts and scanned documents — so the theme changes the surrounding surface and leaves your document looking like your document.
Self-hosted supporting assets
Two extra pieces are fetched from this site when a document needs them. Character maps translate the encodings used by CJK text, and font metrics cover the fourteen standard PDF fonts for documents that reference rather than embed them. Most viewers load these from a public CDN; they are served from our own origin here so that viewing a document does not tell a third party anything.
Tips
- The page indicator is two-way: it follows your scrolling, and typing a number scrolls there. Out-of-range numbers clamp to the last page rather than erroring.
- Zoom is fit-relative, so 100% means “fitted to the reader’s width”. For reading fine print on a scan, jump to 200% or higher — the reader scrolls sideways when a page is wider than the window.
- If a page stays blank, give it a moment: a scanned page carrying a very large image takes longer to paint than a page of text. Some PDFs also place content outside the declared page box, where zooming can help find it.
- Viewing does not modify the file. If you need pages rotated or removed, the changes have to be made and saved with a tool that edits the document.
Frequently asked questions
Is my PDF uploaded to a server?
Why use this instead of my browser’s built-in PDF viewer?
Is there a file size limit?
Can it open password-protected PDFs?
Why does text in some PDFs look slightly different from my desktop reader?
Can I edit, annotate or fill in forms?
Can I read in dark mode?
Can I select and copy text from the page?
Does it work offline?
Related tools
Merge PDF
Combine several PDFs into one file and drag the pages into the order you want before merging.
Split PDF
Pull out a page range or split every page of a PDF into its own separate file.
Compress PDF
Shrink a PDF by re-encoding the images inside it, with a quality setting you control.
PDF to Image
Export each page of a PDF as a JPG or PNG image file.
Browse every tool in PDF Tools.
Found a bug or want a feature? Tell us — ToolStash is built from user requests.