Accessibility Enhancements


VirtualViewer’s custom tooltips display the title of an HTML control in high-contrast text. Keyboard-only users may now trigger tooltips by focusing on an element–tooltips no longer appear only on hover. Tooltips will now appear over many more buttons, elements, and controls in the viewer. As tooltips now appear more often, this may result in multiple tooltips displaying at the same time.

Visual Focus Indicators

The main document pane now receives a strong blue outline when a user tabs to focus on it. Previously, focus was not indicated visually; this could cause a user to lose track of where they were in the process of tabbing through the viewer. This focus outline will not appear when a user focuses on the document by clicking.

Smoother Keyboard and Screenreader Interaction in Thumbnails

The page thumbnail, document thumbnail, and search thumbnail tabs have improved keyboard navigation. When thumbnails appear, users can navigate to the thumbnail pane with the tab key, and navigate between individual thumbnails with the arrow keys. Additionally, controls in the search thumbnail pane have been labelled correctly to support screenreader access.

Error Handling

VirtualViewer API Error Logging

All public VirtualViewer API validate the current state of the viewer before continuing their operation. Previously, if an API failed its validation check, the function would simply return silently with an undefined or invalid value. For example, if no document was open in the viewer, calling virtualViewer.saveDocument(); would result in no action and no response.

Now, if an API function fails validation based on the viewer’s state, VirtualViewer will log an error message to the console. There are no exceptions thrown, or additional behavior changes; no code changes should be required. This feature will significantly improve the debugging and custom code development process.

Dynamically-Loaded Image Stamp Errors

Custom code can add new image rubber stamps from the client, using the Javascript APIs virtualViewer.createImageStamp, virtualViewer.createImageStampArray, or virtualViewer.createImageStampArrayFromFunction.

Additional error handling has been added to these API functions to throw and display an error upon receiving invalid stamp data, rather than silently treating the invalid data as a null stamp.

To disable the user-visible exception dialog that appears on adding an invalid stamp, set the config.js item disableErrorModals.stamp to true. To display the exception dialog, leave this item set to false.

New Callbacks

New callbacks have been added to track annotation server calls. Set callbacks with the API virtualViewer.setCallback(callbackName, callbackHandler);, where the callback name parameter is a string, and the callback handler accepts a Javascript object of arguments.

  • annotationLoadCompleted will be called when the annotations for a document have been successfully loaded. The following parameters will be provided to the callback in the argument object:
    • documentId {String} The current document whose annotations have just been loaded.
    • paneIndex {Number} The current pane index for the document.
  • annotationLoadError will be called when the annotations for a document have failed to load, with an error. The following parameters will be provided to the callback in the argument object:
    • documentId {String} The current document whose annotations failed to load.
    • paneIndex {Number} The current pane index for the document.
    • statusText {String} The status text from the annotation request.
    • exceptionMessage {String} An exception message or reason for the error, as given by the server.

Additional Media Functionality

MOV Support

Most common MOV video files are now supported. Some older MOV files, or MOV files containing uncommon video encoding, may not be supported.

Media API

Added media-neutral API. This means for playVideo() or playAudio() there is also playMedia() that will play any media that’s currently open in the viewer. These exist for play, pause, playback speed, fast forward, and setting time. Please refer to the Javascript documentation for a full list of media API functionality.

Fixes and Changes

Handling of TIFF Formats with a Bitdepth of 1

TIFF images may be encoded and compressed in such a way that they have a bitdepth of 1. That is, every pixel is either black or white. VirtualViewer sends images to the client with a higher bitdepth, and allows users to set the contrast, gamma, and brightness of an image through the picture controls. For 1-bit images, the picture controls would affect the image correctly on the client, but would not render correctly on the server–attempting to adjust a pixel to any gray color in a 1-bit image is invalid.

This issue would appear if a user loaded an image with a bitdepth of 1, adjusted the image with picture controls, and attempted to save: none of the adjustments would save, and the image would be restored to its previous appearance.

Now, if a user has used the picture controls dialog to adjust a 1-bit image, the image will save correctly: VirtualViewer will ensure that the image saves as a 24-bit image, by converting a lossy or 1-bit TIFF to a TIFF_LZW image.

Restore ASCII Settings

Configured ASCII settings such as font and line spacing were not applied correctly to ASCII documents, so an ASCII document would be rendered in the viewer in an undesirable way. ASCII settings in web.xml are now honored and will correctly affect how ASCII documents are rendered.

SVG Exclusions

The init-param svgExclusions was listed in web.xml.example, but was no longer being used correctly. This item takes a comma-delimited list of format names. Any formats listed in this parameter will be sent to the VirtualViewer client as a raster image rather than as an SVG.

Improved Handling of Modified Flags for Watermarks

If a user creates a watermark, VirtualViewer sets a flag that marks a document as modified. Previously, if a user immediately deleted a watermark before saving the document, the modified flag would remain set, even though no change needed to be saved. Now, if no true change has been made to watermarks, the flag will not remain set automatically.

Localization Fixes and Changed Strings

Several localization calls in VirtualViewer now use updated keys to strings in locale files: Export, Print, Email, and Save As dialogs now use localized strings rather than English defaults.

The string with the key annotationInfoList.skipLink, used in the “Skip to content” button accessible to keyboard users, has been moved so its key is now simply skipLink. Two new strings have been added: pageRangeFields.pages to label the complex page range input field in several dialogs, and documentFilterPlaceholderText to fill ghost text in the document-thumbnail filter field.


  • VirtualViewer now parses date strings into Java objects in a thread-safe manner, preventing errors where a date would print as “Invalid Date.”

  • When the web.xml parameter fastRasterToPDFAssembly is set to true and fastRasterToPDFShrinkToFit is set to false, annotations could appear deformed when exporting to PDF. Annotations will now correctly export in this case.

  • On Internet Explorer, document search now concludes correctly and removes its progress bar when search is complete.

  • Document search will now scroll the document to focus on the first search result found.

  • VirtualViewer will now render “cloud” and “bubble” annotations–non-Snowbound and unsupported annotation types–as ellipses on the client.

  • Copying and pasting an annotation could fail on Internet Explorer. Users should now be able to copy and paste annotations on Internet Explorer.

  • Loading VirtualViewer in a hidden iframe–for example, an iframe initialized with the style display: none;–could cause the horizontal scrollbar to ignore user input. The horizontal scrollbar now works correctly even when VirtualViewer is loaded in a hidden iframe.

  • Previously, the scrollbars on the main document view were a valid area for starting annotations, causing unexpected annotation creation while simply dragging the scrollbar. Annotations may no longer be drawn with a starting point on the scrollbar.

  • Initiating a crop or rubberband zoom action would fail while the annotation options pop-up was visible; now, the viewer properly hides the annotation pop-up and initiates crop or rubberband zoom.

  • Using picture controls on Microsoft Edge to modify the brightness, contrast, and gamma values of an image no longer sporadically causes the image to disappear.

  • Annotation layers with the VIEW permission are now able to be temporarily hidden and revealed in the client-side layer manager.

  • Virtual Documents no longer fail to parse a starting page larger than 10.

  • An extra annotation note or document note now is not added to itself when the cancel button is clicked on.

  • Dropping a page thumbnail onto a shortened document tab can result in it going into the wrong tab if two tabs have the same shortened display name.