PaddleOCR in your browser#
Images never leave your devicePrivate by design#
The page downloads the model, not your image. Recognition happens in this tab with ONNX Runtime Web — close the tab and nothing remains except the cached model.
50 languages, one model#
PP-OCRv6 small reads Chinese (simplified and traditional), English, Japanese and 46 Latin-script languages without switching models. The tiny tier covers 49 (no Japanese).
Same output as Python#
You get rec_texts, rec_scores and polygons in the same shape PaddleOCR 3.7 returns, plus a ready-to-run Python script for your own machine.
How this online PaddleOCR works#
This page loads PaddleOCR.js, the official browser SDK published by the PaddleOCR team as @paddleocr/paddleocr-js. It runs the same two-stage pipeline as the Python library:1
Both models run through ONNX Runtime Web. The SDK picks WebGPU when your browser exposes it and falls back to WebAssembly otherwise. The model files come from Baidu's official CDN; if that fails, this page fetches the identical ONNX export from the PaddlePaddle organisation on Hugging Face. Either way they are stored in your browser's cache, so the second visit starts in seconds.3
Which model should you pick?#
| Model | Download | Languages | Best for |
|---|---|---|---|
| PP-OCRv6 small | 31.2 MB | 50 (incl. Japanese) | Default. The most accurate model the browser SDK ships. |
| PP-OCRv6 tiny | 6.3 MB | 49 (no Japanese) | Phones and slow connections; quick checks of Latin or Chinese text. |
| PP-OCRv5 mobile | 21.5 MB | Chinese, English, Japanese | Comparing against the previous generation. |
The server-grade PP-OCRv6 medium model (the default in Python) isn't offered by the browser SDK. In our CPU benchmark small matched medium exactly on three of our five test documents and made one extra character error on each receipt, so it is a fair preview of what the Python library gives you.
PaddleOCR.js 0.4.2, WebAssembly backend, our 4-vCPU test machine. Lower is faster.
| Model | Seconds |
|---|---|
| PP-OCRv6 tiny | 1.14 s |
| PP-OCRv6 small | 5.82 s |
Tips for better results#
- Crop to the text. Large photos are downscaled before detection, so small print on a big photo can get lost. Cropping is the single biggest win.
- Text missing? Open Detection settings and lower
text_det_box_thresh(for example to 0.4). Faint or low-contrast text often clears the threshold then. - Letters cut off at the edges? Raise
text_det_unclip_ratioto 2.0 so boxes are drawn a little wider. - Rotated pages work up to a moderate tilt (our receipt photo is turned 7.5° and read perfectly). For pages upside down or sideways, the Python pipeline's
use_doc_orientation_classify=Truefixes orientation first. - Use the confidence slider to hide shaky lines. Red boxes are below 0.80, which is where most misreads sit.
Browser vs Python: what's different?#
| This online tool (PaddleOCR.js) | Python library (PaddleOCR 3.7) | |
|---|---|---|
| Install | None | pip install + an inference engine |
| Models | PP-OCRv6 small/tiny, PP-OCRv5 mobile | All, including PP-OCRv6 medium and 100+ languages |
| PDFs | No — export a page as an image | Yes, multi-page |
| Tables, layout, formulas | No | Yes, with PP-StructureV3 or PaddleOCR-VL |
| Orientation / unwarping | No | Optional preprocessing models |
| Privacy | Local | Local |
Put the same OCR on your own website#
Everything this page does is available to you through the official SDK. The minimal version:
import { PaddleOCR } from "@paddleocr/paddleocr-js";
const ocr = await PaddleOCR.create({
lang: "en",
ocrVersion: "PP-OCRv6", // maps to PP-OCRv6_small
ortOptions: { backend: "auto" } // WebGPU if available, else WASM
});
const [result] = await ocr.predict(fileInput.files[0]);
for (const line of result.items) {
console.log(line.text, line.score.toFixed(3), line.poly);
}Our PaddleOCR.js guide covers bundlers, Web Workers, WebGPU headers and the CDN behaviour we had to work around to make this page reliable.
Questions#
Is this online PaddleOCR free?
Yes. There's no account, quota or watermark. The page is static: your browser downloads the open-source model once and does the work itself, so there is nothing for us to meter.
Is my image uploaded anywhere?
No. The image is read into a canvas in this tab and passed to ONNX Runtime Web locally. The only network requests are for the SDK code (jsDelivr) and model files (Baidu's CDN or Hugging Face). You can confirm this in your browser's developer tools under the Network tab.
Can I OCR a PDF here?
Not directly — the browser SDK takes images. Export the page as PNG or JPG, or use the Python library, which reads PDFs natively. For PDFs with tables or formulas, use PP-StructureV3.
Is this the official PaddleOCR demo?
No. paddleocr.dev is an independent site; this tool is built on the official PaddleOCR.js SDK. The PaddleOCR team runs its own demos, including a hosted service at paddleocr.com, which processes files on its servers.
Why does the first run take a while?
The first run downloads the model (6–31 MB depending on the tier) and starts the WebAssembly runtime. After that the model is cached by your browser and later runs only pay for inference.
Which languages does it read?
PP-OCRv6 small handles simplified and traditional Chinese, English, Japanese and 46 Latin-script languages such as French, German, Spanish, Portuguese, Italian, Polish, Turkish and Vietnamese. Korean, Arabic, Cyrillic, Thai, Devanagari and other scripts need the Python library — see the language list.
Sources
- PaddleOCR.js SDK README and source (model presets, backends): github.com/PaddlePaddle/PaddleOCR/tree/main/paddleocr-js — npm
@paddleocr/paddleocr-js0.4.2 (published 2026-06-11). - PP-OCRv6 language coverage (50 languages for medium/small; tiny 49, no Japanese): PP-OCRv6 algorithm doc.
- Model download sizes: Content-Length of the official ONNX archives on Baidu's CDN and file sizes of PaddlePaddle on Hugging Face, checked 2026-10-27.
- Browser timings: measured by paddleocr.dev on 2026-10-27 in headless Chromium (WASM backend, no WebGPU) on a 4-vCPU Intel Xeon @ 2.10 GHz Linux container. Your device will differ.