Some test text!

Hamburger Icon

Web / Guides / User bookmarks

Creating user-defined bookmarks in WebViewer

WebViewer allows users to create bookmarks for each page. When clicked, these bookmarks will navigate to the saved page. In order to persist these bookmarks, WebViewer can easily export them. They can then be saved to a server. See our user-defined bookmarks demo to try it out.


You can enable bookmarks by enabling the following elements. The rest of this guide will demonstrate a ready to go sample and how you can export them.

  .then(instance => {
    instance.enableElements(['bookmarksPanel', 'bookmarksPanelButton']);


Initial setup

Clone from the sample. The directory should look something like this:

├── ...
├── package.json
├── client
│   ├── lib
│   │    ├── ...
│   ├── index.html
│   ├── index.js
│   └── webviewer-demo.pdf
└── server
    ├── bookmarks
    │    ├── ...
    ├── bookmarksHandler.js
    └── serve.js

How to run

  1. Navigate to the extracted sample folder and install the required dependencies to run the samples by executing:
npm install
  1. Next run the sample by executing:
npm start

You should see a message that reads:

Server is listening at http://localhost:3000/client/index.html
  1. Navigate to http://localhost:3000/client/index.html and you will see the sample WebViewer. Open the left panel and navigate to the last tab to see bookmarks. You should see the same bookmarks as the image above.

Import and Exporting Bookmarks

The webviewer instance contains the functions exportBookmarks and importBookmarks. You can use these along with AJAX requests to save and load the user bookmark data from a server, and setup the server to write and read XFDF files.

To save user bookmarks, the sample, uses POST and GET requests. In the sample you will find fetch request that are similar to the following:

  .then(function(instance) {
    // load the user bookmarks data for id 'doc123'
    fetch('/server/bookmarksHandler.js?documentId=doc123', {
      method: 'GET'
    }).then(function(response) {
      if (response.status === 200) {
        response.text().then(function(bookmarksString) {
          // {"0":"Bookmark 1","2":"Bookmark 2"}
          const bookmarks = JSON.parse(bookmarksString);

    // ...
    // later save the annotation data for doc123
    const bookmarks = instance.exportBookmarks();
    const bookmarksString = JSON.stringify(bookmarks);
    fetch('/server/bookmarksHandler.js?documentId=doc123', {
      method: 'POST',
      body: bookmarksString // written into a json file on server

To automatically save user bookmark changes you are able to listen to the userBookmarksChanged event. This event fires whenever there is any change to user bookmarks.

instance.iframeWindow.addEventListener('userBookmarksChanged', e => {
  const bookmarks = e.detail;
  const bookmarksString = JSON.stringify(bookmarks);
  // string to server

The sample uses Node.js as a backend for fulling the POST and GET requests, but other backends can also be used.

Quick Bookmarking

WebViewer v8.8.0 introduced a convenient shortcut to quickly add or remove a bookmark. This API instance.UI.enableBookmarkIconShortcutVisibility() enables this feature and shows a bookmark icon near the top right of the page. If the page is already bookmarked, users will see an filled blue icon.

Creating a bookmark this way will automatically populate into the panel using the “Untitled” title. Users who have the left panel open on the bookmark tab can also toggle whether or not they want to see the bookmark icon on the page.

To disable this feature, use this API instance.UI.disableBookmarkIconShortcutVisibility().

Get the answers you need: Chat with us