Skip to content

OCR a PDF

Add a searchable text layer to a scanned document.

Processed on your device

This tool runs entirely in your browser. Your file is never uploaded, and you can verify that in your browser's network tab. Verify it yourself: open your browser's network tab and watch. You will see one small request asking whether you have tasks left - a tool name and a hash, never the file.

What this does

A scanned PDF is a picture of a document, so searching it finds nothing and selecting a word selects nothing. This renders each page, recognises the words on it, and draws them back over the image invisibly, so the page looks as it did and the words are suddenly there. Recognised pages are rebuilt from that rendering: they come out grayscale at the resolution you chose, and any links, form fields or annotations they carried do not survive. Pages that already have real text are left alone, byte for byte.

Reach for it whenever a document arrived as pictures rather than words: a contract someone scanned and emailed, a receipt photographed on a phone, a fifty-page report from an office machine, or an old paper you need to quote from without retyping it.

How it works

  1. Drop the scan onto this page. PDFs work, and so do JPEG, PNG, WebP and TIFF images - an image becomes a one-page PDF first.
  2. Choose the language. English and Indonesian are installed, and the combined mode recognises both at once in a document that mixes them.
  3. Leave the mode on only pages without text unless you know for certain that every page is a scan.
  4. Set the resolution if you need to. 300 dpi suits ordinary print; go towards 400 for very small type, or down towards 150 for a long document on a slow machine.
  5. Choose whether you want the searchable PDF, a plain text file, or both, then press Run OCR.

Recognition costs something on the pages it touches, and it is better to know before than after. Each recognised page is rendered to a grayscale image at your chosen resolution, and the new page is that image with the invisible words drawn over it. Colour on those pages is gone, and their links, form fields and annotations are not carried across. Skipped pages are copied untouched. The file usually grows, sometimes a lot, because a 300 dpi page image is bigger than the compressed scan it replaced - Compress PDF is the normal second step.

The words have to land in the right place or a text layer is worse than none. The recogniser returns each word's box in the pixels of the rendered image, counting down from the top, while a PDF page counts up from the bottom, so every box is scaled by the render ratio and flipped. Words scored below 40 out of 100 are left out entirely: a confidently wrong word sends search to the wrong page, while a gap only sends it nowhere.

Nothing is uploaded, and that includes the recogniser itself. tesseract.js fetches its WebAssembly core and its language data from a third-party CDN unless told otherwise, which would have meant your scan quietly announcing itself to a third party the first time anyone here ran OCR, so all of it is served from this site instead. The cost is a one-off download. The benefit is that recognition involves nobody else at all, which you are welcome to check in the network tab.

Resolution decides both how accurate the reading is and how long you wait for it. Below about 200 dpi, thin serifs and small print break up and accuracy falls away quickly. Above 300 the gains get small while render time and output size keep climbing. 300 is the default because that is roughly where the curve flattens for ordinary body text.

What this tool cannot do

  • Handwriting is not recognised. The engine is trained on printed type, and a handwritten page comes back as scattered nonsense rather than words.
  • Only English and Indonesian models are installed, so a document in another language cannot be read properly here.
  • Recognised pages are rebuilt as grayscale images, so colour is lost on them and their links, form fields and annotations do not survive.
  • The output is a machine's reading, not a proofread transcript. Faint scans, unusual typefaces, tables and tight columns all produce mistakes.

Questions people ask

How accurate is the recognition?
On a clean 300 dpi scan of printed text, a page usually comes back with only a handful of errors, and the result reports an average confidence score so you can see how the engine judged its own work. Faint photocopies, skewed pages, tight columns and decorative typefaces all push that down. Words scored under 40 out of 100 are dropped rather than guessed at.
Which languages can it read?
English and Indonesian, plus a combined mode that handles both within the same document - useful for a contract printed alongside its translation. The language model is what makes recognition work at all, and only those two are shipped, so a document in another language is not something this tool can do well.
Why did it download several megabytes the first time?
That is the recogniser and its language data, served from this site rather than from a third-party CDN so that running OCR does not quietly contact somebody else. English is about 11 MB, Indonesian about 4 MB. Your browser caches them, so the second run starts immediately, and from then on the recogniser loads from that cache rather than over the network.
What does only pages without text actually do?
It examines each page for an existing text layer and recognises only the ones that have none. Most scanned documents contain at least one page that was never scanned, and running OCR over it replaces accurate text with an approximation. If the whole document already has text, the tool says so instead of running and producing something worse than what you started with.
Can it read handwriting?
No. The engine is trained on printed type, and handwriting comes back as noise - letters that resemble the shapes rather than the words. A signature, a note in a margin or a form filled in by hand will not be recognised. Printed text on the same page still will be.
Is the scan uploaded anywhere?
No. Rendering happens in one Web Worker in your browser and recognition in another, and even the WebAssembly core and the language data come from this site's own origin rather than a CDN. Check it directly: open the network tab and run a scan through. You will see the language data load, and one small request asking whether you have tasks left, and not the page you scanned.

Related tools