Tetrak OCR
GitHub ↗
Research

OCR for historical archives

A comparison of text recognition engines

Which OCR engine should you point at a box of archive scans? We built a fixed corpus of Los Angeles stage and picture-palace ephemera, generated reference transcripts, and measured every engine we could install against every document. This is that work, in order.

Front page of Inside Facts of Stage and Screen, 31 May 1930, a dense multi-column newspaper under a heavy display masthead
Inside Facts of Stage and Screen
Vaudeville chromolithograph poster for the Victorina Troupe sword swallowing act, with hand-lettered display type arched over an illustration
The great Victorina Troupe
Reverse of the Carthay Circle postcard, showing text rotated ninety degrees, a faded rubber stamp, handwriting and large empty areas
Carthay Circle Theatre, reverse
Linen postcard of Grauman’s Chinese Theatre, Hollywood, a colour halftone with marquee lettering at the edge of legibility
Grauman’s Chinese Theatre
First page of The King of Kings roadshow souvenir programme, 1927, showing a tinted ground and script headings
The King of Kings souvenir programme
Interior page of the same newspaper issue, multi-column body text broken up by ruled advertisement boxes
Inside Facts, page six
Linen postcard showing a world premiere at the Carthay Circle Theatre, Los Angeles, with caption text reversed out of a dark night sky
Carthay Circle Theatre premiere
Playbill for the Hollywood Music Box Theatre, a tall narrow sheet of dense small type listing a Japanese touring drama company’s programme
Hollywood Music Box, Ken-Geki playbill
Newspaper display advertisement for the Kinema Theater, with hand-lettered headlines and body text set around a large illustration
Kinema Theater display advertisement

Nine items on one theme — the Los Angeles stage and its picture palaces, c. 1910–1945. Click any of them to see what the engines were actually given. Provenance and rights for every item are in the corpus reference.

  1. The challenge

    Why OCR matters for archival work, and what makes historical documents difficult to digitise.

  2. The engines

    What exists, how each one works, and the difference between pattern matching, neural recognition and layout understanding.

  3. The corpus

    Nine real documents, chosen to span the failure modes that matter in archive digitisation rather than to flatter anything.

  4. The results

    What the measurements say: which engine to reach for, and where each one falls down.

  5. What follows

    The findings that survived, and the questions still open.

One · The challenge

Thousands of documents await digitisation, and every one of them is different

Faded ink and poor contrast

Aged paper and aged ink converge. Letters blend into the ground, and the threshold that recovers one part of a page destroys another.

Decorative typography

Historic mastheads and showbills use hand-lettered, arched and ornamented letterforms that no character model has been trained on.

Complex page layouts

Multi-column articles, mixed sizes, and text flowing around illustration. Finding the words and reading them in the right order are separate problems, and most engines solve only the first.

Volume

Transcribing a collection by hand is not a plan. Whatever runs has to run unattended, and has to say something useful when it fails.

Two · The engines

What we measured, and what each one is

Free · local

tesseract

Traditional pattern-matching OCR, and the one everybody already has. Fast, predictable, and entirely dependent on being handed a well-prepared image.

Free · local

tesseract-auto

The same engine with contrast and page-segmentation chosen per image instead of left at the default. Tuning the engine you have turned out to beat switching to a different one.

Free · local

easyocr

A neural detector and recogniser. Finds text regions the others miss, particularly on textured and low-contrast grounds, then struggles to put them in order.

Free · local

paddle

Baidu’s detection-and-recognition pipeline. Strong word coverage on dense images, and the best local reader of small type on a busy sheet.

Free · local

marker

A document-to-Markdown converter rather than an OCR engine: it models the page as structure — headings, columns, tables — and reads within it.

Free · local · routing

auto-local

Not a standalone engine. It runs every local engine eligible for the file, scores the transcripts with no reference text, and keeps the best one. Per file, not per batch.

API · paid · ceiling reference

claude

A vision model, and the source of the reference transcripts every other engine is scored against — including its own. Its column is self-consistency, not accuracy, and it is excluded from every ‘best local’ comparison on this page.

Three · The corpus

Five documents, and what each one breaks

Front page of Inside Facts of Stage and Screen, 31 May 1930, a dense multi-column newspaper under a heavy display masthead

Document 1 of 5

Inside Facts of Stage and Screen

LA theatrical trade weekly, 31 May 1930 · JPEG

Dense multi-column newsprint under a heavy display masthead, on aged low-contrast paper. Every local engine finds most of the words and then reads them in the wrong order, so recall holds up while character similarity collapses. Finding the text and understanding the page are different problems, and this is the document that separates them.

Character similarity / word recall

tesseract
0.18 / 0.85
tesseract-auto
0.35 / 0.91
easyocr
0.03 / 0.71
paddle
0.21 / 0.94
marker
0.39 / 0.90
auto-local
0.39 / 0.90
claude*
1.00 / 1.00

Bold is best local. * ceiling reference, not a measurement.

Vaudeville chromolithograph poster for the Victorina Troupe sword swallowing act, with hand-lettered display type arched over an illustration

Document 2 of 5

The great Victorina Troupe

Vaudeville chromolithograph, c. 1914 · JPEG

Curved and arched hand-lettered display type, colour on colour, with caption text at the bottom in a size the scan barely holds. Nothing local reads it — plain Tesseract returns essentially nothing at all. The widest gap in the corpus between what a local engine manages and what a vision model does.

Character similarity / word recall

tesseract
0.00 / 0.00
tesseract-auto
0.02 / 0.01
easyocr
0.05 / 0.39
paddle
0.13 / 0.39
marker
0.01 / 0.00
auto-local
0.13 / 0.39
claude*
0.73 / 0.98

Bold is best local. * ceiling reference, not a measurement.

Reverse of the Carthay Circle postcard, showing text rotated ninety degrees, a faded rubber stamp, handwriting and large empty areas

Document 3 of 5

Carthay Circle Theatre, reverse

Tichnor linen postcard, c. 1930–45 · PNG

Clean printed type, awkwardly arranged: rotated ninety degrees, around a faded rubber stamp and a line of handwriting, with large empty areas between. Auto-configured Tesseract comes within a few points of the ceiling here — free, offline and fast. This is the case where reaching for an API is hard to justify.

Character similarity / word recall

tesseract
0.59 / 0.50
tesseract-auto
0.91 / 0.71
easyocr
0.79 / 0.62
paddle
0.28 / 0.62
marker
0.66 / 0.62
auto-local
0.91 / 0.71
claude*
0.96 / 0.96

Bold is best local. * ceiling reference, not a measurement.

Linen postcard of Grauman’s Chinese Theatre, Hollywood, a colour halftone with marquee lettering at the edge of legibility

Document 4 of 5

Grauman’s Chinese Theatre

Tichnor linen postcard, c. 1930–45 · JPEG

A colour halftone where the marquee lettering sits right at the edge of legibility and competes with the image around it. The local engines cluster on character similarity but recover only about half the words, and Marker’s layout model reads the whole card as a figure and returns almost nothing.

Character similarity / word recall

tesseract
0.74 / 0.54
tesseract-auto
0.86 / 0.54
easyocr
0.84 / 0.54
paddle
0.78 / 0.31
marker
0.09 / 0.00
auto-local
0.78 / 0.31
claude*
1.00 / 1.00

Bold is best local. * ceiling reference, not a measurement.

First page of The King of Kings roadshow souvenir programme, 1927, showing a tinted ground and script headings

Document 5 of 5

The King of Kings souvenir programme

Roadshow programme, 1927 · 21-page PDF

The only multi-page item, and the reason PDF support is not a detail: EasyOCR and PaddleOCR cannot open it at all. Tesseract and Marker both manage strong recall on the typeset body text, across tinted grounds, script headings and drop caps.

Character similarity / word recall

tesseract
0.45 / 0.95
tesseract-auto
0.45 / 0.95
easyocr
N/A
paddle
N/A
marker
0.66 / 0.93
auto-local
0.66 / 0.93
claude*
0.89 / 0.97

Bold is best local. * ceiling reference, not a measurement.

Four · The results

Choosing per file beats choosing an engine

Averaged over the whole corpus. Character similarity is order-sensitive and word recall is not, so they are always reported as a pair — the gap between them is where the interesting behaviour lives.

tesseract

0.31 / 0.51

tesseract-auto

0.41 / 0.63

easyocr

0.35 / 0.60

paddle

0.28 / 0.63

marker

0.44 / 0.65

auto-local

0.53 / 0.74

character similarity word recall — claude is omitted here: it generated the reference transcripts everything else is scored against, so its bar would measure self-consistency rather than accuracy.

Every engine against every document

Fixturetesseracttesseract-autoclaude*easyocrpaddlemarkerauto-local
carthay-circle-postcard-back.png0.59/0.500.91/0.710.96/0.960.79/0.620.28/0.620.66/0.620.91/0.71
carthay-circle-premiere.jpg0.00/0.000.49/0.860.89/0.930.87/0.710.09/0.000.76/0.860.49/0.86
graumans-chinese-theatre.jpg0.74/0.540.86/0.541.00/1.000.84/0.540.78/0.310.09/0.000.78/0.31
hollywood-music-box-playbill-1926.tif0.19/0.460.19/0.460.90/0.970.09/0.390.39/0.900.28/0.740.28/0.74
inside-facts-1930-cover.jpg0.18/0.850.35/0.911.00/1.000.03/0.710.21/0.940.39/0.900.39/0.90
inside-facts-1930-page-six.jpg0.45/0.900.37/0.890.94/1.000.04/0.780.10/0.940.40/0.940.40/0.94
kar-mi-troupe-poster.jpg0.00/0.000.02/0.010.73/0.980.05/0.390.13/0.390.01/0.000.13/0.39
kinema-theater-ad-1920.tif0.23/0.400.04/0.380.76/0.990.10/0.660.22/0.930.75/0.880.75/0.88
king-of-kings-souvenir-1927.pdf0.45/0.950.45/0.950.89/0.97N/AN/A0.66/0.930.66/0.93
Average0.31/0.510.41/0.630.90/0.980.35/0.600.28/0.630.44/0.650.53/0.74

Generated from evaluation/benchmark.csv at build time. Bold marks the best local backend per fixture. claude generated the ground truth and is a ceiling reference rather than a score.

The same numbers, drawn

Grouped bar chart of average character similarity and word recall for every backend, with the Claude ceiling reference drawn apart, hatched and greyed, behind a divider Grouped bar chart of average character similarity and word recall for every backend, with the Claude ceiling reference drawn apart, hatched and greyed, behind a divider
Both metrics per backend, with the ceiling reference set apart.
The findings

Claude sets a ceiling, and is not a competitor

It generated the reference transcripts every other engine is scored against, including its own. Reading its column as a win is reading the wrong thing. What it does tell you is roughly how much of each document is legible at all.

No single local engine is strong across the corpus

Different engines win on different documents, and the winners are not close to each other. There is no setting you can choose once and be right about, which is the finding that decided the architecture.

Choosing per file closes most of the gap

auto-local runs the engines eligible for each file, scores the transcripts without a reference, and keeps the best. It beats every individual local engine on both metrics, entirely offline and free — and it is still losing ground to an oracle that knows the answer.

Choosing

Which engine for which material?

Clean printed captions, postcards, labels
tesseract-autothen easyocr
Close to the ceiling, free, offline and fast
Multi-column newsprint and magazines
claudethen marker
Reading order is the whole problem, and only layout understanding solves it
Decorative, hand-lettered, ornamental type
claude
Nothing local reads it
Multi-page PDFs
markerthen tesseract
EasyOCR and PaddleOCR cannot read PDFs at all
Mixed material, run unattended
auto-local
Runs the viable local engines and keeps the best transcript
Anything confidential
auto-localthen tesseract-auto
Everything stays on the machine; no API call
Five · What follows

What is still open

The selection heuristic leaves accuracy on the table

auto-local’s scorer loses ground against an oracle that knows which transcript is best. That is a scoring weight rather than an engine limitation, and it is the cheapest accuracy work available.

The auto-configuration bands are overfitted

They were fitted against most of this corpus and need re-fitting on a wider set before they can be trusted elsewhere.

The ground truth is machine-generated

Human-checked reference transcripts would remove the benchmark’s central weakness, and would let Claude be measured rather than assumed.

Nothing here generalises beyond archival print of this era

Same period, same condition, same script. Whether the pipeline holds up on other scripts is untested; an open Armenian Tesseract model exists and would make the cheapest first experiment.

Rights, before anything else

Would the rights attached to a given collection permit sending its scans to a third-party service at all? Where the answer is no, the local path is not a preference, it is the only option.