Every font we tested read at 98% or better from 7 pt at standard fax resolution, and from 6 pt at fine resolution. At 5 pt standard, accuracy dropped to between 31.56% and 95.84%. These are our own numbers from one run on 2026-11-08, read by OCR software, not by a person. It is a simulation: no fax call was placed and no carrier was involved.
The code, the passage and every OCR output are in the fax legibility bench repository, MIT licensed.
What we measured
The bench sets one passage of plain prose on a US Letter page with 1 inch margins. The passage is the opening of Chapter I of Pride and Prejudice by Jane Austen. The text comes from Project Gutenberg eBook 1342. It is 1,201 characters after whitespace is collapsed. It has no digits.
The four open fonts are the ones installed on the test machine, Ubuntu 24.04. Liberation Serif and Liberation Sans are version 2.1.5 and DejaVu Sans is 2.37. Noto Sans comes from the Ubuntu fonts-noto-core package, version 20201225.
The send fax docs list the same families in the renderer that turns HTML into fax pages for Fax for Agents. The bench uses its own layout, so these numbers say nothing about that renderer's output.
Each page was set at every whole size from 4 to 16 pt with Typst 0.15.1, with hyphenation off. Ghostscript 10.02.1 then rasterised each PDF straight to 1-bit black and white, with no anti-aliasing. It used the two resolutions of ITU-T T.4. Standard is 204 by 98 dots per inch and fine is 204 by 196.
A fax printer shows each scan line as a band of the page. To match that, the bench repeats every row until the pixels are square, without smoothing.
Tesseract 5.3.4 with the English model then read each image.
Character accuracy is 1 minus the edit distance between the OCR text and the passage, divided by 1,201. Curly quotes and dashes are folded to plain ones on both sides first. Case and punctuation still count. We set 98% as the pass mark before the first run.
As a control, the bench also reads every page at 300 dpi in 8-bit gray. That mode is not a fax. It shows what the OCR engine manages when resolution is not the limit.
Results at standard resolution
Character accuracy in percent, 204 by 98 dpi, 1-bit, run on 2026-11-08.
| Size | Liberation Serif | Liberation Sans | DejaVu Sans | Noto Sans |
|---|---|---|---|---|
| 4 pt | 47.04 | 63.20 | 76.52 | 64.70 |
| 5 pt | 75.77 | 31.56 | 93.26 | 95.84 |
| 6 pt | 99.00 | 94.59 | 98.92 | 98.75 |
| 7 pt | 99.33 | 99.42 | 99.67 | 99.17 |
| 8 pt | 99.67 | 99.75 | 99.25 | 99.08 |
| 9 pt | 99.67 | 99.25 | 99.67 | 99.75 |
| 10 pt | 99.83 | 99.92 | 99.92 | 99.83 |
| 12 pt | 99.92 | 99.75 | 99.92 | 99.92 |
| 14 pt | 100.00 | 99.75 | 99.75 | 99.92 |
| 16 pt | 100.00 | 99.83 | 99.42 | 100.00 |
The odd sizes 11, 13 and 15 pt are in the repository's results file. None of them is below 99.75%.
Results at fine resolution
Character accuracy in percent, 204 by 196 dpi, 1-bit, same run.
| Size | Liberation Serif | Liberation Sans | DejaVu Sans | Noto Sans |
|---|---|---|---|---|
| 4 pt | 91.42 | 94.17 | 96.75 | 97.92 |
| 5 pt | 97.42 | 98.83 | 98.67 | 99.33 |
| 6 pt | 98.17 | 99.25 | 99.92 | 98.50 |
| 7 pt | 99.67 | 99.42 | 99.92 | 99.75 |
| 8 pt | 99.75 | 99.67 | 99.92 | 99.92 |
| 10 pt | 100.00 | 99.92 | 99.92 | 99.92 |
| 12 pt | 99.83 | 99.83 | 99.92 | 99.92 |
| 16 pt | 100.00 | 99.92 | 99.83 | 100.00 |
The sizes left out of this table (9, 11, 13 to 15 pt) are all 99.75% or higher. The 300 dpi gray control never fell below 98.17%, at any size from 4 pt up.
What the numbers say
The edge is sharp. At standard resolution, every font passed at 7 pt and three of four passed at 6 pt. Liberation Sans scored 94.59% at 6 pt. One size lower, the scores spread from 31.56% to 95.84%.
Fine resolution moves the edge down by about a point. At 5 pt fine, three of the four fonts passed. The fourth, Liberation Serif, scored 97.42%.
The gray control passed at every size, so the engine can read 4 and 5 pt type. The losses there come with the fax image.
From 10 pt up, the errors that remain are mostly the same few shapes. A capital I read as a vertical bar in the sans fonts, and a lower case k read as a capital. At 8 pt standard, DejaVu Sans had "so" read as "50" twice. On a fax full of account numbers, that kind of swap matters more than the percentage suggests.
The Liberation Sans score at 5 pt standard (31.56%) is lower than at 4 pt (63.20%). The OCR output shows why. At 5 pt the engine split some lines into separate blocks and put them out of order. The edit distance counts every misplaced character as an error. Below 6 pt, the scores mix misread letters with lines read in the wrong place.
The same cases on Tesseract 5.5.4
Added on 2026-11-12. Tesseract 5.5.4 came out on 2026-10-28, so we ran all 156 cases again with it.
The fonts, Typst, Ghostscript, the English model file and the settings were the ones from the first run. The new run was in a container, with Tesseract built from source and linked to Leptonica 1.82.0. As a check, we built 5.3.4 the same way and ran it first. It gave the published score for every case, so the changes below come from the engine version.
The conclusions did not move. The smallest passing size is the same for every font at both resolutions and in the control. No case crossed the 98% mark in either direction.
The scores moved a little. The edit distance changed in 41 of the 156 cases. That is 22 of 52 at standard resolution, 16 of 52 at fine and 3 of 52 in the control. Version 5.5.4 made fewer errors in 23 of those cases and more in 18. It is not a net gain. The edit distance summed over all 156 cases went from 3,732 to 3,748.
The largest change was 1.17 percentage points. That was Liberation Sans at 4 pt standard, which went from 63.20% to 62.03%. From 7 pt up, no case changed by more than 2 characters out of 1,201.
Fonts out of four whose score changed, by size.
| Size | Standard | Fine | 300 dpi gray control |
|---|---|---|---|
| 4 pt | 4 | 4 | 0 |
| 5 pt | 3 | 3 | 0 |
| 6 pt | 3 | 1 | 0 |
| 7 pt | 2 | 2 | 0 |
| 8 pt | 2 | 1 | 1 |
| 9 pt | 0 | 0 | 0 |
| 10 pt | 1 | 1 | 0 |
| 11 pt | 2 | 0 | 1 |
| 12 pt | 2 | 1 | 0 |
| 13 pt | 0 | 1 | 1 |
| 14 pt | 1 | 1 | 0 |
| 15 pt | 2 | 1 | 0 |
| 16 pt | 0 | 0 | 0 |
| All sizes | 22 | 16 | 3 |
The result tables above are still the first run. The repository has the 5.5.4 results and a case by case comparison.
Limits of this test
- It is one passage of English prose, 1,201 characters, with no digits. Fax pages are often forms, tables and numbers.
- It is one OCR engine with its default page layout analysis. A person reads differently, and so does another engine.
- It is a clean image. There is no scanner, no paper, no phone line, no error correction and no receiving printer.
- The result tables are from one run. A repeat of the 6 to 16 pt sizes on the same engine version gave the same numbers, because every step is deterministic.
So the table is a best case. A real fax adds noise at each of those steps, and small text loses first.
What we would do with it
Keep body text at 10 pt or above. In this run that is 3 pt clear of the edge at standard resolution, which leaves room for the noise a real line adds. Keep small print, such as footers and form labels, at 8 pt or above. Use bold or a larger size for numbers someone has to copy, because those swaps are the ones that cost.
If you send through an API, check the pages before you send. Fax for Agents returns a page preview for each document, described in the send fax docs. The fax API quotes the document to the number before anything is sent.
Run it yourself
The bench needs Python 3.12 or later, uv, Typst, Ghostscript, Tesseract with the English model, and the fonts. From a clone of the repository:
uv sync
uv run python bench.py
It writes results/results.csv, results/results.md, the OCR text for every case and an environment.json with tool versions and font hashes. The full run is 156 cases: 13 sizes, 4 fonts and 3 modes.