Executive Summary
With the recommended language and an upright page, all eight synthetic fixtures reached 96.98–97.76% character accuracy. The ambiguous character line (0 O 1 I 5 S 8 B) caused most remaining errors. Spanish with the English model fell from 97.76% to 94.40%, especially on accents, opening punctuation, and ñ.
- Fix orientation first: sideways text produced 0% word accuracy until the new 90° correction was applied.
- Choose the document language: the correct Spanish model reduced character edits from 20 to 8 on the same page.
- Do not assume 300 DPI guarantees perfection: the clean 300 DPI fixture still confused tightly spaced lookalike characters.
- Proofread identifiers: skew split the exact marker and reference code even though overall character accuracy remained 97.27%.
Measured character accuracy
Character accuracy is max(0, 1 − character edits ÷ ground-truth characters) × 100 after Unicode NFC normalization and whitespace collapsing. Values are direct-labeled; the table supplies every exact field.
Source: GoPDFConverter OCR Accuracy Challenge CSV, production build v89, Chrome, July 10, 2026. Runtime is recorded for reproducibility but is not a speed promise.
All 10 OCR results
| Fixture / setting | Char. accuracy | Word accuracy | Edits (char / word) | Marker exact | Confidence | Output |
|---|---|---|---|---|---|---|
| Clean 300 DPI · English | 97.28% | 84.62% | 9 / 8 | Yes | 91 | Text |
| Low resolution 100 DPI · English | 97.59% | 84.62% | 8 / 8 | Yes | 93 | Text |
| Faded 300 DPI · English | 97.28% | 84.62% | 9 / 8 | Yes | 91 | Text |
| Noise + blur · English | 96.98% | 82.69% | 10 / 9 | Yes | 90 | Text |
| 3° skew · English | 97.27% | 76.92% | 9 / 12 | No | 90 | Text |
| Sideways · no correction | 8.08% | 0.00% | 307 / 149 | No | 44 | Text |
| Sideways · rotate 90° | 97.60% | 84.62% | 8 / 8 | Yes | 92 | Text |
| Spanish · Spanish model | 97.76% | 84.48% | 8 / 9 | Yes | 91 | Text |
| Spanish · English model | 94.40% | 72.41% | 20 / 16 | Yes | 87 | Text |
| German · German model | 97.35% | 84.62% | 9 / 8 | Yes | 93 | Text |
Download every measured field as CSV
Recommended settings
| What you see | What to do first | Why |
|---|---|---|
| Text is sideways or upside down | Use Page orientation before OCR | Orientation correction changed the test from unusable to 97.60% character accuracy. |
| Spanish, French, German, Portuguese, or Italian | Select the matching language | The wrong model damaged accents, opening punctuation, and language-specific letters. |
| Serials, invoice codes, or IDs | Proofread every identifier | Lookalike characters and skew split exact tokens even when paragraph accuracy stayed high. |
| Faded or noisy scan | Try OCR, then inspect low-confidence lines | These fixtures stayed readable, but real stains, handwriting, and compression can be harder. |
| Digital PDF with selectable text | Use PDF to Text, not OCR | Direct extraction is faster and preserves the existing text layer without recognition errors. |
Download the challenge set
Every PDF is one image-only Letter page; Poppler text extraction returns no hidden text. The set is deterministic, contains no personal data, and is licensed CC BY 4.0.
| Fixture | Ground truth | Source DPI | |
|---|---|---|---|
| Clean English | TXT | 300 | |
| Low-resolution English | TXT | 100 | |
| Faded English | TXT | 300 | |
| Noisy English | TXT | 200 | |
| Skewed English | TXT | 200 | |
| Sideways English | TXT | 200 | |
| Spanish accents | TXT | 200 | |
| German umlauts | TXT | 200 |
Fixture manifest and SHA-256 checksums · Download all PDFs and ground truth
Method
- Generate controlled, image-only PDFs.
Pillow and ReportLab created eight deterministic Letter-size PDFs. Conditions isolate source DPI, contrast, Gaussian noise and blur, 3° skew, 90° rotation, Spanish accents, and German umlauts.
- Run the production browser pipeline.
Chrome executed the same PDF.js page renderer, 200 DPI setting, Tesseract.js 5.0.4 engine, language selection, and orientation correction used by OCR PDF.
- Score outside the OCR code.
A separate Python script normalized Unicode to NFC, collapsed whitespace, and calculated Levenshtein edits over characters and whitespace-delimited tokens. It also checked each unique marker as an exact substring.
- Keep the evidence inspectable.
The CSV includes settings, exact denominators, confidence, observed runtime, fixture checksums, and extracted-text checksums. Raw text and ground truth are linked above.
- Trace browser requests.
The test observed local PDF requests, PDF.js and Tesseract library delivery from jsDelivr, and local blob workers. The document content was processed from local URLs and browser memory; no request containing an uploaded PDF or extracted text was observed.
Caveats and assumptions
This is a controlled synthetic challenge, not a population estimate for every scan. The pages use one sans-serif print font and short blocks of text; they do not cover handwriting, columns, tables, mixed scripts, historic type, stamps, severe perspective distortion, or damaged documents. The 100 DPI case uses relatively large 14-point source text and should not be read as proof that all 100 DPI scans are sufficient.
Word accuracy here is an intentionally strict whitespace-token comparison. One missing space in 0 O 1 I 5 S 8 B can count as several word edits even when most paragraph text is correct. Tesseract confidence is the engine’s own estimate, not a calibrated probability. Runtime depends on the device, cache, browser state, and thermal conditions.
Next steps
- Use the new orientation selector in the OCR tool whenever the scan is not upright.
- Expand the challenge with handwriting, two-column layouts, receipts, and small-font legal text.
- Test preprocessing choices such as deskew, thresholding, and higher render DPI without hiding their memory and speed costs.
Further questions
- At what font size does 100 DPI become materially worse than 200 or 300 DPI?
- Can automatic orientation detection match a manual correction without adding a large first-run model download?
- Which preprocessing step improves exact identifier recognition most: deskew, adaptive thresholding, or upscaling?