NVDA PDF Actual Text bug

15th March 2017 | by Ted Page

There is currently a potentially show-stopping bug in NVDA , relating to the use of the Actual Text attribute in PDFs.  

Update, 1 June 2017: With the recent release of NVDA version 2017.2, the bug described below has been fixed. 

Now that one of the other major assistive technologies (ATs), namely SuperNova, more or less correctly differentiates between  PDF Actual Text and Alternate Text attributes, there is a practical, rather than just a theoretical reason for using each of these attributes correctly and to specification.

However, document authors need to be careful. The problem is that, if you add Actual Text to a piece of content and then delete it again (leaving the Actual Text field empty), the entire document will fail.

The problem

Specifically, if you then open the document in Acrobat Pro or Reader with NVDA running, on a Windows 7 machine NVDA will fall silent until you close Acrobat Pro or Reader. On a Windows 8 or Windows 10 machine, opening the document with NVDA running will immediately crash Acrobat Pro/Reader. 

The solution

You can fix the problem in Acrobat Pro by deleting any tag with an empty actual text attribute and then retagging the content in question from scratch.

Screenshot of Acrobat DC
Figure 1. exporting a PDF to XML from Acrobat DC

Exporting to XML

If you don’t know which tag or tags may be causing the problem you can search the PDF’s XML for any empty Actual Text attributes. To export as XML from Acrobat Pro, select File, Export To, and then XML 1.0. (See Figure 1 above.)

Using Ctrl/Cmd + F, you can then search the XML file for any empty Actual Text attributes (ActualText="").

XML code snippet
Figure 2. XML code snippet showing an empty Actual Text attribute

Bug reported

We have submitted a bug report with test files to NV Access detailing the problem (#7034). However, for the time being, if you delete the contents of an Actual Text attribute, don’t leave it empty. Instead, delete the tag in question and then recreate it from scratch.