Zoom to a specific level programmatically

The Zoom plugin provides the Zoom component that can be used to zoom to a particular level.
However, there is a case that you want to create a custom zoom button that is displayed outside of the Viewer component. This example demonstrates how we can archive that requirement by creating a custom plugin.

Create a plugin definition

Our plugin provides one function that zooms the document to particular level:
import { Plugin, SpecialZoomLevel } from '@react-pdf-viewer/core';
interface CustomZoomPlugin extends Plugin {
zoomTo(scale: number | SpecialZoomLevel): void;
}

Implement the plugin

Our plugin needs to store the zoom function provided by the PluginFunctions. You can think of the store as the central management that the plugin and the components in the plugin can interact with.
Our store is quite simple:
import { SpecialZoomLevel } from '@react-pdf-viewer/core';
interface StoreProps {
zoom?(scale: number | SpecialZoomLevel): void;
}
The store is initialized when we create the plugin:
import { createStore, PluginFunctions, SpecialZoomLevel } from '@react-pdf-viewer/core';
const customZoomPlugin = (): CustomZoomPlugin => {
const store = React.useMemo(() => createStore < StoreProps > {}, []);
};
When we register a plugin with the Viewer component, the plugin's install will be invoked. It is the right place to set the initial value for our store. In the following sample code, we just call the update function to set the zoom property:
const customZoomPlugin = (): CustomZoomPlugin => {
...
return {
install: (pluginFunctions: PluginFunctions) => {
store.update('zoom', pluginFunctions.zoom);
},
};
}
Now, since the customZoomPlugin function has to implement the CustomZoomPlugin interface, we have to implement the zoomTo function. We can retrieve the store properties here as following:
const customZoomPlugin = (): CustomZoomPlugin => {
...
return {
zoomTo: (scale: number | SpecialZoomLevel) => {
const zoom = store.get('zoom');
if (zoom) {
// Zoom to that scale
zoom(scale);
}
},
};
}

Use the plugin

We need to create an instance of the plugin and register it with the Viewer component:
const customZoomPluginInstance = customZoomPlugin();
const { zoomTo } = customZoomPluginInstance;
// Register the plugin
<Viewer fileUrl={fileUrl} plugins={[customZoomPluginInstance]} />;
The zoomTo function provided by the plugin instance can be used at anywhere to zoom the document:
<button onClick={() => zoomTo(SpecialZoomLevel.ActualSize)}>
Actual size
</button>
<button onClick={() => zoomTo(1.5)}>
150%
</button>

See also