Below, please find the release notes for VirtualViewer v4.12. For questions, please contact us at or by phone at (617) 607-2010.

New Features


VirtualViewer can now load and play videos, in formats supported by HTML5-compatible browsers. There is no editing or annotation support at this time - videos can only be viewed and downloaded. Video format support will depend on the capabilities of the web browser.

Supported formats

VirtualViewer uses the browser’s HTML5 video player to display video, and can play all types of video supported by a browser’s player. Most browsers support MP4, WebM and Ogg Vorbis. This browser compatibility chart has more details:

User preferences

There are several new configuration options for displaying video. These options can be viewed and modified in User Preferences:

  • Video Autoplay: If enabled, the video will play as soon as it is opened. If disabled, the user must click play in order to start the video.
  • Mute: If enabled, the video will start muted and the user must click to unmute. If disabled, the video will start at full volume.
  • Video Controls: If enabled, the video will have the controls appear on the bottom of the player to control playback, fullscreen, volume, and the ability to download the video. Available options may change depending on the browser you are using. If disabled, video controls will be hidden from view and only accessible through the right-click menu.
  • Video Stretching: If enabled, the video will stretch beyond its original size to fill the viewer. It will keep its aspect ratio, which means the video will not distort as it stretches. It acts like the Fit to Window zoom option, so it will fit to height or width and may not actually fill the viewport. If disabled, the video will not expand beyond its original size and will center in VirtualViewer’s main display area.

All of these options have equivalent config.js configuration options as defaults.

Supported features with video

We currently support the following actions with video:

  • Opening and viewing video.
  • Downloading the video. This cannot be disabled.
  • Change video viewing size (original size, fit to window and fullscreen).

The following are some things that are limitations of the HTML5 Video Player:

  • Some browsers may not be able to seek, they just play from start to finish. Firefox had no issues seeking, Chrome did.
  • Fast Forward and Rewind aren’t baked into HTML5 Video Player.

Add configuration to auto-resize only sticky notes

When the configuration parameter vvConfig.autoResizeTextAnnotations is set to true, the viewer automatically resizes text annotations to fit the annotation text. If vvConfig.autoConfirmTextAnnotations is also set to true, the text annotation will change its size as the user types.

Now, there is a new configuration parameter vvConfig.autoResizeStickyNoteAnnotations. This fine-tunes the configuration control. vvConfig.autoResizeTextAnnotations will now only affect text annotations, and vvConfig.autoResizeStickyNoteAnnotations will only affect sticky note annotations.

Set document display name API

A new Javascript API virtualViewer.setDisplayName(newDisplayName, documentID) will set the document specified by the given document ID to the new display name. The display name will update on the document tab and document thumbnail.

Highlight annotation button currently in use

When the user clicks a button to draw an annotation, that button will stay highlighted until the user completes the annotation.

Redaction navigation

Enhanced redaction navigation has been added to VirtualViewer. When the configuration for vvConfig.showAnnNavToggle is set to true, the previous navigation buttons are displayed as well as a set of radio buttons. The radio buttons are for the two navigation modes and display the annotation and redaction counts for the document. When the annotation navigation mdoe is selected, navigation occurs as it did in the past. When redaction navigation is selected, it goes from redaction to redaction throughout the whole document. The redactions are selected and are focused on. The filter pages button does not work in redaction navigation mode and is disabled.

Page manipulation with bookmarks

VirtualViewer now retains bookmarks created on pages of a document as they are subject to page manipulations. The bookmarks would remain with the page in both reordering pages, cut/paste to other documents and cut/copy to new document.

Cache-seeding support (Java)

There is a new client side API that allows the server to pre-cache images for future use. By calling virtualViewer.seedCache(documentId, pages, clientInstanceId), the user can get pages ready on the server, allowing for quicker retrieval.

Fixes and changes

Stricter URL encoding requirements in Java

Recent versions of Java enforce stricter URL validation. Now, URLs entered directly into the browser’s address bar must properly encode all URI components. Unencoded URLs that may have succeeded in the past may now fail.

For instance, Virtual Documents in VirtualViewer may be opened directly from the address bar, by entering a Virtual Document ID in the documentID field: VirtualDocument:documentName.pdf[1-3]. This request uses square brackets to specify a page range. The square brackets will cause the request to fail on newer versions of Java. To work, the square brackets must be URI-encoded as %5B for the opening bracket [, and %5D for the closing bracket ]. The Virtual Document ID, properly encoded, will work: VirtualDocument:documentName.pdf%5B1-3%5D. Square brackets and other invalid characters must be URI-encoded.

VirtualViewer API for launching documents (virtualViewer.openInTab(documentID), for example) will automatically encode the document ID as needed. Manual encoding only needs to occur when typing a VirtualViewer URL directly into the browser’s address bar.

officeLicensePath parameter has been replaced by ODFLicensePath

The officeLicensePath parameter is only needed for working with OpenOffice OpenDocument Format files (ODF). You will only need to use the ODFLicensePath parameter to provide the path to this license if you’ve licensed the OpenOffice format.

VirtualViewer initialization API are easier to work with

The API function beforeVirtualViewerInit is called before the VirtualViewer object is initialized, and the API function afterVirtualViewerInit is called after; these functions are intended to be defined by customers to easily run code as VirtualViewer starts up. Previously customers would have to define these API functions after index.html was loaded; now, they can be defined any time.

Preserve document scroll when zooming

Previously, zooming in and out would cause the document to jump to the top of the current page. Now, older functionality is restored, and the document will stay in the same scroll position while zooming in and out.

Preserve document scroll and zoom when switching between tabs

When switching between open document tabs in the viewer, documents will now stay at the current zoom and scroll position that the user set, rather than snapping to the default zoom and going to the top of the current page. If the configuration parameter fitLastBetweenDocuments is set to true, the document will still apply the zoom of the current document to the next document opened.

disableUploadDocument parameter moved to server

The config.js parameter to disable the Upload Document functionality has been replaced with a server setting, disableUploadDocument. The config.js parameter disableUploadDoc is no longer used.

When the server setting disableUploadDocument is set to true, the service endpoint for upload will be completely disabled, so that clever users can no longer bypass the UI to “force” a document into the system. In prior releases, we specified that the content handler should handle the filtering of uploaded documents. Filtering should still be performed by the content handler, but there is now a way to completely disable upload document.

Removed sample content handlers from VirtualViewer distributable

Some sample content handlers were removed from compiled VirtualViewer code. They will no longer be accessible. Any of the following sample content handlers in use should be replaced by a customized version of the default content handler.

  • InputStreamContentHandler
  • FileAndURLRetriever
  • MergedImageContentHandler
  • MultiContentElementContentHandler

Public print API

The parameters for the printDocument() method have changed. The new parameters are as follows:

  • {String} The documentId to print, must be of a document open in the viewer
  • {Boolean} If true, a PDF will be exported to a file. The user will be present with a save dialog
  • {Boolean} If true, the annotations will be printed.
  • {Boolean} Whether or not to burn in redactions.
  • {Boolean} Whether or not to include redaction tags (only used when includeRedactions is true).
  • {Boolean} Whether or not to include watermarks.
  • {Boolean} Whether or not to include document notes.
  • {String} Either “all”, “complex” or “current”.
  • {String} A range of pages numbers to export (only used for “complex” pageRangeType).

Alternative License Loading (Java)

Some customers, who’s servlet containers were not expanding the WAR file, but instead operating on it directly (like WebSphere) were seeing an issue using the env-entry to specify the VV license file. We added an alternative mechanism to specify the license file using an init-param:


If you use this init-param, you will need to completely remove the env-entry from your web.xml.

Note: Features which depend on JNI, namely DWG and OCR support, are incompatible with the init-param license loading. If you need these features you will need to use the env-entry mechanism

Misc. Fixes/Changes:

  • Improved the responsiveness of the toolbars
  • Added a close button to the split screen/document compare panel
  • Fixed an issue with the autoLayerPrefix when there were existing autolayers
  • Previously, if you created an annotation layer in the Layer Manager dialog and clicked the dialog box’s OK button instead of the layer UI’s OK button, the layer would not be created
  • Fixed issue with annotation layers and page manipulations
  • Fixed several minor/cosmetic issues with search UI
  • Load the document model asynchronously, to improve responsiveness
  • Make sure the document model has been loaded before requesting an image from the server
  • Fixed tab naming after closing document compare panel
  • Fixed issue with watermarks and reordering pages
  • Confirm user wants to save when closing the browser window/tab
  • Fixed an issue with image buffering
  • Fixed issue with page-change callbacks where they were firing even if the page didn’t actually change (like calling firstPage() when you were already on page one).