WebAIM - Web Accessibility In Mind

E-mail List Archives

Thread: VoiceOver and PDF table headers... again

for

Number of posts in this thread: 4 (In chronological order)

From: Alan Zaitchik
Date: Mon, Aug 30 2021 3:28PM
Subject: VoiceOver and PDF table headers... again
No previous message | Next message →

I've troubled you all in the past on related issues, but this one really surprised me.
I'm working on a table with terribly complex column headers, without the option of refactoring it into simpler tables. As expected, VO and to a lesser extent NVDA could not digest the "colspanning" and "rowspanning" of the headers. I came up with what I thought was a brilliant workaround: I can flatten the headers into just one row without changing the appearance of the table, if I use "Actual Text" to simply "inject" the parent and ancestor header text into the remaining column header.
Simplified Example: "Average Annual Return" sits atop both "1 year" and "2 year" and "3 year" column headers. Each of these sits above 2 column headers: "As a %" and "Per $1000". What I did was collapse the 3 rows into one by "artifacting" the top 2 rows (the "Average Annual Return" row and the "1 year" and "2 year" and "3 year" row) and assigning as the Actual Text for the 6 remaining column headers (previously row 3, now row 1):
"Average Annual Return, 1 year, as a percent"
"Average Annual Return, 1 year, per $1000"
"Average Annual Return, 2 years, as a percent"
"Average Annual Return, 2 years, per $1000"
"Average Annual Return, 3 years, as a percent"
"Average Annual Return, 3 years, per $1000"
Yes, a little verbose and repetitive, but everything reads out correctly in JAWS and NVDA, as I navigate the table.
The trouble is with VoiceOver. Navigating through the column header row, or navigating through the data rows, VO reads out the visible text in the column header cell ("1 year", "2 years", and "3 years"), ignoring the Actual Text entirely.
Well, not entirely entirely. I added a dagger symbol to one of the column headers, wrapped it in a <Span>, and gave it an Actual Text value of "See important dagger note following table". (Please ignore the barbaric wording.) And Voice Over gladly read it out as "1 year See important dagger note following table". So Voice Over can handle Actual Text replacement in this case.
What Is going on? Does VO do Actual Text replacement for a single character only?
And another question: if I get the above scheme to work well with JAWS and NVDA, and if VO is at least able to read the visible column header text with the data values, would that count as "accessible enough"? (I realize the latter question is contentious….)
Alan

From: Steve Green
Date: Mon, Aug 30 2021 5:27PM
Subject: Re: VoiceOver and PDF table headers... again
← Previous message | Next message →

Have you tried putting all the header text into a <Span>? If it works for the dagger, perhaps it will work for the whole header. Sometimes you just have to do weird stuff like that to get PDFs to work.

Steve Green
Managing Director
Test Partners Ltd


-----Original Message-----
From: WebAIM-Forum < = EMAIL ADDRESS REMOVED = > On Behalf Of Alan Zaitchik
Sent: 30 August 2021 22:28
To: WebAIM Discussion List < = EMAIL ADDRESS REMOVED = >
Subject: [WebAIM] VoiceOver and PDF table headers... again

I've troubled you all in the past on related issues, but this one really surprised me.
I'm working on a table with terribly complex column headers, without the option of refactoring it into simpler tables. As expected, VO and to a lesser extent NVDA could not digest the "colspanning" and "rowspanning" of the headers. I came up with what I thought was a brilliant workaround: I can flatten the headers into just one row without changing the appearance of the table, if I use "Actual Text" to simply "inject" the parent and ancestor header text into the remaining column header.
Simplified Example: "Average Annual Return" sits atop both "1 year" and "2 year" and "3 year" column headers. Each of these sits above 2 column headers: "As a %" and "Per $1000". What I did was collapse the 3 rows into one by "artifacting" the top 2 rows (the "Average Annual Return" row and the "1 year" and "2 year" and "3 year" row) and assigning as the Actual Text for the 6 remaining column headers (previously row 3, now row 1):
"Average Annual Return, 1 year, as a percent"
"Average Annual Return, 1 year, per $1000"
"Average Annual Return, 2 years, as a percent"
"Average Annual Return, 2 years, per $1000"
"Average Annual Return, 3 years, as a percent"
"Average Annual Return, 3 years, per $1000"
Yes, a little verbose and repetitive, but everything reads out correctly in JAWS and NVDA, as I navigate the table.
The trouble is with VoiceOver. Navigating through the column header row, or navigating through the data rows, VO reads out the visible text in the column header cell ("1 year", "2 years", and "3 years"), ignoring the Actual Text entirely.
Well, not entirely entirely. I added a dagger symbol to one of the column headers, wrapped it in a <Span>, and gave it an Actual Text value of "See important dagger note following table". (Please ignore the barbaric wording.) And Voice Over gladly read it out as "1 year See important dagger note following table". So Voice Over can handle Actual Text replacement in this case.
What Is going on? Does VO do Actual Text replacement for a single character only?
And another question: if I get the above scheme to work well with JAWS and NVDA, and if VO is at least able to read the visible column header text with the data values, would that count as "accessible enough"? (I realize the latter question is contentious….) Alan

From: Laura Roberts
Date: Tue, Aug 31 2021 7:53AM
Subject: Re: VoiceOver and PDF table headers... again
← Previous message | Next message →

Even though it's 3 rows of headers, you should still be able to make that
work in Acrobat without flattening anything. I've dealt with worse.
Go into properties for each header cell (not data cells) and assign an ID
so you can easily identify which header cell you are setting the properties
for in the TURO table editor.
Set all spans to column, set annual average return to 3 columns, 1 row
span; set 1 year to 2 columns, 1 row span, etc.

As to your question, I view "actual text" as a necessary evil, but I avoid
it as much as possible. I don't like the way that JAWS no longer highlights
text when reading actual text and it takes away some JAWS abilities from
the end user. However, I understand where you're coming from with clients
who will not let you change the source document (or don't have it).
Sometimes you do what you gotta do.

On Mon, Aug 30, 2021 at 6:01 PM Alan Zaitchik < = EMAIL ADDRESS REMOVED = >
wrote:

> I've troubled you all in the past on related issues, but this one really
> surprised me.
> I'm working on a table with terribly complex column headers, without the
> option of refactoring it into simpler tables. As expected, VO and to a
> lesser extent NVDA could not digest the "colspanning" and "rowspanning" of
> the headers. I came up with what I thought was a brilliant workaround: I
> can flatten the headers into just one row without changing the appearance
> of the table, if I use "Actual Text" to simply "inject" the parent and
> ancestor header text into the remaining column header.
> Simplified Example: "Average Annual Return" sits atop both "1 year" and "2
> year" and "3 year" column headers. Each of these sits above 2 column
> headers: "As a %" and "Per $1000". What I did was collapse the 3 rows into
> one by "artifacting" the top 2 rows (the "Average Annual Return" row and
> the "1 year" and "2 year" and "3 year" row) and assigning as the Actual
> Text for the 6 remaining column headers (previously row 3, now row 1):
> "Average Annual Return, 1 year, as a percent"
> "Average Annual Return, 1 year, per $1000"
> "Average Annual Return, 2 years, as a percent"
> "Average Annual Return, 2 years, per $1000"
> "Average Annual Return, 3 years, as a percent"
> "Average Annual Return, 3 years, per $1000"
> Yes, a little verbose and repetitive, but everything reads out correctly
> in JAWS and NVDA, as I navigate the table.
> The trouble is with VoiceOver. Navigating through the column header row,
> or navigating through the data rows, VO reads out the visible text in the
> column header cell ("1 year", "2 years", and "3 years"), ignoring the
> Actual Text entirely.
> Well, not entirely entirely. I added a dagger symbol to one of the column
> headers, wrapped it in a <Span>, and gave it an Actual Text value of "See
> important dagger note following table". (Please ignore the barbaric
> wording.) And Voice Over gladly read it out as "1 year See important dagger
> note following table". So Voice Over can handle Actual Text replacement in
> this case.
> What Is going on? Does VO do Actual Text replacement for a single
> character only?
> And another question: if I get the above scheme to work well with JAWS and
> NVDA, and if VO is at least able to read the visible column header text
> with the data values, would that count as "accessible enough"? (I realize
> the latter question is contentious….)
> Alan
> > > > >


--
Best regards,
Laura Roberts

From: Elizabeth Thomas
Date: Tue, Aug 31 2021 2:58PM
Subject: Re: VoiceOver and PDF table headers... again
← Previous message | No next message

Another option is to add the text (by going into edit PDF and then adding it as text). Make it the same color as the cell fill color so that it's "invisible." Then tag that text (either by running a search for untagged content or using the "tool of last resort"- the reading order tool) and put it in the appropriate table header cell. Bonus: you then get the fun challenge of trying to tag text you can't see.

Ordinarily, I wouldn't recommend using this type of solution as it can cause problems down the road (e.g. someone works on the file two years from now and doesn't know there's hidden text that is serving an important function). But, I think in this case, it's a reasonable hack.

-Elizabeth

Sent from my iPhone

> On Aug 31, 2021, at 9:53 AM, Laura Roberts < = EMAIL ADDRESS REMOVED = > wrote:
>
> Even though it's 3 rows of headers, you should still be able to make that
> work in Acrobat without flattening anything. I've dealt with worse.
> Go into properties for each header cell (not data cells) and assign an ID
> so you can easily identify which header cell you are setting the properties
> for in the TURO table editor.
> Set all spans to column, set annual average return to 3 columns, 1 row
> span; set 1 year to 2 columns, 1 row span, etc.
>
> As to your question, I view "actual text" as a necessary evil, but I avoid
> it as much as possible. I don't like the way that JAWS no longer highlights
> text when reading actual text and it takes away some JAWS abilities from
> the end user. However, I understand where you're coming from with clients
> who will not let you change the source document (or don't have it).
> Sometimes you do what you gotta do.
>
>> On Mon, Aug 30, 2021 at 6:01 PM Alan Zaitchik < = EMAIL ADDRESS REMOVED = >
>> wrote:
>>
>> I've troubled you all in the past on related issues, but this one really
>> surprised me.
>> I'm working on a table with terribly complex column headers, without the
>> option of refactoring it into simpler tables. As expected, VO and to a
>> lesser extent NVDA could not digest the "colspanning" and "rowspanning" of
>> the headers. I came up with what I thought was a brilliant workaround: I
>> can flatten the headers into just one row without changing the appearance
>> of the table, if I use "Actual Text" to simply "inject" the parent and
>> ancestor header text into the remaining column header.
>> Simplified Example: "Average Annual Return" sits atop both "1 year" and "2
>> year" and "3 year" column headers. Each of these sits above 2 column
>> headers: "As a %" and "Per $1000". What I did was collapse the 3 rows into
>> one by "artifacting" the top 2 rows (the "Average Annual Return" row and
>> the "1 year" and "2 year" and "3 year" row) and assigning as the Actual
>> Text for the 6 remaining column headers (previously row 3, now row 1):
>> "Average Annual Return, 1 year, as a percent"
>> "Average Annual Return, 1 year, per $1000"
>> "Average Annual Return, 2 years, as a percent"
>> "Average Annual Return, 2 years, per $1000"
>> "Average Annual Return, 3 years, as a percent"
>> "Average Annual Return, 3 years, per $1000"
>> Yes, a little verbose and repetitive, but everything reads out correctly
>> in JAWS and NVDA, as I navigate the table.
>> The trouble is with VoiceOver. Navigating through the column header row,
>> or navigating through the data rows, VO reads out the visible text in the
>> column header cell ("1 year", "2 years", and "3 years"), ignoring the
>> Actual Text entirely.
>> Well, not entirely entirely. I added a dagger symbol to one of the column
>> headers, wrapped it in a <Span>, and gave it an Actual Text value of "See
>> important dagger note following table". (Please ignore the barbaric
>> wording.) And Voice Over gladly read it out as "1 year See important dagger
>> note following table". So Voice Over can handle Actual Text replacement in
>> this case.
>> What Is going on? Does VO do Actual Text replacement for a single
>> character only?
>> And another question: if I get the above scheme to work well with JAWS and
>> NVDA, and if VO is at least able to read the visible column header text
>> with the data values, would that count as "accessible enough"? (I realize
>> the latter question is contentious….)
>> Alan
>> >> >> >> >>
>
>
> --
> Best regards,
> Laura Roberts
>