Some test text!

platform
search

Customizing header

Contents

Header composition
Header items
ActionButton
StatefulButton
ToggleElementButton
ToolButton
ToolGroupButton
CustomElement
Spacer
Divider
Examples
Adding save annotations button
Removing existing buttons
Appending logo and shifting existing buttons to the right
Relevant APIs

There are a number of ways you may want to customize the header. To name a few:

  • Removing all annotation tool buttons
  • Reordering annotation tool buttons
  • Replacing the existing view controls buttons with custom buttons
  • Adding a custom annotation tool button
  • Replace the entire header with different items in smaller screens

The WebViewer UI provides a flexible API to easily handle each of these cases and more.

To learn about structure and different types of items, you can start reading from header composition and header items. Otherwise, you can jump straight to examples and relevant APIs.

linkHeader composition

The header is represented by an array of header items and you can edit the array to add/remove/reorder them however you want. The API, setHeaderItems, will provide a header object as a function argument.

For cases where the user wants to replace the entire header items back and forth, the header items are grouped, and displayed only when the group is active:

linkHeader items

Header items are objects with certain properties. If you wish to add a header item, it is important for you to understand what type it is and what properties should be used.

linkActionButton

ActionButton triggers an action. The button has no active state.

Properties

  • type (string) - Must be set to actionButton.
  • img (string) - Path to an image or base64 data.
  • onClick (function) - Function to be triggered on click.
  • title (string, optional) - Tooltip of the button.
  • dataElement (string, optional) - Option to set data-element value of the button element. It can be used to disable/enable the element.
  • hidden (array of strings, optional) - Option to hide the element at certain screen sizes. Accepted strings are desktop, tablet and mobile.

Example

const newActionButton = {
  type: 'actionButton',
  img: 'path/to/image',
  onClick: () => alert('Hello world!'),
  dataElement: 'alertButton',
  hidden: [ 'mobile' ]
};

linkStatefulButton

StatefulButton is a customizable button. You can decide how many states it has, what state is active and when to update the state.

Properties

  • type (string) - Must be set to statefulButton.
  • initialState (string) - String that is one of states object's keys.
  • states (object) - Object in the shape of: { nameOfState1: state1, nameOfState2: state2, ... }

    • Properties of a state:
    • img (string, optional): Path to an image or base64 data.
    • getContent (function, optional): Function to be called when you update the state. Define this property if you don't use the img property for this button. Argument: activeState.
    • onClick (function): Function to be triggered on click. Arguments: update, activeState.
    • Any other properties you need.
  • mount (function) - Function to be called after the button is mounted into DOM
  • unmount (function, optional) - Function to be called before the button is unmounted from DOM.
  • dataElement (string, optional) - String to set data-element value of the button element. It can be used to disable/enable the element.
  • title (string, optional) - Tooltip of the button.
  • hidden (array of strings, optional) - Option to hide the element at certain screen sizes. Accepted strings are desktop, tablet and mobile.

Example

A stateful button that shows the count. And when you click it, it will increment the counter by 1.

const countButton = {
  type: 'statefulButton',
  initialState: 'Count',
  states: {
    Count: {
      number: 1,
      getContent: (activeState) => activeState.number,
      onClick: (update, activeState) => {
        activeState.number += 1;
        update();
      }
    }
  },
  dataElement: 'countButton'
};

A stateful button that shows the current page number. And when you click it, the document will go to next page. If you are already at the last page, the document will go to the first page.

const nextPageButton = {
  type: 'statefulButton',
  initialState: 'Page',
  states: {
    Page: {
      // Checkout https://www.pdftron.com/documentation/web/guides/ui/apis to see more APIs related with viewerInstance
      getContent: () => viewerInstance.getCurrentPageNumber(),
      onClick: () => {
        const currentPage = viewerInstance.getCurrentPageNumber();
        const totalPages = viewerInstance.getPageCount();
        const atLastPage = currentPage === totalPages;

        if (atLastPage) {
          viewerInstance.goToFirstPage();
        } else {
          viewerInstance.goToNextPage();
        }
      }
    }
  },
  mount: (update) => {
    // Checkout https://www.pdftron.com/api/web/CoreControls.DocumentViewer.html to see more APIs and events with docViewer
    viewerInstance.docViewer.on('pageNumberUpdated.nextPageButton', () => {
      // We want to update this button when page number changes so it can have the correct content;
      update();
    });
  },
  unmount: () => {
    viewerInstance.docViewer.off('pageNumberUpdated.nextPageButton')
  },
  dataElement: 'nextPageButton'
};

A stateful button that changes the fit mode of the document.

This button is in our built-in UI, checkout it out at https://www.pdftron.com/webviewer/demo/.

const fitButton = {
  type: 'statefulButton',
  initialState: 'FitWidth',
  states: {
    FitWidth: {
      img: 'path/to/fitWidth/image',
      onClick: () => viewerInstance.setFitMode(viewerInstance.FitMode.FitWidth),
    },
    FitPage: {
      img: 'path/to/fitPage/image',
      onClick: () => viewerInstance.setFitMode(viewerInstance.FitMode.FitPage),
    }
  },
  mount: (update) => {
    const fitModeToState = (fitMode) => {
      // the returned state should be the opposite of the new current state
      // as the opposite state is what we want to switch to when the button
      // is clicked next
      if (fitMode === viewerInstance.docViewer.FitMode.FitPage) {
        return 'FitWidth';
      } else if (fitMode === viewerInstance.docViewer.FitMode.FitWidth) {
        return 'FitPage';
      }
    };

    viewerInstance.docViewer.on('fitModeUpdated.fitbutton', (e, fitMode) => {
      update(fitModeToState(fitMode));
    });
  },
  unmount: () => {
    viewerInstance.docViewer.off('fitModeUpdated.fitbutton');
  },
  dataElement: 'fitButton',
  hidden: ['mobile']
};

linkToggleElementButton

ToggleElementButton opens/closes a UI element. The button is in an active state when the UI element is open.

Properties

  • type (string) - Must be set to toggleElementButton.
  • img (string) - Path to an image or base64 data.
  • element (string) - data-element attribute value of the UI element to be opened/closed.
  • dataElement (string, optional) - Option to set data-element value of the button element. It can be used to disable/enable the element.
  • title (string, optional) - Tooltip of the button.
  • hidden (array of strings, optional) - Option to hide the element at certain screen sizes. Accepted strings are desktop, tablet and mobile.

Example

const newToggleElementButton = {
  type: 'toggleElementButton',
  img: 'path/to/image',
  element: 'leftPanel',
  dataElement: 'leftPanelButton',
  hidden: [ 'mobile' ]
};

linkToolButton

ToolButton activates a WebViewer tool. The button is in an active state when the tool is activated. To learn more about customizing annotation tools and tool buttons, see customizing annotation tools.

Properties

  • type (string) - Must be set to toolButton.
  • toolName (string) - Name of the tool, which is either the key from toolModeMap or the name you registered your custom tool with. For custom tool registration, refer to registerTool.
  • title (string, optional) - Tooltip of the button.
  • hidden (array of strings, optional) - Option to hide the element at certain screen sizes. Accepted strings are desktop, tablet and mobile.

Example

const newToolButton = {
  type: 'toolButton',
  toolName: 'AnnotationCreateFreeText',
  hidden: [ 'mobile' ]
}

linkToolGroupButton

ToolGroupButton opens an overlay with the tools in the tool group. Unless the img option is set, the button displays the image of one of the group members. The button is in an active state when any tool in the group is active. To learn more about customizing annotation tools and tool buttons, see customizing annotation tools.

Properties

  • type (string) - Must be set to 'toolGroupButton'.
  • toolGroup (string) - Name of the tool group. In the default viewer, there are freeHandTools, textTools, shapeTools and miscTools.
  • img (string, optional) - Path to an image or base64 data.
  • dataElement (string, optional) - Option to set data-element value of the button element. It can be used to disable/enable the element.
  • title (string, optional) - Tooltip of the button.
  • hidden (array of strings, optional) - Option to hide the element at certain screen sizes. Accepted strings are desktop, tablet and mobile.

Example

const newToolGroupButton = {
  type: 'toolGroupButton',
  toolGroup: 'shapeTools',
  dataElement: 'shapeToolGroupButton',
  hidden: [ 'mobile' ]
};

linkCustomElement

CustomElement takes a render function and renders DOM elements or React components. You may want to use this when the buttons above don't suffice.

Properties

  • type (string) - Must be set to 'customElement'.
  • title (string, optional) - Tooltip of the button.
  • render (func) - Function that returns DOM elements or React components
  • hidden (array of strings, optional) - Option to hide the element at certain screen sizes. Accepted strings are desktop, tablet and mobile.

Example

const renderSlider = () => {
  const slider = document.createElement('input');
  slider.type = 'range';
  slider.oninput = () => {
    // Do something
  };

  return slider;
}

const newCustomElement = {
  type: 'customElement',
  render: renderSlider
};

In React jsx:

const Slider = () => {
  return (
    <input
      type="range"
      onInput={() => { /* Do something */}}
    >
    </input>
  );
}

const newCustomElement = {
  type: 'customElement',
  render: () => <Slider />
};

linkSpacer

Spacer is just a div with flex: 1 to occupy any remaining space. It is used to push the buttons to each side on the default header.

Properties

  • type (string) - Must be set to 'spacer'.
  • hidden (array of strings, optional) - Option to hide the element at certain screen sizes. Accepted strings are desktop, tablet and mobile.

Example

const newSpacer = {
  type: 'spacer',
  hidden: [ 'mobile' ]
};

linkDivider

Divider renders a vertical bar with some margin to separate item groups.

Properties

  • type (string) - Must be set to 'divider'.
  • hidden (array of strings, optional) - Option to hide the element at certain screen sizes. Accepted strings are desktop, tablet and mobile.

Example

const newDivider = {
  type: 'divider',
  hidden: [ 'mobile' ]
};

linkExamples

linkAdding save annotations button

var viewerElement = document.getElementById('viewer');
var viewer = new PDFTron.WebViewer({ ... }, viewerElement);

viewerElement.addEventListener('ready', function() {
  var viewerInstance = viewer.getInstance();
  viewerInstance.setHeaderItems(function(header) {
    header.push({
      type: 'actionButton',
      img: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"/><path d="M17 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V7l-4-4zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm3-10H5V5h10v4z"/></svg>',
      onClick: function() {
        viewerInstance.saveAnnotations();
      }
    });
  });
});

linkRemoving existing buttons

var viewerElement = document.getElementById('viewer');
var viewer = new PDFTron.WebViewer({ ... }, viewerElement);

viewerElement.addEventListener('ready', function() {
  var viewerInstance = viewer.getInstance();
  viewerInstance.setHeaderItems(function(header) {
    var items = header.getItems().slice(9, -3);
    header.update(items);
  });
});

linkAppending logo and shifting existing buttons to the right

var viewerElement = document.getElementById('viewer');
var viewer = new PDFTron.WebViewer({ ... }, viewerElement);

viewerElement.addEventListener('ready', function() {
  var viewerInstance = viewer.getInstance();
  viewerInstance.setHeaderItems(function(header) {
    header.delete(9);
    header.unshift({
      type: 'customElement',
      render: function() {
        var logo = document.createElement('img');
        logo.src = 'https://www.pdftron.com/downloads/logo.svg';
        logo.style.width = '200px';
        logo.style.marginLeft = '10px';
        logo.style.cursor = 'pointer';
        logo.onclick = function() {
          window.open('https://www.pdftron.com', '_blank');
        }
        return logo;
      }
    }, {
      type: 'spacer'
    });
  });
});

linkRelevant APIs

To add/remove/re-order header items, you can use the following API:

For ToolButton, make sure you register/unregister the tool using:

To switch a header group, you can use the following API:

Get the anwsers you need: Support

Contents

Header composition
Header items
ActionButton
StatefulButton
ToggleElementButton
ToolButton
ToolGroupButton
CustomElement
Spacer
Divider
Examples
Adding save annotations button
Removing existing buttons
Appending logo and shifting existing buttons to the right
Relevant APIs