From b2c1af6f5b769d8264c2d9d5d7afc27b27f84163 Mon Sep 17 00:00:00 2001 From: SF4524LogeshKumar Date: Wed, 25 Mar 2026 10:49:59 +0530 Subject: [PATCH 1/4] 1017187: Updated Magnification and Interaction Mode UG React --- .../PDF/PDF-Viewer/react/images/zoomPdf.png | Bin 0 -> 59910 bytes .../PDF/PDF-Viewer/react/interaction-mode.md | 285 +++++++- .../PDF/PDF-Viewer/react/magnification.md | 97 --- .../PDF-Viewer/react/magnification/fitmode.md | 547 ++++++++++++++ .../react/magnification/magnification.md | 152 ++++ .../PDF-Viewer/react/magnification/zoom.md | 666 ++++++++++++++++++ 6 files changed, 1615 insertions(+), 132 deletions(-) create mode 100644 Document-Processing/PDF/PDF-Viewer/react/images/zoomPdf.png delete mode 100644 Document-Processing/PDF/PDF-Viewer/react/magnification.md create mode 100644 Document-Processing/PDF/PDF-Viewer/react/magnification/fitmode.md create mode 100644 Document-Processing/PDF/PDF-Viewer/react/magnification/magnification.md create mode 100644 Document-Processing/PDF/PDF-Viewer/react/magnification/zoom.md diff --git a/Document-Processing/PDF/PDF-Viewer/react/images/zoomPdf.png b/Document-Processing/PDF/PDF-Viewer/react/images/zoomPdf.png new file mode 100644 index 0000000000000000000000000000000000000000..4f166de69da6a38133bc5c8ba9d6a9b711f9e634 GIT binary patch literal 59910 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%0DF{X|#`TfBN_t)ojpv{0tl0qGEJdcB@Wm)i0fumq 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 literal 0 HcmV?d00001 diff --git a/Document-Processing/PDF/PDF-Viewer/react/interaction-mode.md b/Document-Processing/PDF/PDF-Viewer/react/interaction-mode.md index eb7cfe100c..720060c878 100644 --- a/Document-Processing/PDF/PDF-Viewer/react/interaction-mode.md +++ b/Document-Processing/PDF/PDF-Viewer/react/interaction-mode.md @@ -1,20 +1,27 @@ --- layout: post -title: Interaction mode in React Pdfviewer component | Syncfusion -description: Learn here all about Interaction mode in Syncfusion React Pdfviewer component of Syncfusion Essential JS 2 and more. +title: Interaction Mode in React PDF Viewer | Syncfusion +description: Learn how to work with interaction modes (Pan and Text Selection) in the Syncfusion React PDF Viewer component. control: PDF Viewer platform: document-processing documentation: ug domainurl: ##DomainURL## --- -# Interaction mode in React PDF Viewer component +# Interaction Mode in React PDF Viewer -The PDF Viewer provides interaction modes for interacting with the loaded PDF document. Selection mode and panning mode are the two interaction modes. +The PDF Viewer provides two interaction modes to control how users interact with the document: **Pan** mode for document navigation and **Text Selection** mode for text selection and copying. -## Selection mode +The [InteractionMode](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/interactionmode) enum defines the available interaction modes for the PDF Viewer. -In this mode, users can select and copy text from the loaded PDF document. Panning and touch scrolling are disabled while text selection is enabled. Use the following snippet to enable or disable text selection. +| Value | Description | +|-------|-------------| +| `TextSelection` | Enables text selection and copying. Panning is disabled. | +| `Pan` | Enables panning and document navigation. Text selection is disabled. | + +## Enable pan as default interaction + +Set [InteractionMode](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/interactionmode) to `Pan` to enable pan mode by default. In pan mode, users can drag to navigate the document, but text selection is disabled. {% tabs %} {% highlight js tabtitle="Standalone" %} @@ -27,23 +34,20 @@ import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; function App() { - return (

); - } const root = ReactDOM.createRoot(document.getElementById('sample')); root.render(); @@ -60,23 +64,20 @@ import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; function App() { - return (
- {/* Render the PDF Viewer */} - +
); - } const root = ReactDOM.createRoot(document.getElementById('sample')); root.render(); @@ -85,15 +86,24 @@ root.render(); {% endhighlight %} {% endtabs %} -![Selection mode screenshot](./images/selection.png) +## Switch between Pan and Text Selection + +Switch between Pan and Text Selection modes using the toolbar buttons in the UI or programmatically. When in Pan mode, text selection is disabled, and when in Text Selection mode, panning is disabled. + +### Using Toolbar + +The toolbar provides built-in buttons to switch between Pan and Text Selection modes without any code. Users can click the mode toggle button to switch. -## Panning Mode +**Pan Mode:** When Pan mode is active, the cursor changes to a hand icon, allowing users to drag and scroll through the document. Text selection is disabled in this mode. -In this mode, panning and touch scrolling are enabled for the loaded PDF document; text selection is not available. +![Pan](./images/pan.png) -![Panning mode screenshot](./images/pan.png) +**Selection Mode:** When Text Selection mode is active, the cursor changes to a text selection cursor, allowing users to highlight and copy text from the PDF. Panning is disabled in this mode. -You can switch the PDF Viewer interaction mode using the following snippet. +![Selection Mode](./images/selection.png) + +### Programmatically +Use the `interactionMode` property to switch modes programmatically: {% tabs %} {% highlight js tabtitle="Standalone" %} @@ -106,24 +116,35 @@ import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; function App() { + const pdfViewerRef = React.useRef(null); + + const switchToPan = () => { + pdfViewerRef.current.interactionMode = 'Pan'; + }; + + const switchToTextSelection = () => { + pdfViewerRef.current.interactionMode = 'TextSelection'; + }; return (
+
+ + +
- {/* Render the PDF Viewer */} - +
); - } const root = ReactDOM.createRoot(document.getElementById('sample')); root.render(); @@ -140,24 +161,217 @@ import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; function App() { + const pdfViewerRef = React.useRef(null); + + const switchToPan = () => { + pdfViewerRef.current.interactionMode = 'Pan'; + }; + + const switchToTextSelection = () => { + pdfViewerRef.current.interactionMode = 'TextSelection'; + }; + + return (
+
+ + +
+
+ + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% endtabs %} + +## Disable text selection (enable pan mode) + +Disable text selection by setting `enableTextSelection={false}` to enable pan mode for document navigation. When text selection is disabled, users can only pan through the document and cannot select or copy text. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + return (
+
+ + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; +function App() { return (
- {/* Render the PDF Viewer */} - + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% endtabs %} + +## Programmatically toggle interaction mode during runtime + +Toggle interaction modes at runtime in response to events or user actions, such as when opening annotation tools. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + const pdfViewerRef = React.useRef(null); + const [isAnnotating, setIsAnnotating] = React.useState(false); + + const handleOpenAnnotationTool = () => { + // Switch to TextSelection mode when opening annotation tool + pdfViewerRef.current.interactionMode = 'TextSelection'; + setIsAnnotating(true); + }; + + const handleCloseAnnotationTool = () => { + // Switch back to Pan mode + pdfViewerRef.current.interactionMode = 'Pan'; + setIsAnnotating(false); + }; + + return (
+
+ + +
+
+ + +
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + const pdfViewerRef = React.useRef(null); + const [isAnnotating, setIsAnnotating] = React.useState(false); + + const handleOpenAnnotationTool = () => { + // Switch to TextSelection mode when opening annotation tool + pdfViewerRef.current.interactionMode = 'TextSelection'; + setIsAnnotating(true); + }; + + const handleCloseAnnotationTool = () => { + // Switch back to Pan mode + pdfViewerRef.current.interactionMode = 'Pan'; + setIsAnnotating(false); + }; + + return (
+
+ + +
+
+ + + +
+
); } const root = ReactDOM.createRoot(document.getElementById('sample')); root.render(); @@ -168,5 +382,6 @@ root.render(); ## See also -* [Toolbar items](./toolbar) -* [Feature Modules](./feature-module) \ No newline at end of file +* [Magnification](./magnification) — Control zoom and fit modes +* [Toolbar items](./toolbar) — Customize toolbar controls +* [Feature Modules](./feature-module) — Enable/disable features \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/react/magnification.md b/Document-Processing/PDF/PDF-Viewer/react/magnification.md deleted file mode 100644 index 952914e0d4..0000000000 --- a/Document-Processing/PDF/PDF-Viewer/react/magnification.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -layout: post -title: Magnification in React Pdfviewer component | Syncfusion -description: Learn here all about Magnification in Syncfusion React Pdfviewer component of Syncfusion Essential JS 2 and more. -control: PDF Viewer -platform: document-processing -documentation: ug -domainurl: ##DomainURL## ---- - -# Magnification in React Pdfviewer component - -The PDF Viewer includes built-in magnification tools: ZoomIn, ZoomOut, Zoom, FitPage, and FitWidth. These tools appear in the default toolbar and can be shown or hidden as needed. - -The following code snippet shows how to enable magnification in the PDF Viewer. - -{% tabs %} -{% highlight js tabtitle="Standalone" %} -{% raw %} - -import * as ReactDOM from 'react-dom'; -import * as React from 'react'; -import './index.css'; -import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, - ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; - -function App() { - return (
-
- {/* Render the PDF Viewer */} - - - - -
-
); -} -const root = ReactDOM.createRoot(document.getElementById('sample')); -root.render(); - -{% endraw %} -{% endhighlight %} -{% highlight js tabtitle="Server-Backed" %} -{% raw %} - -import * as ReactDOM from 'react-dom'; -import * as React from 'react'; -import './index.css'; -import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, - ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; - -function App() { - return (
-
- {/* Render the PDF Viewer */} - - - - -
-
); -} -const root = ReactDOM.createRoot(document.getElementById('sample')); -root.render(); - -{% endraw %} -{% endhighlight %} -{% endtabs %} - -The following magnification options are available in the default toolbar of PDF Viewer, -The following magnification options are available in the default toolbar of the PDF Viewer: - -- [**ZoomIn**](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/magnification/#zoomin): Zoom in from the current zoom value of the PDF pages. -- [**ZoomOut**](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/magnification/#zoomout): Zoom out from the current zoom value of the PDF pages. -- [**Zoom**](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/magnification/#zoomto): Zoom to a specific zoom value for the PDF pages. -- [**FitPage**](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/magnification/#fittopage): Fit the page to the available viewport size. -- [**FitWidth**](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/magnification/#fittowidth): Fit the page width to the viewport based on page content size. - -![PDF Viewer magnification toolbar](./images/zoom.png) - -N> The PDF Viewer supports zoom values from 10–400%. - -## See also - -* [Toolbar items](./toolbar) -* [Feature Modules](./feature-module) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/react/magnification/fitmode.md b/Document-Processing/PDF/PDF-Viewer/react/magnification/fitmode.md new file mode 100644 index 0000000000..be04560833 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/react/magnification/fitmode.md @@ -0,0 +1,547 @@ +--- +layout: post +title: Fit Modes in React PDF Viewer | How-to Guide | Syncfusion +description: Learn how to implement fit modes (Fit Page and Fit Width) in the Syncfusion React PDF Viewer component. Control initial view, toggle fit modes, and handle container resize. +control: PDF Viewer +platform: document-processing +documentation: ug +domainurl: ##DomainURL## +--- + +# Fit Modes in React PDF Viewer + +This how-to guide demonstrates how to work with fit modes in the React PDF Viewer component. Learn how to fit pages to the viewport, set initial fit modes, toggle between modes, and handle responsive resizing. + +## Fit the entire page to the viewport + +Use the [fitToPage()](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/magnification#fittopage) method to scale the PDF so the entire page fits within the available viewport size. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + const pdfViewerRef = React.useRef(null); + + const handleFitPage = () => { + // Fit entire page to viewport + pdfViewerRef.current.magnification.fitToPage(); + }; + + return (
+
+ +
+
+ + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + const pdfViewerRef = React.useRef(null); + + const handleFitPage = () => { + // Fit entire page to viewport + pdfViewerRef.current.magnification.fitToPage(); + }; + + return (
+
+ +
+
+ + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% endtabs %} + +## Fit page width to the viewport + +Use the [fitToWidth()](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/magnification#fittowidth) method to scale the PDF so the page width matches the viewport width. The height may extend beyond the visible area. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + const pdfViewerRef = React.useRef(null); + + const handleFitWidth = () => { + // Fit page width to viewport + pdfViewerRef.current.magnification.fitToWidth(); + }; + + return (
+
+ +
+
+ + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + const pdfViewerRef = React.useRef(null); + + const handleFitWidth = () => { + // Fit page width to viewport + pdfViewerRef.current.magnification.fitToWidth(); + }; + + return (
+
+ +
+
+ + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% endtabs %} + +## Set a default fit mode on load (initial view) + +Set an initial fit mode when the PDF Viewer is rendered by using the [zoomMode](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/zoommode) property. The available zoom modes are: +- [Default](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/zoommode): Default zoom mode. +- [FitToWidth](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/zoommode): Fit page width to viewport. +- [FitToPage](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/zoommode): Fit entire page to viewport. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + const pdfViewerRef = React.useRef(null); + + return (
+
+ + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + const pdfViewerRef = React.useRef(null); + + return (
+
+ + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% endtabs %} + +## Toggle Fit Page / Fit Width from a custom toolbar + +Create custom toolbar buttons to toggle between fit modes. This gives users control over how the PDF is displayed. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + const pdfViewerRef = React.useRef(null); + const [currentFitMode, setCurrentFitMode] = React.useState('width'); + + const handleFitPage = () => { + pdfViewerRef.current.magnification.fitToPage(); + setCurrentFitMode('page'); + }; + + const handleFitWidth = () => { + pdfViewerRef.current.magnification.fitToWidth(); + setCurrentFitMode('width'); + }; + + return (
+
+ + +

+ Current mode: {currentFitMode === 'page' ? 'Fit Page' : 'Fit Width'} +

+
+
+ + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + const pdfViewerRef = React.useRef(null); + const [currentFitMode, setCurrentFitMode] = React.useState('width'); + + const handleFitPage = () => { + pdfViewerRef.current.magnification.fitToPage(); + setCurrentFitMode('page'); + }; + + const handleFitWidth = () => { + pdfViewerRef.current.magnification.fitToWidth(); + setCurrentFitMode('width'); + }; + + return (
+
+ + +

+ Current mode: {currentFitMode === 'page' ? 'Fit Page' : 'Fit Width'} +

+
+
+ + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% endtabs %} + +## Combine fit mode with user zoom (when to override vs respect last zoom) + +When combining fit modes with manual zoom, decide whether fit actions should override the last zoom level or be combined. A common pattern is to reset to fit mode when explicitly called, while respecting manual zoom for programmatic zoom changes. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + const pdfViewerRef = React.useRef(null); + const [lastZoom, setLastZoom] = React.useState(100); + + const handleFitPage = () => { + // Fit mode overrides last zoom + pdfViewerRef.current.magnification.fitToPage(); + }; + + const handleFitWidth = () => { + // Fit mode overrides last zoom + pdfViewerRef.current.magnification.fitToWidth(); + }; + + const handleRestoreZoom = () => { + // Restore previously saved zoom level + pdfViewerRef.current.magnification.zoomTo(lastZoom); + }; + + const onZoomChange = (args) => { + // Capture user's manual zoom level + setLastZoom(Math.round(args.previousZoomValue)); + }; + + return (
+
+ + + +

+ Fit modes override zoom. Use Restore to return to last manual zoom. +

+
+
+ + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + const pdfViewerRef = React.useRef(null); + const [lastZoom, setLastZoom] = React.useState(100); + + const handleFitPage = () => { + // Fit mode overrides last zoom + pdfViewerRef.current.magnification.fitToPage(); + }; + + const handleFitWidth = () => { + // Fit mode overrides last zoom + pdfViewerRef.current.magnification.fitToWidth(); + }; + + const handleRestoreZoom = () => { + // Restore previously saved zoom level + pdfViewerRef.current.magnification.zoomTo(lastZoom); + }; + + const onZoomChange = (args) => { + // Capture user's manual zoom level + setLastZoom(Math.round(args.previousZoomValue)); + }; + + return (
+
+ + + +

+ Fit modes override zoom. Use Restore to return to last manual zoom. +

+
+
+ + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% endtabs %} + +## Fit mode behavior and calculation + +- **Fit to Page:** Scales the PDF page to fit within the available viewport (both width and height constrained). +- **Fit to Width:** Scales the PDF to match the viewport width (height may extend beyond visible area). +- **Fit calculations:** Consider the page box, page rotation, DPI/render scale, and container dimensions. +- **Multi-page layouts:** Fit modes apply to the currently visible page; they work the same in continuous and single-page views. + +N> Fit modes automatically recalculate based on the current page dimensions and container size. If you change container size, fit mode dimensions are recomputed accordingly. + +## See also + +- [Magnification overview](./magnification) +- [Zoom how-to](./zoom) +- [Toolbar items](./toolbar) +- [Feature Modules](./feature-module) diff --git a/Document-Processing/PDF/PDF-Viewer/react/magnification/magnification.md b/Document-Processing/PDF/PDF-Viewer/react/magnification/magnification.md new file mode 100644 index 0000000000..fd17fd39fc --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/react/magnification/magnification.md @@ -0,0 +1,152 @@ +--- +layout: post +title: Magnification in React PDF Viewer | Syncfusion +description: Learn about magnification controls in the Syncfusion React PDF Viewer component. Explore zoom and fit modes to enhance document viewing experience. +control: PDF Viewer +platform: document-processing +documentation: ug +domainurl: ##DomainURL## +--- + +# Magnification in React PDF Viewer + +Magnification enables users to control how PDF content is displayed in the viewport. The PDF Viewer provides two primary approaches to magnification: **zoom** for precise scaling control and **fit modes** for viewport-optimized display. + +![PDF Viewer magnification controls](../images/zoom.png) + +## Overview + +The magnification feature allows you to enhance the reading experience by scaling PDF pages to fit different viewing preferences. Whether you need precise zoom levels for detailed inspection or automatic fit modes for optimal viewport usage, the PDF Viewer provides comprehensive magnification capabilities. + +### Key Features + +- **Flexible Zoom Control** — Zoom in and out with manual or programmatic control +- **Fit Modes** — Automatically scale pages to fit the entire viewport or width +- **Default Zoom Modes** — Set initial zoom behavior on document load +- **Responsive Scaling** — Adapt to container and window resize events +- **Zoom Range** — Supported zoom range from 10% to 400% +- **Toolbar Integration** — Built-in toolbar controls for common magnification actions + +## Magnification Controls + +The following magnification controls are available in the default toolbar: + +- [**Zoom In**](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/magnification#zoomin): Increase the zoom level of the PDF pages incrementally. +- [**Zoom Out**](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/magnification#zoomout): Decrease the zoom level of the PDF pages incrementally. +- [**Zoom To**](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/magnification#zoomto): Set a specific zoom percentage for the PDF pages. +- [**Fit to Page**](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/magnification#fittopage): Scale the entire page to fit within the available viewport. +- [**Fit to Width**](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/magnification#fittowidth): Scale the page width to match the viewport width. + +## Enable Magnification + +To enable magnification features in the PDF Viewer, set the [enableMagnification](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/index-default#enablemagnification) property to `true` and inject the [Magnification](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/index-default#magnification) service. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + return (
+
+ {/* Render the PDF Viewer with magnification enabled */} + + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + return (
+
+ {/* Render the PDF Viewer with magnification enabled */} + + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% endtabs %} + +## Magnification Types + +### Zoom +The zoom feature provides precise control over the display scale. Users can: +- Zoom in to view details more clearly +- Zoom out to see more of the page at once +- Set specific zoom percentages programmatically +- Initialize with a default zoom level + +Learn more: [Zoom How-to Guide](./zoom) + +### Fit Modes +Fit modes automatically scale pages to optimize the viewing experience. Users can: +- Fit entire pages to the viewport +- Fit page width to the viewport for horizontal scrolling +- Set initial fit mode on document load +- Toggle between different fit modes dynamically + +Learn more: [Fit Modes How-to Guide](./fitmode) + +## Zoom Range and Limits + +The PDF Viewer supports zoom values from **10% to 400%**. All zoom operations are automatically clamped to this range: +- Values below 10% are adjusted to 10% +- Values above 400% are adjusted to 400% +- Both UI and programmatic zoom changes respect these limits + +## Common Use Cases + +| Use Case | Solution | +|----------|----------| +| Set initial document zoom on load | Use [zoomMode](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/zoommode) property with "FitToWidth" or "FitToPage" | +| Allow users to zoom with buttons | Implement custom buttons with [zoomIn()](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/magnification#zoomin), [zoomOut()](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/magnification#zoomout) , [zoomTo()](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/magnification#zoomto) methods | +| Maintain zoom during page navigation | Zoom state is automatically preserved when navigating between pages | +| Respond to zoom level changes | Listen to the [zoomChange](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/index-default#zoomchange) event and update custom UI | +| Fit page to container resize | Implement debounced resize handler to reapply fit mode | + +## Related Topics + +- [Zoom How-to](./zoom) — Detailed guide on zoom functionality and programmatic control +- [Fit Modes How-to](./fitmode) — Detailed guide on fit modes and responsive scaling +- [Toolbar Items](../toolbar-customization/overview) — Customize toolbar magnification controls +- [Feature Modules](../feature-module) — Enable/disable specific PDF Viewer features +- [Navigation](../interactive-pdf-navigation/overview) — Navigate between pages while managing magnification \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/react/magnification/zoom.md b/Document-Processing/PDF/PDF-Viewer/react/magnification/zoom.md new file mode 100644 index 0000000000..3c331973fc --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/react/magnification/zoom.md @@ -0,0 +1,666 @@ +--- +layout: post +title: Zoom in React PDF Viewer | How-to Guide | Syncfusion +description: Learn how to implement zoom functionality in the Syncfusion React PDF Viewer component. Enable zooming, programmatically control zoom levels, and handle zoom change events. +control: PDF Viewer +platform: document-processing +documentation: ug +domainurl: ##DomainURL## +--- + +# Zoom in React PDF Viewer + +This how-to guide demonstrates how to work with zoom functionality in the React PDF Viewer component. Learn how to enable magnification, control zoom programmatically, set default zoom levels, and respond to zoom changes. + +![PDF Viewer zoom controls](../images/zoomPdf.png) + +## Enable zooming + +To enable zoom functionality in the PDF Viewer, set the [enableMagnification](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/index-default#enablemagnification) property to `true` and inject the [Magnification](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/index-default#magnification) service. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + return (
+
+ {/* Render the PDF Viewer with magnification enabled */} + + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + return (
+
+ {/* Render the PDF Viewer with magnification enabled */} + + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% endtabs %} + +## Zoom in and out using toolbar and programmatically + +The zoom controls are automatically available in the toolbar when magnification is enabled. Users can click the **Zoom In** and **Zoom Out** buttons to adjust the zoom level. + +To zoom in or out programmatically, use the [zoomIn()](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/magnification#zoomin) and [zoomOut()](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/magnification#zoomout) methods on the magnification instance. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + const pdfViewerRef = React.useRef(null); + + const handleZoomIn = () => { + pdfViewerRef.current.magnification.zoomIn(); + }; + + const handleZoomOut = () => { + pdfViewerRef.current.magnification.zoomOut(); + }; + + return (
+
+ + +
+
+ + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + const pdfViewerRef = React.useRef(null); + + const handleZoomIn = () => { + pdfViewerRef.current.magnification.zoomIn(); + }; + + const handleZoomOut = () => { + pdfViewerRef.current.magnification.zoomOut(); + }; + + return (
+
+ + +
+
+ + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% endtabs %} + +## Set a specific zoom value + +Use the [zoomTo()](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/magnification#zoomto) method on the magnification instance to set the PDF to a specific zoom level. You can specify the zoom level as a percentage value. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + const pdfViewerRef = React.useRef(null); + + const handleZoom150 = () => { + pdfViewerRef.current.magnification.zoomTo(150); + }; + + const handleZoom200 = () => { + pdfViewerRef.current.magnification.zoomTo(200); + }; + + const handleZoom75 = () => { + pdfViewerRef.current.magnification.zoomTo(75); + }; + + return (
+
+ + + +
+
+ + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + const pdfViewerRef = React.useRef(null); + + const handleZoom150 = () => { + pdfViewerRef.current.magnification.zoomTo(150); + }; + + const handleZoom200 = () => { + pdfViewerRef.current.magnification.zoomTo(200); + }; + + const handleZoom75 = () => { + pdfViewerRef.current.magnification.zoomTo(75); + }; + + return (
+
+ + + +
+
+ + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% endtabs %} + +## Initialize the viewer with a default zoom (on load) + +Set an initial zoom level when the document is first loaded by using the document-loaded event. Call [zoomTo()](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/magnification#zoomto) in the [documentLoad](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/index-default#documentload) event handler. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + const pdfViewerRef = React.useRef(null); + + const onDocumentLoaded = () => { + // Set default zoom to 150% when document is loaded + pdfViewerRef.current.magnification.zoomTo(150); + }; + + return (
+
+ + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + const pdfViewerRef = React.useRef(null); + + const onDocumentLoaded = () => { + // Set default zoom to 150% when document is loaded + pdfViewerRef.current.magnification.zoomTo(150); + }; + + return (
+
+ + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% endtabs %} + +## Disable user zoom while allowing programmatic zoom + +To restrict users from zooming via the UI while still allowing your application to control zoom programmatically, use [toolbarSettings](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/index-default#toolbarsettings) with custom toolbar items that exclude zoom controls. Combine this with custom application buttons to provide controlled zoom access. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { + PdfViewerComponent, + Toolbar, + Magnification, + Navigation, + LinkAnnotation, + BookmarkView, + ThumbnailView, + Print, + TextSelection, + TextSearch, + Inject, +} from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + const pdfViewerRef = React.useRef(null); + + const handleZoom150 = () => { + pdfViewerRef.current.magnification.zoomTo(150); + }; + + const handleZoom200 = () => { + pdfViewerRef.current.magnification.zoomTo(200); + }; + + return ( +
+ {/* Custom Application Toolbar */} +
+ + +

+ Zoom level is controlled by the application. +

+
+ + {/* PDF Viewer */} + + + +
+ ); +} + +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { + PdfViewerComponent, + Toolbar, + Magnification, + Navigation, + LinkAnnotation, + BookmarkView, + ThumbnailView, + Print, + TextSelection, + TextSearch, + Inject, +} from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + const pdfViewerRef = React.useRef(null); + + const handleZoom150 = () => { + pdfViewerRef.current.magnification.zoomTo(150); + }; + + const handleZoom200 = () => { + pdfViewerRef.current.magnification.zoomTo(200); + }; + + return ( +
+ {/* Custom Application Toolbar */} +
+ + +

+ Zoom level is controlled by the application. +

+
+ + {/* PDF Viewer */} + + + +
+ ); +} + +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% endtabs %} + +## Handle zoom changes + +Listen for zoom change events on the magnification instance and update custom UI elements (such as a zoom indicator or zoom dropdown) accordingly. Use the [zoomChange](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/index-default#zoomchange) event to respond to zoom level changes. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + const pdfViewerRef = React.useRef(null); + const [zoomLevel, setZoomLevel] = React.useState(100); + + const onZoomChange = (args) => { + // Update custom UI with new zoom level from magnification event + setZoomLevel(Math.round(args.zoomValue)); + }; + + return (
+
+ Current Zoom: {zoomLevel}% +
+
+ + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} +{% raw %} + +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Annotation, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + const pdfViewerRef = React.useRef(null); + const [zoomLevel, setZoomLevel] = React.useState(100); + + const onZoomChange = (args) => { + // Update custom UI with new zoom level from magnification event + setZoomLevel(Math.round(args.zoomValue)); + }; + + return (
+
+ Current Zoom: {zoomLevel}% +
+
+ + + + +
+
); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); + +{% endraw %} +{% endhighlight %} +{% endtabs %} + +## Zoom range and limits + +The PDF Viewer supports zoom values from 10% to 400%. The [zoomTo()](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/magnification#zoomto) method automatically clamps values outside this range to the nearest valid limit. + +N> Zoom values are automatically clamped between 10% and 400%. Attempting to zoom beyond these limits will set the zoom to the nearest boundary value. + +## See also + +- [Magnification overview](./magnification) +- [Fit modes](./fitmode) +- [Toolbar items](../toolbar-customization/overview) +- [Feature Modules](../feature-module) From 8ee0ac231977b467ba1617c92889f329ddc2a801 Mon Sep 17 00:00:00 2001 From: SF4524LogeshKumar Date: Wed, 25 Mar 2026 11:18:07 +0530 Subject: [PATCH 2/4] 1017187: Updated proper Navigation in TOC file --- Document-Processing-toc.html | 7 ++++++- .../PDF/PDF-Viewer/react/interaction-mode.md | 8 ++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Document-Processing-toc.html b/Document-Processing-toc.html index d5148b6be2..dd6b325dc1 100644 --- a/Document-Processing-toc.html +++ b/Document-Processing-toc.html @@ -1058,7 +1058,12 @@
  • Hyperlink Navigation
  • -
  • Magnification
  • +
  • Magnification + +
  • Accessibility
  • Text Search and Extraction
      diff --git a/Document-Processing/PDF/PDF-Viewer/react/interaction-mode.md b/Document-Processing/PDF/PDF-Viewer/react/interaction-mode.md index 720060c878..eba7f3b02f 100644 --- a/Document-Processing/PDF/PDF-Viewer/react/interaction-mode.md +++ b/Document-Processing/PDF/PDF-Viewer/react/interaction-mode.md @@ -103,7 +103,7 @@ The toolbar provides built-in buttons to switch between Pan and Text Selection m ![Selection Mode](./images/selection.png) ### Programmatically -Use the `interactionMode` property to switch modes programmatically: +Use the [InteractionMode](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/interactionmode) property to switch modes programmatically: {% tabs %} {% highlight js tabtitle="Standalone" %} @@ -382,6 +382,6 @@ root.render(); ## See also -* [Magnification](./magnification) — Control zoom and fit modes -* [Toolbar items](./toolbar) — Customize toolbar controls -* [Feature Modules](./feature-module) — Enable/disable features \ No newline at end of file +- [Magnification](./magnification/magnification) — Control zoom and fit modes +- [Toolbar items](./toolbar-customization/overview) — Customize toolbar controls +- [Feature Modules](./feature-module) — Enable/disable features \ No newline at end of file From ade011eb4e0c5b48211b6aa9376bd799e0162083 Mon Sep 17 00:00:00 2001 From: SF4524LogeshKumar Date: Wed, 25 Mar 2026 12:05:43 +0530 Subject: [PATCH 3/4] 1017187: Updated and resolved CI failure --- Document-Processing-toc.html | 4 ++-- .../PDF/PDF-Viewer/react/magnification/fitmode.md | 2 +- .../PDF/PDF-Viewer/react/magnification/zoom.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Document-Processing-toc.html b/Document-Processing-toc.html index dd6b325dc1..60c229f7a7 100644 --- a/Document-Processing-toc.html +++ b/Document-Processing-toc.html @@ -1059,8 +1059,8 @@
  • Magnification -
      -
    • Zoom
    • + diff --git a/Document-Processing/PDF/PDF-Viewer/react/magnification/fitmode.md b/Document-Processing/PDF/PDF-Viewer/react/magnification/fitmode.md index be04560833..63a73c930d 100644 --- a/Document-Processing/PDF/PDF-Viewer/react/magnification/fitmode.md +++ b/Document-Processing/PDF/PDF-Viewer/react/magnification/fitmode.md @@ -1,7 +1,7 @@ --- layout: post title: Fit Modes in React PDF Viewer | How-to Guide | Syncfusion -description: Learn how to implement fit modes (Fit Page and Fit Width) in the Syncfusion React PDF Viewer component. Control initial view, toggle fit modes, and handle container resize. +description: Learn how to implement fit modes (Fit Page and Fit Width) in the Syncfusion React PDF Viewer component. Control initial view and toggle fit modes. control: PDF Viewer platform: document-processing documentation: ug diff --git a/Document-Processing/PDF/PDF-Viewer/react/magnification/zoom.md b/Document-Processing/PDF/PDF-Viewer/react/magnification/zoom.md index 3c331973fc..e392375ab1 100644 --- a/Document-Processing/PDF/PDF-Viewer/react/magnification/zoom.md +++ b/Document-Processing/PDF/PDF-Viewer/react/magnification/zoom.md @@ -1,7 +1,7 @@ --- layout: post title: Zoom in React PDF Viewer | How-to Guide | Syncfusion -description: Learn how to implement zoom functionality in the Syncfusion React PDF Viewer component. Enable zooming, programmatically control zoom levels, and handle zoom change events. +description: Learn how to implement zoom functionality in the Syncfusion React PDF Viewer component. Enable zooming and programmatically control zoom levels. control: PDF Viewer platform: document-processing documentation: ug From dd39716f655336f6e8d6abd15039d95c22975be5 Mon Sep 17 00:00:00 2001 From: SF4524LogeshKumar Date: Wed, 25 Mar 2026 13:55:44 +0530 Subject: [PATCH 4/4] 1017187: Updated minZoom and maxZoom with appropriate code-snippets. --- .../react/magnification/magnification.md | 6 +- .../PDF-Viewer/react/magnification/zoom.md | 78 ++++++++++++++++++- 2 files changed, 81 insertions(+), 3 deletions(-) diff --git a/Document-Processing/PDF/PDF-Viewer/react/magnification/magnification.md b/Document-Processing/PDF/PDF-Viewer/react/magnification/magnification.md index fd17fd39fc..0fccd986e6 100644 --- a/Document-Processing/PDF/PDF-Viewer/react/magnification/magnification.md +++ b/Document-Processing/PDF/PDF-Viewer/react/magnification/magnification.md @@ -128,11 +128,15 @@ Learn more: [Fit Modes How-to Guide](./fitmode) ## Zoom Range and Limits -The PDF Viewer supports zoom values from **10% to 400%**. All zoom operations are automatically clamped to this range: +The PDF Viewer supports zoom values from **10% to 400%** by default. All zoom operations are automatically clamped to this range: - Values below 10% are adjusted to 10% - Values above 400% are adjusted to 400% - Both UI and programmatic zoom changes respect these limits +You can override the defaults using the [minZoom](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/index-default#minzoom) and [maxZoom](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/index-default#maxzoom) properties on the `PdfViewerComponent` (defaults: `minZoom = 10`, `maxZoom = 400`). + +Learn more: [Zoom Range and Limits Guide](./zoom#zoom-range-and-limits) + ## Common Use Cases | Use Case | Solution | diff --git a/Document-Processing/PDF/PDF-Viewer/react/magnification/zoom.md b/Document-Processing/PDF/PDF-Viewer/react/magnification/zoom.md index e392375ab1..0b09840d9c 100644 --- a/Document-Processing/PDF/PDF-Viewer/react/magnification/zoom.md +++ b/Document-Processing/PDF/PDF-Viewer/react/magnification/zoom.md @@ -654,9 +654,83 @@ root.render(); ## Zoom range and limits -The PDF Viewer supports zoom values from 10% to 400%. The [zoomTo()](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/magnification#zoomto) method automatically clamps values outside this range to the nearest valid limit. +The PDF Viewer supports zoom values from 10% to 400% by default. You can override these limits using the [minZoom](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/index-default#minzoom) and [maxZoom](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/index-default#minzoom) properties on the `PdfViewerComponent`. -N> Zoom values are automatically clamped between 10% and 400%. Attempting to zoom beyond these limits will set the zoom to the nearest boundary value. +- [minZoom](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/index-default#minzoom) (number): Specifies the minimum acceptable zoom level for the control. Default: `10`. +- [maxZoom](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/index-default#minzoom) (number): Specifies the maximum allowable zoom level for the control. Default: `400`. + +Below are full example snippets that show how to set custom `minZoom` and `maxZoom` values (Standalone and Server-Backed): + +{% tabs %} +{% highlight js tabtitle="Standalone" %} +{% raw %} +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + return ( +
      +
      + + + + +
      +
      + ); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); +{% endraw %} +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} +{% raw %} +import * as ReactDOM from 'react-dom'; +import * as React from 'react'; +import './index.css'; +import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, + ThumbnailView, Print, TextSelection, TextSearch, Inject } from '@syncfusion/ej2-react-pdfviewer'; + +function App() { + return ( +
      +
      + + + + +
      +
      + ); +} +const root = ReactDOM.createRoot(document.getElementById('sample')); +root.render(); +{% endraw %} +{% endhighlight %} +{% endtabs %} + +The [zoomTo()](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/magnification#zoomto) method will clamp values outside the configured `minZoom`/`maxZoom` range to the nearest valid limit. + +N> Zoom values are clamped between the configured `minZoom` and `maxZoom`. Attempting to zoom beyond these limits will set the zoom to the nearest boundary value. ## See also