Skip to content
easeweb
Search topics

Scanned and untagged PDFs that screen readers can't read

A café links its lunch menu as a PDF that is either a scan of the printed menu, with no words in it at all, or an export with tags turned off, whose words are read across both columns with no headings.

WCAG 2.2
SC 1.1.1ASC 1.3.1ASC 1.3.2A
Required by
Section 508 · EN 301 549 (EU)
Broken q 595 0 0 842 0 0 cm /Im0 Do Q
The accessibility problem illustrated: No vision:What's on the menu?
01

The problem

Blind visitors open the café's menu and hear nothing, or a jumble of two columns with no headings, so they can't find out what there is to eat or what it costs.

02

Try it

Open the café’s lunch menu, then listen to it the way a screen reader user would.

The panel shows what a screen reader reads from the top of the menu. Are there any words, and are the dishes read with their own section and price? Broken 2 is the same menu exported without tags.

Broken Can you fix this?

Corner Kitchen

Fresh lunch every weekday, 12:00 to 15:00.

Lunch menu (PDF)

Reading the menu from the top, a screen reader says:

(Open the lunch menu)

A recreated demo. The broken version is intentionally inaccessible.

03

The fix

Put the menu on an HTML page, or replace the file with a tagged PDF exported from its source.

  1. 1Every word in a document is real text, never only a picture of it.
  2. 2Headings, lists and tables are marked, as HTML elements or PDF tags, in the order they are shown.
  3. 3A PDF kept beside a page as its print version says exactly what the page says.
Before

A scanned menu

<a href="/files/lunch-menu.pdf">Lunch menu (PDF)</a>
After

The menu as a web page

<a href="/lunch-menu">Lunch menu</a> <!-- /lunch-menu --><h1>Lunch menu</h1><div class="menu">  <section>    <h2>Soups and salads</h2>    <ul>      <li>Tomato soup, 6.50</li>      <li>Green salad, 7.00</li>      <li>Lentil salad, 7.50</li>    </ul>  </section>  <section>    <h2>Mains</h2>    <ul>      <li>Mushroom risotto, 12.00</li>      <li>Grilled chicken, 13.50</li>      <li>Bean chilli, 11.00</li>    </ul>  </section></div><p><a href="/files/lunch-menu.pdf">Print version (PDF, 1 page)</a></p>

Fixing this with an AI coding assistant? Get this guide as Markdown

04

Verify the fix

5 checks, no mouse.

Test with: Screen reader

0 of 5 checked

Record the OS, browser, PDF viewer and assistive-technology versions, the build, the date, and the actual result of each step. Repeat whenever the document is replaced, re-exported or edited.

Limits

This is a starting pattern, not a guarantee for every document. The PDF code is cut down to the lines that matter: object numbers, fonts and coordinates are placeholders, and … stands for the rest of the page's tagged lines. Screen readers and PDF viewers handle untagged files differently, some guessing an order or running their own OCR, so test in the viewers your visitors use, not only one. This guide covers whether a document's words exist as text and its structure and order are tagged. It doesn't cover PDF forms, the contrast or text size inside a document, or Word and Excel files, which need their own app's checker. Test the complete journey with your target assistive technology.

This is a recreated teaching example, not a finding about a named client. The code is a starting pattern: test it in your own product. No completed assistive-technology test is claimed here.

Keep this fixed as your code changes.

Turn guides like this into rules your coding agents and CI follow, then have the result retested with a keyboard and screen readers.

How retests work