Skip to content
Your files stay on your device

File processing runs in your browser. Documents are not uploaded to our servers. The site may download processing engines and send usage or feedback events without file contents.

How we handle your data

Choosing an OCR engine that runs in the browser

We compared Tesseract.js with PaddleOCR v5 and v6 tiny for scans that stay on the device. Why Tesseract runs the PDF tools in 23 languages.

By LaboratorU

During our October stress run, a Greek scan with the product code “P1” came back as “ΡΊ”. The engine was sure of itself. Its confidence score was high, so our low-confidence warning stayed silent, and the Hebrew model made the same mistake. The text looked plausible. It was wrong.

We have not fixed that one; the tool pages describe it. It shows the job well, though. An OCR engine on our sites has to read a scan inside the visitor’s browser, with no upload to a server, in every language the sites are translated into. When it fails, the page has to say so.

What we needed

Three Laboratory pages recognize text. Scanned PDF to Text reads scanned PDF pages and downloads the text in page order. Searchable PDF reads the same pages and adds an invisible, selectable text layer to a new PDF. Image to text · compare engines runs several engines on one PNG or JPEG image and shows the results side by side.

We set the constraints before we picked anything. No paid API and no document upload. Every engine file is served from our own sites. The engine has to run in Chromium and WebKit, and it has to stop cleanly when the visitor cancels.

What we tried

We started on 7 September 2026 with Tesseract.js 7.0.0 and English data. Our own PDF tools exported two synthetic image-only invoice pages, and we ran them in Chromium and WebKit over local loopback. Both pages read correctly, with an engine confidence of 95 on each. Start-up took about 0.76 and 0.84 seconds; start-up plus both pages took about 1.02 and 1.08 seconds. The page made no external requests. These are local numbers, and they say nothing about a phone or a slow network.

On 29 September we built a separate bench with 9 synthetic scans, again in Chromium and WebKit, and put PaddleOCR next to Tesseract. The error rates below come from that run.

Engine Model files What we saw
Tesseract.js 7.0.0 about 15 MB of assets with English data (10.9 MB of that is the compressed language file) Two synthetic invoice pages read correctly in Chromium and WebKit; engine confidence 95 on both
PaddleOCR PP-OCRv5 mobile 21.5 MB of detection and recognition models Has a Cyrillic recognition model
PaddleOCR PP-OCRv6 tiny 1.8 MB detection + 4.5 MB recognition About twice as fast as v5; character error rate on small compressed 13 px text fell from 0.25 to 0.10
PaddleOCR PP-OCRv6 small about 31 MB Best accuracy (error rate 0.04–0.10 on 13 px text), but 1.2–1.4 times slower than v5
onnxruntime-web 1.30 against 1.24.3 runtime for PaddleOCR No difference in speed or accuracy

The v6 tiny model was the one that stood out. It is the smallest in the table, it was about twice as fast as v5, and it made fewer errors on small text. The v6 small model was more accurate still, at about 31 MB and a slower run.

Scribe.js OCR never reached the bench. It is published under the AGPL, and our plan lists that licence as unusable without a commercial licence.

Why Tesseract runs the PDF pages

The text layer decided it. A searchable PDF needs the position of every recognized word, and Tesseract returns those boxes together with its own PDF renderer. We combine the rendered page images with that invisible layer using pdf-lib. Searchable PDF stays on Tesseract until a comparison shows a better engine for this job.

Languages were the second reason. The language menu offers 23 models: English plus Spanish, German, French, Italian, Portuguese, Norwegian, Danish, Swedish, Dutch, Finnish, Estonian, Czech, Hungarian, Croatian, Greek, Hebrew, Arabic, Russian, Japanese, Korean, Simplified and Traditional Chinese. Each non-English model can be combined with English for mixed documents, and the model for the page language is preselected. We added language data together with each new site language. The German model arrived with the German pages, and the four CJK models came with the Japanese, Korean and Chinese pages.

PaddleOCR went to the comparison page. There, Image to text · compare engines runs Tesseract, PaddleOCR v5 and PaddleOCR v6 tiny on the same image. The build script pins the PaddleOCR models by SHA-256 checksums. PP-OCRv6 has no Cyrillic model, so for Russian the v6 column says so, and the v5 column shows the result of the Cyrillic v5 model.

The PDF OCR pages have fixed limits in code. A PDF can be up to 10 MB and 10 pages. Pages are rendered at no more than 4 megapixels, the text is capped at 1 MB, a searchable output can be up to 30 MB, and each processing step gets 90 seconds. On first use the storefront page warns that the recognition files are about 26 MB, plus the language data.

Where it still fails

On 3 and 4 October the stress run fed generated scans in all 23 languages to the OCR pages: rotated pages, a 100 DPI A4 page, grain and salt-and-pepper noise, two columns, text over a picture, and one very dirty scan. Some of what broke belongs to the engines.

Every model we tried read two-column text in lines straight across both columns. The letters were right and the reading order was wrong. Restoring columns and tables after OCR is on our deferred list. Text printed on a coloured background came out partial: Tesseract confidence on those pages was 44–57, against 67–96 for clean and rotated pages. The very dirty scan, at 12 degrees with heavy noise, blur and low contrast, scored 10–32. The Arabic model loses words on a scan rotated 7 degrees. Then there is the “P1” that became “ΡΊ” in Greek and Hebrew.

What we could fix was our side. Before October, a weak page came back like any other. Now PDF OCR and the image comparison add a warning when the mean Tesseract confidence of a page is below 60: “Low recognition confidence: the text may be incomplete or wrong.” Only Tesseract reports a confidence, so the PaddleOCR columns have no such line.

Every scan we have tested so far is synthetic. We have not measured real phone photos, real office scans or phone memory use, and we would like to.

On the comparison page, Try a sample with English selected should give INVOICE, Total: 148.50 and Thank you. With your own scans, check the numbers against the original image whichever engine you use.

Image to text · compare engines and both PDF OCR tools are in the Laboratory on laboratoru.com.

Sources