The first question to ask yourself about a table: is it for layout or data?
If the table structure is for layout purposes, do not tag it as a table. Even though tables can be made accessible, they are still not the ideal screen reader experience.
Ask yourself: can each row in the table be read as a single line (ie. as a paragraph would read) and it still makes sense? If so, tag each row of the table as a paragraph, not a table and make the table heading a heading tag. The table tag adds extra noise to the document because the screen reader has to annouce what cell and row the user is in, the information in that cell, as well as the heading the cell is connected to. If your table can be read as individual lines of text for each row, it should be made into paragraphs or a list.
Do you have any missing or empty cells? If you have multiple empty table cells, chances are that your table is for layout, not data. However, if you feel that your table is for data, add N/A (S.O. for French) in any empty data cell. If you are unable to add N/A in the cell, add it as alternative text.
Note: If your table is missing cells, it flags a Regularity error, which means your table does not have the same amount of TD (table data cells) in each row. Tables with blank/missing cells, are extremely difficult to comprehend via a screen reader.
Do any of your table cells span across multiple rows (excluding a table title row)? Cells that span across more than one column also cause screen reader problems because it cannot understand which heading to read so it reads the first one, even if the data is for the second heading.
So what do you do if your table is for visual layout?
Unless your table is long and complicated, you can generally tag each line as a paragraph or a list.
The layout looks like a table, but each part of the diagram can easily be broken into a paragraph & read through to get the same information as the visual table format presents.
Simple vs. complex: when associated IDs are needed
Identify whether your table is simple or complex.
If your table meets the critera in the list below, it is considered simple and no associated header IDs are needed.
Definition of a simple table:
- Your table has one row of headers (top), Table 1
- Your table has one row and one column of headers (top row and left column), Table 2
- Your table contains less than 10 rows
- The information in your table is concise, meaning not a lot of copy in each cell.
1.3.1 Info and Relationships. Visit the WCAG page for information on the intent of 1.3.1 Success Criterion (opens a new tab or window)
If your table matches any points in the below list it is considered complex. Complex tables require scope and associated header cells. Without associated header IDs, a complex table does not meet success criterion 1.3.1, as the relationships are disrupted by the complexity of the table.
Scoping is sufficient for simple tables, but complex tables need the ID because depending on how the user navigates through the table (left to right, up and down etc.) only certain headings will get read out. With IDs, this ensures all headings are read to the user.
Fun fact: In HTML, scoping is the preferred method for table accessibility. This is because the HTML language has been built to automatically associate IDs when scoping is applied. PDF tags do not have this kind of programmatic function, which is why it must be built into the tags with the IDs.
Definition of a complex table:
- Your table has multiple heading levels (ex. Top heading and subheadings), Table 3, Table 4
- Your table has headings outside of normal table conventions, Table 5
- Your table has a heading row partway through the table, Table 6
- Your table contains long copy within data cells, Table 7
- Your table has 10+ rows
- Your table contains equations, lists, checklists, or form fields
Guide for tagging a table in a PDF: How to tag a table in a PDF (opens a new tab or window)
Getting started with tables
- In the top navigation bar go to View > Show/Hide > Navigation Panes > Reading order
- Once reading order pane is open, right click on the page & select Show Reading Order Panel. This will open up the Reading order Tags menu.
- Use the cursor to draw an outline around your table. Make sure ALL of the text has been selected, then select the Table button. Now you have your table tagged, but you are not done yet.
- If you have any trouble tagging your table, please follow the manual steps to create a table outlined in our troubleshooting guide.
Editing cell tags
- Click the Table tag on the document; this enables the Table Editor button. Select it.
- Now you will be able to see which cells have been tagged as TH (table headings) and TD (table cells). Ensure that the right cells have been tagged correctly. The table tag wizard often categorizes the first column on the left to be headings. If all your table cells are marked correctly, skip to Heading IDs below.
- If you need to change the cell type, select your cell(s), right click on one, and open Table Cell Properties. Here you can change the type from a Header cell to a Data cell. Every cell you selected will change to TD.
- Follow the same process for TD cells that should be TH cells.
Merged cells: if you have cells that span across 2+ columns or rows you will need to set Colspan and/or rowspan. Colspan is set if a cell takes up 2+ columns in a row, Rowspan is if a row is 2+ rows.
To set Colspan/Rowspan:
- Open the Reading order panel, click on the table tag in the PDF and Table Editor will be enabled.
- Open Table editor, right click on the merged cell or row and select Table Cell Properties.
- Enter the number of columns/rows the cell takes up and link it to the Heading ID that is intended for this merged cell.
Note: Header cells should never be blank. Headings in general, and especially in tables, have specific meaning and purpose. Headings define the structure of a table and identy the relationships between cells, rows and columns. An empty header cell is providing a purpose that is not there.
If you cannot accomodate a table redesign, follow the below recommendation.
All header and data cells that do not contain information (i.e., cells that are blank) must be tagged as TD cells and given appropriate alt text. These cells aren't announced to screen reader users, so alt text lets them know that the cells are empty and helps connect the order of data being shared. This is especially important for simple tables that do not contain IDs.
If you are curious about how different screen readers handle empty cells this comparision of screen readers and how they interact with tables (opens a new tab or window) is a great resource.
The following alt text is appropriate for empty cells:
- English: Not applicable (preferred), N A, or N.A.
- French: Sans object (preferred), S O, or S.O.
Tag structure review
< Table > Table tag: sits at the 'root' or top of the table.
< TR > Table Row tag: nested below parent < Table > tag, contains one or more < TH > and/or < TD > tags.
< TH > Table Header tag: nested below parent < TR > tag, contains content in the cell
< TD > Table Data tag: nested below parent < TR > tag, contains content in the cell
If you prefer a more visual guide to tagging empty hearder cells, this webpage on the Tagged PDF website contains information and a video demonstration on how to tag an empty header cell (opens a new tab or window) in a table.
Assigning table IDs to complex tables
Header Cell IDs
There are two more things left to do once your table cells have been tagged: assign Header and Data cell IDs.
- Choose a heading, right click and go into Table Cell properties. Give the cell an ID and hit OK
- Repeat for each Header Cell
Data Cell IDs
With the Header Cell IDs in place, you can now associate them with your Data Cells.
- For each column, select all the data cells under a heading.
- Right click to go into Table Cell properties.
- Set the Associated Header Cell ID(s) by clicking the + button and selecting the ID of the header(s) for the column you're working on. You can have multiple header IDs associated, for example, if your table has both top and left header cells.
Once the above steps have been completed, your table will be accessible.
Data cells with multiple header IDs
A table can have multiple column and row header IDs, each linked to different parts of the data. In order for a screen reader user to fully understand the information that makes up a data cell, they need to know which header cells they are linked to. As shown in the example below, this table has 13 column and 4 row headers - each with their own unique header cell ID.