From 9dae8bf38d1dfc3426749b764afbf211beea0046 Mon Sep 17 00:00:00 2001 From: Balaji Loganathan Date: Mon, 27 Oct 2025 19:27:39 +0530 Subject: [PATCH] 984540: JS docs revamp for hotfix --- Document-Processing-toc.html | 43 +- .../javascript-es5/accessibility.md | 74 +- .../annotations/annotation-event.md | 900 ++++++++++++ .../javascript-es5/annotations/comments.md | 91 +- .../annotations/free-text-annotation.md | 111 +- .../annotations/ink-annotation.md | 73 +- .../annotations/line-angle-constraints.md | 48 +- .../annotations/measurement-annotation.md | 65 +- .../annotations/shape-annotation.md | 59 +- .../annotations/signature-annotation.md | 57 +- .../annotations/stamp-annotation.md | 56 +- .../annotations/sticky-notes-annotation.md | 66 +- .../annotations/text-markup-annotation.md | 173 +-- .../PDF/PDF-Viewer/javascript-es5/download.md | 11 +- .../javascript-es5/ej1-api-migration.md | 11 +- .../PDF/PDF-Viewer/javascript-es5/event.md | 1298 +++++++++++++++++ .../javascript-es5/feature-module.md | 37 +- .../form-designer/create-programmatically.md | 135 +- .../create-with-user-interface-interaction.md | 55 +- .../form-designer/form-field-events.md | 9 +- .../PDF-Viewer/javascript-es5/form-filling.md | 86 ++ .../programmatically-work-with-form-field.md | 115 -- .../user-interaction-with-form-fields.md | 86 -- .../getting-started-with-server-backed.md | 53 +- .../javascript-es5/getting-started.md | 7 +- .../javascript-es5/globalization.md | 9 +- .../javascript-es5/how-to-overview.md | 69 + .../add-annotation-in-text-search-js.md | 29 +- .../javascript-es5/how-to/add-header-value.md | 17 +- .../add-new-page-to-the-pdf-document.md | 19 +- .../how-to/add-save-button-js.md | 49 +- .../how-to/annotation-selector.md | 16 +- ...e-author-name-using-annotation-settings.md | 39 +- ...ange-rectangle-annotations-border-color.md | 17 +- .../javascript-es5/how-to/clear-annotation.md | 19 +- ...configure-annotationselector-setting-js.md | 51 +- .../javascript-es5/how-to/conformance.md | 35 +- .../control-annotation-visibility-js.md | 33 +- ...-library-bounds-to-pdf-viewer-bounds-js.md | 25 +- .../how-to/create-pdfviewer-service-core.md | 29 +- .../how-to/create-pdfviewer-service.md | 33 +- .../how-to/custom-context-menu-js.md | 30 +- .../how-to/custom-font-signature-field-js.md | 22 +- .../javascript-es5/how-to/custom-fonts.md | 28 +- .../how-to/customize-text-search-colors.md | 25 +- .../how-to/delete-annotations.md | 19 +- .../how-to/disable-context-menu-option.md | 17 +- .../how-to/disable-tile-renderings.md | 19 +- ...display-custom-tool-tip-for-annotations.md | 15 +- .../download-document-on-window-closing.md | 17 +- .../how-to/download-start-event-js.md | 19 +- .../how-to/enable-local-storage-js.md | 29 +- .../how-to/enable-resize-text.md | 15 +- .../how-to/enable-text-selection-js.md | 33 +- .../how-to/export-as-image-js.md | 24 +- .../how-to/extract-text-completed-js.md | 16 +- .../javascript-es5/how-to/extract-text-js.md | 46 +- .../how-to/extract-text-option-js.md | 19 +- .../how-to/find-text-async-js.md | 44 +- .../focus-on-a-form-field-after-loading.md | 19 +- .../javascript-es5/how-to/get-base64-js.md | 17 +- .../javascript-es5/how-to/get-page-info-js.md | 19 +- .../how-to/highlight-underline-strikeout.md | 17 +- .../how-to/identify-added-annotation.md | 17 +- .../how-to/import-annotation.md | 23 +- .../how-to/import-export-annotation-js.md | 19 +- .../javascript-es5/how-to/load-documents.md | 21 +- .../javascript-es5/how-to/min-max-zoom-js.md | 21 +- .../javascript-es5/how-to/open-bookmark-js.md | 13 +- .../how-to/open-thumbnail-js.md | 15 +- .../how-to/overlapped-annotations.md | 15 +- ...agerenderstarted-pagerendercompleted-js.md | 15 +- .../javascript-es5/how-to/print-documents.md | 15 +- ...lve-unable-to-find-an-entry-point-error.md | 25 +- .../restricting-zoom-in-mobile-mode-js.md | 13 +- .../how-to/select-multi-page-annotation.md | 15 +- .../how-to/show-custom-stamp-item-js.md | 22 +- .../how-to/show-hide-annotation-js.md | 33 +- .../signatureselect-signatureunselect-js.md | 19 +- .../javascript-es5/how-to/unload-documents.md | 9 +- .../use-local-script-and-style-references.md | 21 +- .../images/Context-Menu-Page-Operations1.png | Bin 0 -> 25178 bytes .../images/form-filling-signature-del.png | Bin 0 -> 73116 bytes .../images/form-filling-signature-dialog.png | Bin 0 -> 81767 bytes .../images/form-filling-signature-signed.png | Bin 0 -> 69868 bytes .../images/form-filling-signature.png | Bin 0 -> 65093 bytes .../javascript-es5/images/form-filling.png | Bin 0 -> 69993 bytes .../javascript-es5/interaction-mode.md | 9 +- .../bookmark-navigation.md | 86 ++ .../hyperlink-navigation.md | 212 +++ .../page-navigation.md | 181 +++ .../page-thumbnail-navigation.md | 54 + .../javascript-es5/magnification.md | 17 +- .../PDF-Viewer/javascript-es5/navigation.md | 53 +- .../open-pdf-file/from-amazon-s3.md | 42 +- .../from-azure-active-directory.md | 31 +- .../open-pdf-file/from-azure-blob-storage.md | 39 +- .../from-box-cloud-file-storage.md | 29 +- .../from-dropbox-cloud-file-storage.md | 31 +- .../from-google-cloud-storage.md | 25 +- .../open-pdf-file/from-google-drive.md | 26 +- .../open-pdf-file/from-one-drive.md | 30 +- .../javascript-es5/open-pdf-files.md | 67 +- .../javascript-es5/organize-pdf-overview.md | 28 + .../PDF-Viewer/javascript-es5/organize-pdf.md | 1 - .../organize-pdf/organize-page-mobile-view.md | 37 + .../organize-pdf/organize-pdf-events.md | 80 + .../programmatic-support-for-organize-page.md | 155 ++ .../organize-pdf/toolbar-organize-page.md | 140 ++ .../ui-interactions-organize-page.md | 97 ++ .../PDF/PDF-Viewer/javascript-es5/overview.md | 47 +- .../PDF/PDF-Viewer/javascript-es5/print.md | 214 ++- .../save-pdf-file/to-amazon-s3.md | 51 +- .../to-azure-active-directory.md | 59 +- .../save-pdf-file/to-azure-blob-storage.md | 49 +- .../to-box-cloud-file-storage.md | 33 +- .../to-dropbox-cloud-file-storage.md | 51 +- .../save-pdf-file/to-google-cloud-storage.md | 31 +- .../save-pdf-file/to-google-drive.md | 35 +- .../save-pdf-file/to-one-drive.md | 43 +- .../javascript-es5/save-pdf-files.md | 67 +- ...mage-in-azure-app-service-for-container.md | 40 +- ...ocker-image-in-azure-kubernetes-service.md | 52 +- ...in-azure-app-service-from-visual-studio.md | 37 +- .../pdfviewer-server-docker-image-overview.md | 50 +- .../style-and-appearance/annotation.md | 45 +- .../style-and-appearance/form-designer.md | 61 +- .../style-and-appearance.md | 29 +- .../PDF-Viewer/javascript-es5/text-search.md | 177 ++- .../javascript-es5/textselection.md | 119 ++ .../annotation-toolbar-customization.md | 139 ++ .../toolbar-customization/custom-toolbar.md | 1018 +++++++++++++ .../form-designer-toolbar-customization.md | 119 ++ .../mobile-toolbar.md | 95 +- .../primary-toolbar-customization.md | 101 ++ .../PDF/PDF-Viewer/javascript-es5/toolbar.md | 3 +- .../content-security-policy.md | 23 +- .../document-loading-issues.md | 31 +- 138 files changed, 7127 insertions(+), 2210 deletions(-) create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/annotation-event.md create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/event.md create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/form-filling.md delete mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/formdesigner/programmatically-work-with-form-field.md delete mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/formdesigner/user-interaction-with-form-fields.md create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to-overview.md create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/images/Context-Menu-Page-Operations1.png create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/images/form-filling-signature-del.png create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/images/form-filling-signature-dialog.png create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/images/form-filling-signature-signed.png create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/images/form-filling-signature.png create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/images/form-filling.png create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/bookmark-navigation.md create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/hyperlink-navigation.md create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/page-navigation.md create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/page-thumbnail-navigation.md create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf-overview.md create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/organize-page-mobile-view.md create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/organize-pdf-events.md create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/programmatic-support-for-organize-page.md create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/toolbar-organize-page.md create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/ui-interactions-organize-page.md create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/textselection.md create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/annotation-toolbar-customization.md create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/custom-toolbar.md create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/form-designer-toolbar-customization.md rename Document-Processing/PDF/PDF-Viewer/javascript-es5/{ => toolbar-customization}/mobile-toolbar.md (53%) create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/primary-toolbar-customization.md diff --git a/Document-Processing-toc.html b/Document-Processing-toc.html index 6645e8766..79e2c918c 100644 --- a/Document-Processing-toc.html +++ b/Document-Processing-toc.html @@ -949,8 +949,24 @@
  • Toolbar
  • -
  • Mobile Toolbar Interface
  • -
  • Navigation
  • +
  • Toolbar Customization + +
  • +
  • Interactive PDF Navigation + +
  • Magnification
  • Accessibility
  • Text Search
  • @@ -969,6 +985,7 @@
  • Line Angle Constraint
  • Comments
  • Handwritten signature
  • +
  • Annotations Events
  • Interaction Mode
  • @@ -977,12 +994,27 @@ + +
  • Form Filling
  • +
  • Organize Pages +
  • Organize Pages
  • Print
  • Download
  • +
  • Event
  • +
  • Text Selection
  • Globalization
  • Migration from Essential JS 1
  • @@ -994,8 +1026,7 @@
  • How to Deploy PdfViewer Server App in Azure App Service from Visual Studio
  • -
  • - How To +
  • How to
  • diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/accessibility.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/accessibility.md index 6c9036a22..acec186ae 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/accessibility.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/accessibility.md @@ -1,19 +1,18 @@ --- layout: post -title: Accessibility in Javascript Pdfviewer control | Syncfusion -description: Learn here all about accessibility in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Accessibility in JavaScript PDF Viewer | Syncfusion +description: Learn about accessibility in Syncfusion JavaScript PDF Viewer - WCAG 2.2, Section 508, ADA, and keyboard navigation support. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Accessibility in Syncfusion PDF Viewer components +# Accessibility in Syncfusion JavaScript ES5 PDF Viewer components -The PDF Viewer component followed the accessibility guidelines and standards, including [ADA](https://www.ada.gov/), [Section 508](https://www.section508.gov/), [WCAG 2.2](https://www.w3.org/TR/WCAG22/) standards, and [WCAG roles](https://www.w3.org/TR/wai-aria/#roles) that are commonly used to evaluate accessibility. +The PDF Viewer component follows established accessibility guidelines and standards, including [ADA](https://www.ada.gov/), [Section 508](https://www.section508.gov/), [WCAG 2.2](https://www.w3.org/TR/WCAG22/), and [WCAG roles](https://www.w3.org/TR/wai-aria/#roles) that are commonly used to evaluate accessibility. -The accessibility compliance for the PDF Viewer component is outlined below. +The accessibility compliance for the PDF Viewer component is summarized below. | Accessibility Criteria | Compatibility | | -- | -- | @@ -39,30 +38,31 @@ The accessibility compliance for the PDF Viewer component is outlined below.
    No - The component does not meet the requirement.
    +Note: Mobile device support is marked as partial due to platform-level constraints on hover interactions, complex keyboard navigation, and screen reader capabilities that vary by device and browser. + ## WAI-ARIA attributes -[WAI-ARIA](https://www.w3.org/WAI/ARIA/apg/patterns/alert/) (Accessibility Initiative – Accessible Rich Internet Applications) defines a way to increase the accessibility of web pages, dynamic content, and user interface components developed with Ajax, HTML, JavaScript,and related technologies. ARIA provides additional semantics to describe the role, state, and functionality of web components. The following ARIA attributes are used in the PDF Viewer component: +[WAI-ARIA](https://www.w3.org/WAI/ARIA/apg/patterns/alert/) (Accessibility Initiative – Accessible Rich Internet Applications) defines a way to increase the accessibility of web pages, dynamic content, and user interface components developed with Ajax, HTML, JavaScript, and related technologies. ARIA provides additional semantics to describe the role, state, and functionality of web components. The following ARIA attributes are used in the PDF Viewer component: | Attributes | Purpose | | --- | --- | | `aria-disabled`| Indicates whether the PDF Viewer component is in a disabled state or not.| -| `aria-expanded`| Indicates whether the suggestion list has expanded or not. | -| `aria-readonly` | Indicates the readonly state of the PDF Viewer element. | -| `aria-haspopup` | Indicates whether the PDF Viewer input element has a suggestion list or not. | -| `aria-label` | Indicates the breadcrumb item text. | -| `aria-labelledby` | Provides a label for the PDF Viewer. Typically, the "aria-labelledby" attribute will contain the id of the element used as the PDF Viewer's title. | -| `aria-describedby` | This attribute points to the PDF Viewer element describing the one it's set on. | -| `aria-orientation` | Indicates whether the PDF Viewer element is oriented horizontally or vertically. | -| `aria-valuetext` | Returns the current text of the PDF Viewer. | -| `aria-valuemax` | Indicates the Maximum value of the PDF Viewer. | -| `aria-valuemin` | Indicates the Minimum value of the PDF Viewer. | -| `aria-valuenow` | Indicates the current value of the PDF Viewer. | -| `aria-controls` | Attribute is set to the button and it points to the corresponding content. | - +| `aria-expanded`| Indicates whether an element within the PDF Viewer is expanded or collapsed. | +| `aria-readonly` | Indicates the read-only state of a PDF Viewer element. | +| `aria-haspopup` | Indicates the presence of a popup, such as a context menu or submenu. | +| `aria-label` | Provides a human-readable label for interactive elements in the PDF Viewer. | +| `aria-labelledby` | Identifies the element(s) that label the PDF Viewer, often referencing the title element. | +| `aria-describedby` | Identifies the element(s) that describe the PDF Viewer or its controls. | +| `aria-orientation` | Indicates whether an element is oriented horizontally or vertically. | +| `aria-valuetext` | Provides a human-readable text alternative for the current value of a range-type element. | +| `aria-valuemax` | Specifies the maximum value of a range-type element. | +| `aria-valuemin` | Specifies the minimum value of a range-type element. | +| `aria-valuenow` | Specifies the current value of a range-type element. | +| `aria-controls` | Identifies the element(s) controlled by the current element. | ## Keyboard interaction -The PDF Viewer component followed the [keyboard interaction](https://www.w3.org/WAI/ARIA/apg/patterns/alert/#keyboardinteraction) guideline, making it easy for people who use assistive technologies (AT) and those who completely rely on keyboard navigation. The following keyboard shortcuts are supported by the Message component. +The PDF Viewer component follows the [keyboard interaction](https://www.w3.org/WAI/ARIA/apg/patterns/alert/#keyboardinteraction) guideline, making it easy for people who use assistive technologies (AT) and those who rely on keyboard navigation. The following keyboard shortcuts are supported by the PDF Viewer component. | **Press (Windows)** |**Press (Macintosh)** | **To do this** | | --- | --- | --- | @@ -71,7 +71,7 @@ The PDF Viewer component followed the [keyboard interaction](https://www.w3.org/ | CONTROL + Right Arrow (or) CONTROL + Down Arrow |COMMAND + Right Arrow (or) COMMAND + Down Arrow |Navigate to the last page | |Left Arrow | Left Arrow (or) Shift + Space |Navigate to the previous page| | Right Arrow | Right Arrow (or) Space | Navigate to the next page | -| CONTROL + G | COMMAND + G | Go To The Page| +| CONTROL + G | COMMAND + G | Go to a specific page| |Up Arrow |Up Arrow |Scroll up| | Down Arrow | Down Arrow | Scroll down| |||**Shortcuts for Zooming**| @@ -97,16 +97,7 @@ The PDF Viewer component followed the [keyboard interaction](https://www.w3.org/ |Shift + H |Shift + H |Enable pan mode| |Shift + V |Shift + V |Enable text selection mode| -The current implementation of our PDF Viewer includes keyboard shortcuts for various functions like scrolling, zooming, text search, printing, and annotation deletion. - -To enhance user experience, we're adding additional keyboard shortcuts for actions such as navigating between pages, accessing specific pages, toggling annotation tools, and displaying PDF elements like outlines, annotations, bookmarks, and thumbnails. - -To support this, we're introducing a new class called **commandManager**, which handles custom commands triggered by specific key gestures. These custom commands will be defined by users and executed accordingly. - -The **commandManager** will have a parameter called Commands, which will hold the collection of custom keyboard commands specified by users. Each custom command will be represented by a KeyboardCommand class, containing the `command name` and associated `keyboard combination`. - -Additionally, we're introducing the **keyboardCustomCommands** parameter for the CommandManager, which will utilize the EventCallback to handle keyboard events and trigger appropriate methods when specific key combinations are pressed. - +The PDF Viewer supports custom keyboard commands through a `commandManager`, which handles commands triggered by specific key gestures. Custom commands are defined by users and executed accordingly. The `commandManager` includes a `keyboardCommand` collection to hold custom keyboard commands. Each custom command is represented by a `KeyboardCommand` entry, containing the command name and associated keyboard combination. Additionally, the `keyboardCustomCommands` parameter utilizes an event callback to handle keyboard events and trigger methods when specific key combinations are pressed. {% tabs %} {% highlight html tabtitle="Standalone" %} @@ -140,7 +131,7 @@ Additionally, we're introducing the **keyboardCustomCommands** parameter for the var viewer = new ej.pdfviewer.PdfViewer({ //Sets the document path for initial loading documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', - resourceUrl: "https://cdn.syncfusion.com/ej2/24.1.41/dist/ej2-pdfviewer-lib" + resourceUrl: "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib" }); //Inject the dependencies required to render the PDF Viewer ej.pdfviewer.PdfViewer.Inject( @@ -266,18 +257,15 @@ viewer.commandManager = { {% endhighlight %} {% endtabs %} -Each `keyboardCommand` object consists of a name property, specifying the `name` of the `custom command`, and a `gesture property`, defining the key gesture associated with the command. - -For example, the first command named `customCopy` is associated with the **G** key and requires both the **Shift** and **Alt** modifier keys to be pressed simultaneously. - -Additionally, there's an explanation of the key modifiers used in the gestures: +Each `keyboardCommand` object consists of a `name` property for the custom command and a `gesture` property defining the key gesture associated with the command. For example, the `customCopy` command is associated with the G key and requires both the Shift and Alt modifier keys to be pressed simultaneously. -* Ctrl corresponds to the Control key, represented by the value `1`. -* Alt corresponds to the Alt key, represented by the value `2`. -* Shift corresponds to the Shift key, represented by the value `4`. -* Meta corresponds to the Command key on macOS or the Windows key on Windows, represented by the value `8`. +Key modifiers used in gestures: +- Ctrl corresponds to the Control key (value `1`). +- Alt corresponds to the Alt key (value `2`). +- Shift corresponds to the Shift key (value `4`). +- Meta corresponds to the Command key on macOS or the Windows key on Windows (value `8`). -This setup allows users to perform custom actions within the PDF viewer by pressing specific key combinations, enhancing the user experience and providing more efficient navigation and interaction options. +This setup enables users to perform custom actions within the PDF Viewer by pressing specific key combinations, improving navigation and interaction efficiency. ## Ensuring accessibility diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/annotation-event.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/annotation-event.md new file mode 100644 index 000000000..fb0528a9a --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/annotation-event.md @@ -0,0 +1,900 @@ +--- +title: Annotations Events in JavaScript PDF Viewer control | Syncfusion +description: Learn here all about Annotations Events in Syncfusion JavaScript PDF Viewer component of Syncfusion Essential JS 2 and more. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Annotations Events in JavaScript Pdf viewer control + +The PDF Viewer component triggers various events based on user interactions and changes in the component's state. These events can be used to perform actions when a specific event occurs. This section describes the events available in the PDF Viewer component. + +| Event | Description | +| ------------------------------------------------------------------ | ---------------------------------------------------------------------------------- | +| [`annotationAdd`](#annotationadd) | Triggers when an annotation is added to a page in the PDF document. | +| [`annotationDoubleClick`](#annotationdoubleclick) | Triggers when an annotation is double-clicked. | +| [`annotationMouseLeave`](#annotationmouseleave) | Triggers when the mouse pointer moves away from an annotation object. | +| [`annotationMouseover`](#annotationmouseover) | Triggers when the mouse pointer moves over an annotation object. | +| [`annotationMove`](#annotationmove) | Triggers when an annotation is moved on a page in the PDF document. | +| [`annotationMoving`](#annotationmoving) | Triggers while an annotation is being moved. | +| [`annotationPropertiesChange`](#annotationpropertieschange) | Triggers when the properties of an annotation are modified on a PDF page. | +| [`annotationRemove`](#annotationremove) | Triggers when an annotation is removed from a page in the PDF document. | +| [`annotationResize`](#annotationresize) | Triggers when an annotation is resized on a page in the PDF document. | +| [`annotationSelect`](#annotationselect) | Triggers when an annotation is selected on a page in the PDF document. | +| [`annotationUnSelect`](#annotationunselect) | Triggers when an annotation is unselected on a page in the PDF document. | +| [`beforeAddFreeText`](#beforeaddfreetext) | Triggers before adding a text in the freeText annotation. | +| [`addSignature`](#addsignature) | Triggers when a signature is added to a page in the PDF document. | +| [`removeSignature`](#removesignature) | Triggers when a signature is removed from a page in the PDF document. | +| [`resizeSignature`](#resizesignature) | Triggers when a signature is resized on a page in the PDF document. | +| [`signaturePropertiesChange`](#signaturepropertieschange) | Triggers when the properties of a signature are changed on a page in the PDF document. | +| [`signatureSelect`](#signatureselect) | Triggers when a signature is selected on a page in the PDF document. | +| [`signatureUnselect`](#signatureunselect) | Triggers when a signature is unselected on a page in the PDF document. | + + +### annotationAdd + +The [annotationAdd](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#annotationaddevent) event is triggered when an annotation is added to a PDF document's page. + +#### Event Arguments + +For event data, see [AnnotationAddEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotationAddEventArgs/). It provides properties such as `annotationId`, `pageNumber`, `annotationType`, and `bounds`. + +The following example illustrates how to handle the `annotationAdd` event. + +```html +{% raw %} + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + +{% endraw %} +``` + +```javascript +var viewer = new ej.pdfviewer.PdfViewer ({ + documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", + annotationAdd: function (args) { + console.log('Annotation added with ID: ' + args.annotationId); + console.log('Annotation type: ' + args.annotationType); + } +}); + +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.BookmarkView, ej.pdfviewer.ThumbnailView, ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.Annotation, ej.pdfviewer.FormFields, ej.pdfviewer.FormDesigner,ej.pdfviewer.PageOrganizer); + +viewer.appendTo('#pdfViewer'); +``` + +### annotationDoubleClick + +The [annotationDoubleClick](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#annotationdoubleclickevent) event is triggered when an annotation is double-clicked. + +#### Event Arguments + +For event data, see [AnnotationDoubleClickEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotationDoubleClickEventArgs/). + +The following example illustrates how to handle the `annotationDoubleClick` event. + +```html +{% raw %} + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + +{% endraw %} +``` + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, + ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + annotationDoubleClick: function (args) { + console.log('Annotation double-clicked on page: ' + args.pageIndex); + } +}); + +viewer.appendTo('#pdfViewer'); +``` + +### annotationMouseLeave + +The [annotationMouseLeave](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#annotationmouseleaveevent) event is triggered when the user's mouse pointer moves away from an annotation object. + +#### Event Arguments + +For event data, see [AnnotationMouseLeaveEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotationMouseLeaveEventArgs/). + +The following example illustrates how to handle the `annotationMouseLeave` event. + +```html +{% raw %} + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + +{% endraw %} +``` + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, + ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + annotationMouseLeave: function (args) { + console.log('Annotation mouse leave event is triggered for annotation with ID: ' + args.pageIndex); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +### annotationMouseover + +The [annotationMouseover](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#annotationmouseoverevent) event is triggered when the mouse is moved over an annotation object. + +#### Event Arguments + +For event data, see [AnnotationMouseOverEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotationMouseOverEventArgs/). + +The following example illustrates how to handle the `annotationMouseover` event. + +```html +{% raw %} + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + +{% endraw %} +``` + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, + ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + annotationMouseover: function (args) { + console.log('Annotation mouse over event is triggered for annotation with ID: ' + args.annotationId); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +### annotationMove + +The [annotationMove](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#annotationmoveevent) event is triggered when an annotation is moved over the page of the PDF document. + +#### Event Arguments + +For event data, see [AnnotationMoveEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotationMoveEventArgs/). + +The following example illustrates how to handle the `annotationMove` event. + +```html +{% raw %} + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + +{% endraw %} +``` + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, + ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + annotationMove: function (args) { + console.log('Annotation moved. ID: ' + args.annotationId + ' on page ' + args.pageIndex); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +### annotationMoving + +The [annotationMoving](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#annotationmovingevent) event is triggered while an annotation is being moved. + +#### Event Arguments + +For event data, see [AnnotationMovingEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotationMovingEventArgs/). + +The following example illustrates how to handle the `annotationMoving` event. + +```html +{% raw %} + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + +{% endraw %} +``` + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, + ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + annotationMoving: function (args) { + console.log('Annotation is being moved. Current Action: ' + args.currentPosition); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +### annotationPropertiesChange + +The [annotationPropertiesChange](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#annotationpropertieschangeevent) event is triggered when an annotation's property is modified on a PDF document page. + +#### Event Arguments + +For event data, see [AnnotationPropertiesChangeEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotationPropertiesChangeEventArgs/). It provides properties such as `annotationId`, `pageNumber`, and `action`. + +The following example illustrates how to handle the `annotationPropertiesChange` event. + +```html +{% raw %} + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + +{% endraw %} +``` + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, + ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + annotationPropertiesChange: function (args) { + console.log('Annotation properties changed for ID: ' + args.annotationId); + console.log('isThicknessChanged: ' + args.isThicknessChanged); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +### annotationRemove + +The [annotationRemove](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#annotationremoveevent) event is triggered when an annotation is removed from a PDF document's page. + +#### Event Arguments + +For event data, see [AnnotationRemoveEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotationRemoveEventArgs/). It provides properties such as `annotationId` and `pageNumber`. + +The following example illustrates how to handle the `annotationRemove` event. + +```html +{% raw %} + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + +{% endraw %} +``` + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, + ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + annotationRemove: function (args) { + console.log('Annotation removed with ID: ' + args.annotationId); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +### annotationResize + +The [annotationResize](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#annotationresizeevent) event is triggered when an annotation is resized on a PDF document page. + +#### Event Arguments + +For event data, see [AnnotationResizeEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotationResizeEventArgs/). + +The following example illustrates how to handle the `annotationResize` event. + +```html +{% raw %} + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + +{% endraw %} +``` + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, + ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + annotationResize: function (args) { + console.log('Annotation resized. ID: ' + args.annotationId); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +### annotationSelect + +The [annotationSelect](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#annotationselectevent) event is triggered when an annotation is selected on a PDF document's page. + +#### Event Arguments + +For event data, see [AnnotationSelectEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotationSelectEventArgs/). + +The following example illustrates how to handle the `annotationSelect` event. + +```html +{% raw %} + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + +{% endraw %} +``` + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, + ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + annotationSelect: function (args) { + console.log('Annotation selected with ID: ' + args.annotationId); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +### annotationUnselect + +The [annotationUnselect](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#annotationunselectevent) event is triggered when an annotation is unselected from the PDF document's page. + +#### Event Arguments + +For event data, see [AnnotationUnSelectEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotationUnSelectEventArgs/). + +The following example illustrates how to handle the `annotationUnselect` event. + +```html +{% raw %} + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + +{% endraw %} +``` + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, + ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + annotationUnSelect: function (args) { + console.log('Annotation unselected with ID: ' + args.annotationId); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +### beforeAddFreeText + +The [beforeAddFreeText](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#beforeaddfreetextevent) event is triggered before adding a text in the freeText annotation. + +#### Event Arguments + +For event data, see [BeforeAddFreeTextEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/beforeAddFreeTextEventArgs/). + +The following example illustrates how to handle the `beforeAddFreeText` event. + +```html +{% raw %} + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + +{% endraw %} +``` + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, + ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + beforeAddFreeText: function (args) { + console.log('Before adding free text on page: ' + args.pageIndex); + // Set args.cancel to true to prevent adding the free text annotation + // args.cancel = true; + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## Signature-related events + +### addSignature + +The [addSignature](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#addsignatureevent) event is triggered when a signature is added to a page of a PDF document. + +#### Event Arguments + +For event data, see [AddSignatureEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/addSignatureEventArgs/). It provides properties such as `pageNumber`. + +The following example illustrates how to handle the `addSignature` event. + +```html +{% raw %} + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + +{% endraw %} +``` + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, + ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + addSignature: function (args) { + console.log('Signature added to page: ' + args.pageIndex); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +### removeSignature + +The [removeSignature](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#removesignatureevent) event is triggered when the signature is removed from the page of a PDF document. + +#### Event Arguments + +For event data, see [RemoveSignatureEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/removeSignatureEventArgs/). It provides properties such as `pageNumber`. + +The following example illustrates how to handle the `removeSignature` event. + +```html +{% raw %} + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + +{% endraw %} +``` + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, + ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + removeSignature: function (args) { + console.log('Signature removed from page: ' + args.pageIndex); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +### resizeSignature + +The [resizeSignature](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#resizesignatureevent) event is triggered when the signature is resized and placed on a page of a PDF document. + +#### Event Arguments + +For event data, see [ResizeSignatureEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/resizeSignatureEventArgs/). + +The following example illustrates how to handle the `resizeSignature` event. + +```html +{% raw %} + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + +{% endraw %} +``` + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, + ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + resizeSignature: function (args) { + console.log('Signature resized on page ' + args.pageIndex); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +### signaturePropertiesChange + +The [signaturePropertiesChange](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#signaturepropertieschangeevent) event is triggered when the property of the signature is changed in the page of the PDF document. + +#### Event Arguments + +For event data, see [SignaturePropertiesChangeEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/signaturePropertiesChangeEventArgs/). + +The following example illustrates how to handle the `signaturePropertiesChange` event. + +```html +{% raw %} + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + +{% endraw %} +``` + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, + ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + signaturePropertiesChange: function (args) { + console.log('Signature properties changed on page ' + args.pageIndex); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +### signatureSelect + +The [signatureSelect](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#signatureselectevent) event is triggered when signature is selected over the page of the PDF document. + +#### Event Arguments + +For event data, see [SignatureSelectEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/signatureSelectEventArgs/). + +The following example illustrates how to handle the `signatureSelect` event. + +```html +{% raw %} + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + +{% endraw %} +``` + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, + ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + signatureSelect: function (args) { + console.log('Signature selected on page ' + args.pageIndex); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +### signatureUnselect + +The [signatureUnselect](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#signatureunselectevent) event is triggered when signature is unselected over the page of the PDF document. + +#### Event Arguments + +For event data, see [SignatureUnSelectEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/signatureUnSelectEventArgs/). + +The following example illustrates how to handle the `signatureUnselect` event. + +```html +{% raw %} + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + +{% endraw %} +``` + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, + ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + signatureUnselect: function (args) { + console.log('Signature unselected on page ' + args.pageIndex); + } +}); +viewer.appendTo('#pdfViewer'); +``` diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/comments.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/comments.md index e9a39decb..68394df40 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/comments.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/comments.md @@ -1,17 +1,16 @@ --- layout: post -title: Comments in Javascript PDF Viewer control | Syncfusion -description: Learn here all about Comments in Syncfusion Javascript PDF Viewer control of Syncfusion Essential JS 2 and more. +title: Comments in JavaScript PDF Viewer control | Syncfusion +description: Learn about comments, replies, and status in the Syncfusion JavaScript PDF Viewer control (Essential JS 2). platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Comments in Javascript PDF Viewer control +# Comments in JavaScript PDF Viewer control -The PDF Viewer control provides options to add, edit, and delete the comments to the following annotation in the PDF documents: +The PDF Viewer control provides options to add, edit, and delete comments for the following annotations in PDF documents: * Shape annotation * Stamp annotation @@ -21,11 +20,11 @@ The PDF Viewer control provides options to add, edit, and delete the comments to * Free text annotation * Ink annotation -![Comments](../images/commentannot.png) +![Comment panel overview](../images/commentannot.png) ## Adding a comment to the annotation -Annotation comment, comment replies, and status can be added to the PDF document using the comment panel. +Annotation comments, replies, and status can be managed in the PDF document using the comment panel. ### Comment panel @@ -34,87 +33,87 @@ Annotation comments can be added to the PDF using the comment panel. The comment 1. Using the annotation menu * Click the Edit Annotation button in the PDF Viewer toolbar. A toolbar appears below it. - * Click the Comment Panel button. A comment panel will appear. + * Click the Comment Panel button. The comment panel opens. 2. Using Context menu - * Select annotation in the PDF document and right-click it. - * Select the comment option in the context menu that appears. + * Select the annotation in the PDF document and right-click it. + * Select Comment from the context menu. 3. Using the Mouse click - * Select annotation in the PDF document and double click it, a comment panel will appear. + * Select the annotation in the PDF document and double-click it. The comment panel opens. -If the comment panel is already in the open state, you can select the annotations and add annotation comments using the comment panel. +If the comment panel is already open, select the annotation and add comments using the panel. ### Adding comments -* Select annotation in the PDF document and click it. -* The selected annotation comment container is highlighted in the comment panel. -* Now, you can add comment and comment replies using the comment panel. +* Select the annotation in the PDF document. +* The corresponding comment thread is highlighted in the comment panel. +* Add comments and replies using the comment panel. -![AddingComments](../images/stickycomment.png) +![Adding comments to a sticky note annotation](../images/stickycomment.png) ### Adding Comment Replies -* The PDF Viewer control provides an option to add multiple replies to the comment. -* After adding the annotation comment, you can add a reply to the comment. +* Multiple replies can be added to a comment. +* After adding a comment, add replies as needed. ### Adding Comment or Reply Status -* Select the Annotation Comments in the comment panel. -* Click the more options button showing in the Comments or reply container. -* Select the Set Status option in the context menu that appears. -* Select the status of the annotation comment in the context menu that appears. +* Select the annotation comment in the comment panel. +* Click More options in the comment or reply container. +* Select Set Status from the context menu. +* Choose a status for the comment. -![CommentStatus](../images/commentstatus.png) +![Set status for a comment](../images/commentstatus.png) ### Editing the comments and comments replies of the annotations -The comment, comment replies, and status of the annotation can be edited using the comment panel. +Comments, replies, and status can be edited using the comment panel. ### Editing the Comment or Comment Replies -The annotation comment and comment replies can be edited in the following ways: +Edit comments and replies in the following ways: 1. Using the Context menu - * Select the Annotation Comments in the comment panel. - * Click the More options button showing in the Comments or reply container. - * Select the Edit option in the context menu that appears. - * Now, an editable text box appears. You can change the content of the annotation comment or comment reply. + * Select the annotation comment in the comment panel. + * Click More options in the comment or reply container. + * Select Edit from the context menu. + * An editable text box appears. Change the content of the comment or reply. 2. Using the Mouse Click - * Select the annotation comments in the comment panel. - * Double click the comment or comment reply content. - * Now, an editable text box appears. You can change the content of the annotation comment or comment reply. + * Select the annotation comment in the comment panel. + * Double-click the comment or reply content. + * An editable text box appears. Change the content of the comment or reply. ### Editing Comment or Reply Status -* Select the Annotation Comments in the comment panel. -* Click the more options button showing in the Comments or reply container. -* Select the Set Status option in the context menu that appears. -* Select the status of the annotation comment in the context menu that appears. -* Status ‘None’ is the default state. If the status is set to ‘None,’ the comments or reply does not appear. +* Select the annotation comment in the comment panel. +* Click More options in the comment or reply container. +* Select Set Status from the context menu. +* Choose a status for the comment. +* None is the default state. Selecting None clears the status indicator; the comment or reply remains visible. -![CommentEdit](../images/commentsedit.png) +![Edit comments and replies](../images/commentsedit.png) ### Delete Comment or Comment Replies -* Select the Annotation Comments in the comment panel. -* Click the more options button shown in the Comments or reply container. -* Select the Delete option in the context menu that appears. +* Select the annotation comment in the comment panel. +* Click More options in the comment or reply container. +* Select Delete from the context menu. -![CommentEdit](../images/commentsdelete.png) +![Delete comments or replies](../images/commentsdelete.png) ->The annotation will be deleted on deleting the comment using comment panel. +>Deleting the root comment from the comment panel also deletes the associated annotation. ## How to check the comments added by the user -The comments added to the PDF document can be viewed by using the [comments](https://ej2.syncfusion.com/documentation/api/pdfviewer/commentEventArgs/) property of the annotation. +Comments added to the PDF document can be read using the annotation's `comments` property. -Refer to the following code to check the comments added in the PDF document using a button click event. +The following example logs comments in response to a button click. ```html @@ -125,7 +124,7 @@ Refer to the following code to check the comments added in the PDF document usin var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/23.1.43/dist/ej2-pdfviewer-lib"; + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib"; }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/free-text-annotation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/free-text-annotation.md index a74a8354c..bc46a7f0b 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/free-text-annotation.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/free-text-annotation.md @@ -1,31 +1,30 @@ --- layout: post -title: Free text annotation in Javascript PDF Viewer control | Syncfusion -description: Learn here all about Free text annotation in Syncfusion Javascript PDF Viewer control of Syncfusion Essential JS 2 and more. +title: Free text annotation in JavaScript PDF Viewer control | Syncfusion +description: Learn about free text annotations in the Syncfusion JavaScript PDF Viewer (Essential JS 2): add, edit, delete, and default settings. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Free text annotation in Javascript PDF Viewer control +# Free text annotation in JavaScript PDF Viewer control -The PDF Viewer control provides the options to add, edit, and delete the free text annotations. +The PDF Viewer control provides options to add, edit, and delete free text annotations. -## Adding a free text annotation to the PDF document +## Add a free text annotation to the PDF document -The Free text annotations can be added to the PDF document using the annotation toolbar. +Free text annotations can be added to the PDF document using the annotation toolbar. -* Click the **Edit Annotation** button in the PDF Viewer toolbar. A toolbar appears below it. -* Select the **Free Text Annotation** button in the annotation toolbar. It enables the Free Text annotation mode. -* You can add the text over the pages of the PDF document. +* Click the **Edit Annotation** button in the PDF Viewer toolbar. The annotation toolbar appears below it. +* Select the **Free Text Annotation** button to enable free text annotation mode. +* Add text anywhere on the pages of the PDF document. -In the pan mode, if the free text annotation mode is entered, the PDF Viewer control will switch to text select mode. +When in pan mode, selecting free text annotation switches the PDF Viewer to text select mode. -![FreeTextAnnotation in TypeScript PDF Viewer](../images/freetext_tool.png) +![Free text tool in the annotation toolbar](../images/freetext_tool.png) -Refer to the following code sample to switch to the Free Text annotation mode using a button click. +The following example switches to free text annotation mode using a button click. ```html @@ -36,7 +35,7 @@ Refer to the following code sample to switch to the Free Text annotation mode us var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib" + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib" }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -73,11 +72,11 @@ if (addFreeTextAnnotationButton) { {% endhighlight %} {% endtabs %} -## Adding a free text annotation programatically to the PDF document +## Add a free text annotation programmatically to the PDF document -The PDF Viewer library allows you to add the free text annotation in the PDF Viewer control programmatically using the [**addAnnotation()**](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotation/#addannotation) method. +The PDF Viewer library allows adding a free text annotation programmatically using the [addAnnotation()](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotation/#annotation) method. -Here is an example of how you can use the [**addAnnotation()**](https://ej2.syncfusion.com/documentation/api/pdfviewer/#addannotation) method to move the free text annotation programmatically: +Here is an example of adding a free text annotation programmatically using addAnnotation(): ```html @@ -88,7 +87,7 @@ Here is an example of how you can use the [**addAnnotation()**](https://ej2.sync var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib" + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib" }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -143,11 +142,11 @@ if (addFreeTextAnnotation) { {% endhighlight %} {% endtabs %} -## Change the content of an existing Free text annotation programmatically +## Change the content of an existing free text annotation programmatically -To change the content of an existing free text annotation in the Syncfusion PDF viewer programmatically, you can use the **editAnnotation()** method. +To change the content of an existing free text annotation programmatically, use the editAnnotation() method. -Here is an example of how you can use the **editAnnotation()** method to change the content of a free text annotation: +Here is an example of changing the content of a free text annotation using editAnnotation(): ```html @@ -157,7 +156,7 @@ Here is an example of how you can use the **editAnnotation()** method to change var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib" + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib" }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -205,78 +204,78 @@ if (changeContent) { {% endhighlight %} {% endtabs %} -N> Please note that the current version of the PDF Viewer does not offer the functionality to edit existing text within a PDF document. However, you can add new free text annotations and modify existing free text annotations within the document. +N> The current version of the PDF Viewer does not edit existing document text. New free text annotations can be added and modified within the document. -## Editing the properties of free text annotation +## Edit the properties of free text annotations -The font family, font size, font styles, font color, text alignment, fill color, the border stroke color, border thickness, and opacity of the free text annotation can be edited using the Font Family tool, Font Size tool, Font Color tool, Text Align tool, Font Style tool Edit Color tool, Edit Stroke Color tool, Edit Thickness tool, and Edit Opacity tool in the annotation toolbar. +Font family, font size, styles, font color, text alignment, fill color, stroke color, border thickness, and opacity can be edited using the Font Family, Font Size, Font Color, Text Align, Font Style, Edit Color, Edit Stroke Color, Edit Thickness, and Edit Opacity tools in the annotation toolbar. -### Editing font family +### Edit font family -The font family of the annotation can be edited by selecting the desired font in the Font Family tool. +Edit the font family by selecting a font in the Font Family tool. -![FontFamily](../images/fontfamily.png) +![Change font family](../images/fontfamily.png) -### Editing font size +### Edit font size -The font size of the annotation can be edited by selecting the desired size in the Font Size tool. +Edit the font size by selecting a size in the Font Size tool. -![FontSize](../images/fontsize.png) +![Change font size](../images/fontsize.png) -### Editing font color +### Edit font color -The font color of the annotation can be edited using the color palette provided in the Font Color tool. +Edit the font color using the color palette in the Font Color tool. -![FontColor](../images/fontcolor.png) +![Change font color](../images/fontcolor.png) -### Editing the text alignment +### Edit text alignment -The text in the annotation can be aligned by selecting the desired styles in the drop-down pop-up in the Text Align tool. +Align text by selecting an option from the Text Align tool. -![FreeTextAnnotation](../images/textalign.png) +![Set text alignment](../images/textalign.png) -### Editing text styles +### Edit text styles -The style of the text in the annotation can be edited by selecting the desired styles in the drop-down pop-up in the Font Style tool. +Edit text styles by selecting options in the Font Style tool. -![FontStyle](../images/fontstyle.png) +![Change text styles](../images/fontstyle.png) -### Editing fill color +### Edit fill color -The fill color of the annotation can be edited using the color palette provided in the Edit Color tool. +Edit the fill color using the color palette in the Edit Color tool. -![FillColor](../images/fillcolor.png) +![Change fill color](../images/fillcolor.png) -### Editing stroke color +### Edit stroke color -The stroke color of the annotation can be edited using the color palette provided in the Edit Stroke Color tool. +Edit the stroke color using the color palette in the Edit Stroke Color tool. -![StrokeColor](../images/fontstroke.png) +![Change stroke color](../images/fontstroke.png) -### Editing thickness +### Edit thickness -The border thickness of the annotation can be edited using the range slider provided in the Edit Thickness tool. +Edit border thickness using the range slider in the Edit Thickness tool. -![FontThickness](../images/fontthickness.png) +![Change border thickness](../images/fontthickness.png) -### Editing opacity +### Edit opacity -The opacity of the annotation can be edited using the range slider provided in the Edit Opacity tool. +Edit opacity using the range slider in the Edit Opacity tool. -![FontOpacity](../images/fontopacity.png) +![Change opacity](../images/fontopacity.png) -## Setting default properties during control initialization +## Set default properties during control initialization -The properties of the free text annotation can be set before creating the control using the FreeTextSettings. +Default properties for free text annotations can be set before creating the control using FreeTextSettings. -After editing the default values, they will be changed to the selected values. Refer to the following code sample to set the default free text annotation settings. +After changing default values, the selected values are applied. The following example sets default free text annotation settings. {% tabs %} {% highlight ts tabtitle="Standalone" %} var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", freeTextSettings : { fillColor: 'green', borderColor: 'blue', fontColor: 'yellow' } }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/ink-annotation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/ink-annotation.md index abd11847e..477e9f990 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/ink-annotation.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/ink-annotation.md @@ -1,31 +1,30 @@ --- layout: post -title: Ink annotation in Javascript PDF Viewer control | Syncfusion -description: Learn here all about Ink annotation in Syncfusion Javascript PDF Viewer control of Syncfusion Essential JS 2 and more. +title: Ink annotation in JavaScript PDF Viewer control | Syncfusion +description: Learn about ink annotations in the Syncfusion JavaScript PDF Viewer (Essential JS 2): add, edit, delete, and default settings. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Ink annotation in Javascript PDF Viewer control +# Ink annotation in JavaScript PDF Viewer control -The PDF Viewer control provides the options to add, edit, and delete the ink annotations. +The PDF Viewer control provides options to add, edit, and delete ink annotations. -![InkAnnotation](../images/ink_annotation.png) +![Ink annotations overview](../images/ink_annotation.png) -## Adding an ink annotation to the PDF document +## Add an ink annotation to the PDF document -The ink annotations can be added to the PDF document using the annotation toolbar. +Ink annotations can be added to the PDF document using the annotation toolbar. -* Click the **Edit Annotation** button in the PDF Viewer toolbar. A toolbar appears below it. -* Select the **Draw Ink** button in the annotation toolbar. It enables the ink annotation mode. -* You can draw anything over the pages of the PDF document. +* Click the **Edit Annotation** button in the PDF Viewer toolbar. The annotation toolbar appears below it. +* Select the **Draw Ink** button to enable ink annotation mode. +* Draw on any page of the PDF document. -![InkTool](../images/ink_tool.png) +![Ink tool in the annotation toolbar](../images/ink_tool.png) -Refer to the following code sample to switch to the ink annotation mode. +The following example switches to ink annotation mode. ```html @@ -36,7 +35,7 @@ Refer to the following code sample to switch to the ink annotation mode. var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -74,11 +73,11 @@ if (addInkAnnotation) { {% endhighlight %} {% endtabs %} -## Adding a Ink annotation programatically to the PDF document +## Add an ink annotation programmatically to the PDF document -The PDF Viewer library allows you to add the Ink annotation in the PDF Viewer control programmatically using the [**addAnnotation()**](https://ej2.syncfusion.com/documentation/api/pdfviewer/annotation/#annotation) method. +The PDF Viewer library allows adding an ink annotation programmatically using the [addAnnotation()](https://ej2.syncfusion.com/documentation/api/pdfviewer/annotation/#annotation) method. -Here is an example of how you can use the **addAnnotation()** method to move the Ink annotation programmatically: +Here is an example of adding an ink annotation programmatically using addAnnotation(): ```html @@ -89,7 +88,7 @@ Here is an example of how you can use the **addAnnotation()** method to move the var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -139,11 +138,11 @@ if (addInkAnnotation) { {% endhighlight %} {% endtabs %} -## Edit the existing Ink annotation programmatically +## Edit an existing ink annotation programmatically -To modify existing Ink annotation in the Syncfusion PDF viewer programmatically, you can use the **editAnnotation()** method. +To modify an existing ink annotation programmatically, use the editAnnotation() method. -Here is an example of how you can use the **editAnnotation()** method: +Here is an example of using editAnnotation(): ```html @@ -154,7 +153,7 @@ Here is an example of how you can use the **editAnnotation()** method: var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -212,33 +211,33 @@ if (editInkAnnotation) { {% endhighlight %} {% endtabs %} -## Editing the properties of the ink annotation +## Edit the properties of ink annotations -The stroke color, thickness, and opacity of the ink annotation can be edited using the Edit stroke color tool, Edit thickness tool, and Edit opacity tool in the annotation toolbar. +Stroke color, thickness, and opacity can be edited using the Edit Stroke Color, Edit Thickness, and Edit Opacity tools in the annotation toolbar. -### Editing stroke color +### Edit stroke color -The stroke color of the annotation can be edited using the color palette provided in the Edit Stroke Color tool. +Edit the stroke color using the color palette in the Edit Stroke Color tool. -![InkStrokeColor](../images/ink_strokecolor.png) +![Change ink stroke color](../images/ink_strokecolor.png) -### Editing thickness +### Edit thickness -The thickness of the border of the annotation can be edited using the range slider provided in the Edit Thickness tool. +Edit thickness using the range slider in the Edit Thickness tool. -![InkThickness](../images/ink_thickness.png) +![Change ink thickness](../images/ink_thickness.png) -### Editing opacity +### Edit opacity -The opacity of the annotation can be edited using the range slider provided in the Edit Opacity tool. +Edit opacity using the range slider in the Edit Opacity tool. -![InkOpacity](../images/ink_opacity.png) +![Change ink opacity](../images/ink_opacity.png) -## Setting default properties during the control initialization +## Set default properties during control initialization -The properties of the ink annotation can be set before creating the control using the InkAnnotationSettings. +Default properties for ink annotations can be set before creating the control using InkAnnotationSettings. -After editing the default values, they will be changed to the selected values. +After changing default values, the selected values are applied. Refer to the following code sample to set the default ink annotation settings. {% tabs %} @@ -250,7 +249,7 @@ PdfViewer.Inject(Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, let pdfviewer: PdfViewer = new PdfViewer(); pdfviewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; -pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib"; +pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib"; pdfviewer.inkAnnotationSettings = {author: 'Syncfusion', strokeColor: 'green', thickness: 3, opacity: 0.6}; pdfviewer.appendTo('#PdfViewer'); diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/line-angle-constraints.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/line-angle-constraints.md index df5041d95..ebaea69c8 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/line-angle-constraints.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/line-angle-constraints.md @@ -1,20 +1,19 @@ --- layout: post -title: Line Angle Constraint in JavaScript PdfViewer | Syncfusion -description: Learn here all about Line Angle Constraints in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Line angle constraints in JavaScript PDF Viewer | Syncfusion +description: Learn to add, edit, delete, and configure highlight, underline, strikethrough, and squiggly text markup annotations programmatically in PDF Viewer. platform: document-processing -control: Line Angle Constraints -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Line Angle Constraints in JavaScript PDF Viewer +# Line angle constraints in JavaScript PDF Viewer The PDF Viewer control provides robust **line angle constraints** functionality. This allows users to draw line type annotations with controlled angle snapping, improving accuracy and consistency across technical drawings and measurements across your PDF documents. -## Enabling Line Angle Constraints -To enable line angle constraints, configure the `enableLineAngleConstraints` property within the `annotationDrawingOptions` of the PDF Viewer. When enabled, line-type annotations are automatically restricted to fixed angles. +## Enable line angle constraints +Configure the `enableLineAngleConstraints` property within `annotationDrawingOptions`. When enabled, supported line-type annotations snap to fixed angles. The following code demonstrates how to enable line angle constraints: @@ -22,7 +21,7 @@ The following code demonstrates how to enable line angle constraints: var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', - resourceUrl: "https://cdn.syncfusion.com/ej2/31.1.17/dist/ej2-pdfviewer-lib", + resourceUrl: "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", annotationDrawingOptions : {enableLineAngleConstraints : true, restrictLineAngleTo: 90} }); @@ -49,50 +48,49 @@ The `enableLineAngleConstraints` property activates angle snapping for line-base - Automatic angle snapping during the drawing - Enhanced precision for technical drawings and measurements -- Desktop support: Hold **Shift** while drawing to activate constraints +- Desktop behavior: hold Shift while drawing to toggle constraints (when disabled, Shift temporarily enables; when enabled, Shift enforces snapping) - Real-time visual feedback showing angle snapping behavior ### restrictLineAngleTo -The `restrictLineAngleTo` property defines the angle increment (in degrees) that constrains line-based annotations. The default value is **45 degrees**. +Defines the angle increment (in degrees) used to constrain supported annotations. The default is 45. -**Angle Snapping Rules:** +Angle snapping rules: - The initial drawing direction is treated as the 0° reference point - Snapped angles are calculated based on the increment - If the increment doesn’t divide 360 evenly, angles reset after 360° -**Examples:** +Examples: - restrictLineAngleTo: 45 → Snapped angles: 0°, 45°, 90°, 135°, 180°, 225°, 270°, 315°, 360° - restrictLineAngleTo: 100 → Snapped angles: 0°, 100°, 200°, 300°, 360° -## Working with Constrained Annotations +## Work with constrained annotations ### Drawing Behavior When line angle constraints are enabled: -**Initial Drawing:** Start drawing a line, arrow, polygon, distance, perimeter, area, or volume as usual. -**Angle Snapping:** The line snaps to the nearest allowed angle. -**Visual Feedback:** Snapped angle is shown in real time. -**Completion:** Release to complete the annotation. +- Start drawing a supported annotation (Line, Arrow, Polyline, Distance, or Perimeter). +- The segment snaps to the nearest allowed angle. +- A visual indicator reflects snapping in real time. +- Release to complete the annotation. ### Keyboard Shortcuts -**Desktop Platforms:** - -**Shift + Drag:** Enables angle snapping even when `enableLineAngleConstraints` is false. +Desktop platforms: +- Shift + drag: toggles snapping. If constraints are disabled, Shift temporarily enables them; if enabled, Shift enforces snapping. ### Selector-Based Modifications When modifying existing line annotations using selectors: - Constraints apply based on the original line direction. -- The reference angle (0°) is determined by the lines current orientation. -- Only lines and arrows support constraint snapping during modification. -- Adjustments snap to the configured angle increment relative to the original direction. +- The reference angle (0°) is determined by the line’s current orientation. +- Constraint snapping during modification is supported for Line and Arrow. +- Adjustments snap to the configured angle increment. -[View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to) +[View a sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to) -N> You can refer to our [JavaScript PDF Viewer](https://www.syncfusion.com/pdf-viewer-sdk/javascript-pdf-viewer) feature tour page for its groundbreaking feature representations. You can also explore our [JavaScript PDF Viewer example](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples) to know how to render and configure the PDF Viewer. +N> Refer to the JavaScript PDF Viewer [feature tour](https://www.syncfusion.com/pdf-viewer-sdk/javascript-pdf-viewer) for feature highlights. Explore the [JavaScript PDF Viewer examples](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples) to learn how to render and configure the PDF Viewer. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/measurement-annotation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/measurement-annotation.md index fd2dfe3a1..5bda021b5 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/measurement-annotation.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/measurement-annotation.md @@ -1,17 +1,16 @@ --- layout: post -title: Measurement annotation in Javascript PDF Viewer control | Syncfusion -description: Learn here all about Measurement annotation in Syncfusion Javascript PDF Viewer control of Syncfusion Essential JS 2 and more. +title: Measurement annotation in JavaScript PDF Viewer control | Syncfusion +description: Learn about measurement annotations in the Syncfusion JavaScript PDF Viewer (Essential JS 2): distance, perimeter, area, radius, and volume. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Measurement annotation in Javascript PDF Viewer control +# Measurement annotation in JavaScript PDF Viewer control -The PDF Viewer provides the options to add measurement annotations. You can measure the page annotations with the help of measurement annotation. The supported measurement annotations in the PDF Viewer control are: +The PDF Viewer provides options to add measurement annotations. The supported measurement annotations are: * Distance * Perimeter @@ -19,22 +18,22 @@ The PDF Viewer provides the options to add measurement annotations. You can meas * Radius * Volume -![CalibrateAnnotation](../images/calibrate_annotation.png) +![Measurement annotations overview](../images/calibrate_annotation.png) ## Adding measurement annotations to the PDF document The measurement annotations can be added to the PDF document using the annotation toolbar. * Click the **Edit Annotation** button in the PDF Viewer toolbar. A toolbar appears below it. -* Click the **Measurement Annotation** dropdown button. A dropdown pop-up will appear and shows the measurement annotations to be added. -* Select the measurement type to be added to the page in the dropdown pop-up. It enables the selected measurement annotation mode. -* You can measure and add the annotation over the pages of the PDF document. +* Click the **Measurement Annotation** drop-down button. The pop-up lists available measurement annotation types. +* Select a measurement type to enable its annotation mode. +* Measure and add annotations on the pages of the PDF document. -In the pan mode, if the measurement annotation mode is entered, the PDF Viewer control will switch to text select mode. +When in pan mode, selecting a measurement annotation switches the PDF Viewer to text select mode. ![CalibrateTool](../images/calibrate_tool.png) -Refer to the following code snippet to switch to distance annotation mode. +The following example switches to distance annotation mode. ```html @@ -44,7 +43,7 @@ Refer to the following code snippet to switch to distance annotation mode. var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -81,11 +80,11 @@ if (distanceMode) { {% endhighlight %} {% endtabs %} -## Adding a measurement annotation to the PDF document Programmatically +## Add a measurement annotation to the PDF document programmatically -With the PDF Viewer library, you can add a measurement annotation to the PDF Viewer control programmatically using the [**addAnnotation()**](https://ej2.syncfusion.com/documentation/api/pdfviewer/annotation/#addannotation) method. +The PDF Viewer library allows adding measurement annotations programmatically using the [addAnnotation()](https://ej2.syncfusion.com/documentation/api/pdfviewer/annotation/#annotation) method. -Here's a example of how you can utilize the **addAnnotation()** method to include a measurement annotation programmatically: +Here is an example showing how to add measurement annotations programmatically using addAnnotation(): ```html @@ -100,7 +99,7 @@ Here's a example of how you can utilize the **addAnnotation()** method to includ var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -252,11 +251,11 @@ if (addVolumeAnnotation) { {% endhighlight %} {% endtabs %} -## Edit the existing measurement annotation programmatically +## Edit an existing measurement annotation programmatically -To modify existing measurement annotation in the Syncfusion PDF viewer programmatically, you can use the **editAnnotation()** method. +To modify an existing measurement annotation programmatically, use the editAnnotation() method. -Here is an example of how you can use the **editAnnotation()** method: +Here is an example of using editAnnotation(): ```html @@ -271,7 +270,7 @@ Here is an example of how you can use the **editAnnotation()** method: var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -459,43 +458,43 @@ if (editVolumeAnnotation) { {% endhighlight %} {% endtabs %} -## Editing the properties of measurement annotation +## Edit the properties of measurement annotations -The fill color, stroke color, thickness, and opacity of the measurement annotation can be edited using the Edit Color tool, Edit Stroke Color tool, Edit Thickness tool, and Edit Opacity tool in the annotation toolbar. +The fill color, stroke color, thickness, and opacity can be edited using the Edit Color, Edit Stroke Color, Edit Thickness, and Edit Opacity tools in the annotation toolbar. -### Editing fill color +### Edit fill color The fill color of the annotation can be edited using the color palette provided in the Edit Color tool. ![CalibrateFillColor](../images/calibrate_fillcolor.png) -### Editing stroke color +### Edit stroke color The stroke color of the annotation can be edited using the color palette provided in the Edit Stroke Color tool. ![CalibrateStrokeColor](../images/calibrate_stroke.png) -### Editing thickness +### Edit thickness -The thickness of the border of the annotation can be edited using the range slider provided in the Edit thickness tool. +Edit border thickness using the range slider provided in the Edit Thickness tool. ![CalibrateThickness](../images/calibrate_thickness.png) -### Editing opacity +### Edit opacity The opacity of the annotation can be edited using the range slider provided in the Edit Opacity tool. ![CalibrateOpacity](../images/calibrate_opacity.png) -### Editing the line properties +### Edit the line properties -The properties of the line shapes such as distance and perimeter annotations can be edited using the Line properties window. It can be opened by selecting the Properties option in the context menu that appears on right-clicking the distance and perimeter annotations. +Line-based measurement annotations (distance and perimeter) have additional options in the Line Properties window. Open it by right-clicking the annotation and selecting Properties from the context menu. ![CalibrateProperty](../images/calibrate_lineprop.png) -## Setting default properties during control initialization +## Set default properties during control initialization -The properties of the shape annotations can be set before creating the control using distanceSettings, perimeterSettings, areaSettings, radiusSettings and volumeSettings. +Default properties for measurement annotations can be set before creating the control using distanceSettings, perimeterSettings, areaSettings, radiusSettings, and volumeSettings. Refer to the following code snippet to set the default annotation settings. @@ -504,7 +503,7 @@ Refer to the following code snippet to set the default annotation settings. var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", distanceSettings : {fillColor: 'blue', opacity: 0.6, strokeColor: 'green'}, perimeterSettings : {fillColor: 'green', opacity: 0.6, strokeColor: 'blue'}, areaSettings :{fillColor: 'yellow', opacity: 0.6, strokeColor: 'orange'}, @@ -559,7 +558,7 @@ The properties of scale ratio for measurement annotation can be set before creat var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", measurementSettings = {scaleRatio: 2, conversionUnit: 'cm', displayUnit: 'cm'}, }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/shape-annotation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/shape-annotation.md index cba03bdc0..3b547003b 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/shape-annotation.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/shape-annotation.md @@ -1,17 +1,16 @@ --- layout: post -title: Shape annotation in Javascript PDF Viewer control | Syncfusion -description: Learn here all about Shape annotation in Syncfusion Javascript PDF Viewer control of Syncfusion Essential JS 2 and more. +title: Shape annotation in JavaScript PDF Viewer control | Syncfusion +description: Learn about shape annotations in the Syncfusion JavaScript PDF Viewer (Essential JS 2), including add, edit, delete, and default settings. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Shape annotation in Javascript PDF Viewer control +# Shape annotation in JavaScript PDF Viewer control -The PDF Viewer control provides the options to add, edit, and delete the shape annotations. The shape annotation types supported in the PDF Viewer control are: +The PDF Viewer control provides options to add, edit, and delete shape annotations. The supported shape annotation types are: * Line * Arrow @@ -19,20 +18,20 @@ The PDF Viewer control provides the options to add, edit, and delete the shape a * Circle * Polygon -![ShapeAnnotation](../images/shape_annot.png) +![Shape annotations overview](../images/shape_annot.png) ## Adding a shape annotation to the PDF document Shape annotations can be added to the PDF document using the annotation toolbar. * Click the **Edit Annotation** button in the PDF Viewer toolbar. A toolbar appears below it. -* Click the **Shape Annotation** drop-down button. A drop-down pop-up will appear and shows the shape annotations to be added. -* Select the shape types to be added to the page in the drop-down pop-up. It enables the selected shape annotation mode. -* You can add the shapes over the pages of the PDF document. +* Click the **Shape Annotation** drop-down button. The pop-up lists available shape annotation types. +* Select a shape type to enable its annotation mode. +* Draw the shape on the pages of the PDF document. -N> While you're in the pan mode, for navigating through the document, and you click on the shape annotation button to add the shape annotation , the PDF Viewer control will smoothly transition to text select mode. This seamless transition ensures a fluid experience when switching between different interaction modes within the PDF Viewer interface. +N> When in pan mode and a shape annotation tool is selected, the PDF Viewer switches to text select mode automatically to ensure a smooth interaction experience. -![ShapeTool](../images/shape_toolbar.png) +![Shape annotation toolbar](../images/shape_toolbar.png) Refer to the following code sample to switch to the circle annotation mode. @@ -45,7 +44,7 @@ Refer to the following code sample to switch to the circle annotation mode. var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib" + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib" }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -83,11 +82,11 @@ if (circleAnnotationButton) { {% endhighlight %} {% endtabs %} -## Adding a Shape annotation to the PDF document Programmatically +## Add a shape annotation to the PDF document programmatically -With the PDF Viewer library, you can add a Shape annotation to the PDF Viewer control programmatically using the [**addAnnotation()**](https://ej2.syncfusion.com/documentation/api/pdfviewer/annotation/#addannotation) method. +The PDF Viewer library allows adding a shape annotation programmatically using the [addAnnotation()](https://ej2.syncfusion.com/documentation/api/pdfviewer/annotation/#addannotation) method. -Here's a example of how you can utilize the **addAnnotation()** method to include a Shape annotation programmatically: +Here is an example showing how to add shape annotations programmatically using addAnnotation(): ```html @@ -101,7 +100,7 @@ Here's a example of how you can utilize the **addAnnotation()** method to includ var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -255,11 +254,11 @@ if (addPolygonAnnotation) { {% endhighlight %} {% endtabs %} -## Edit the existing shape annotation programmatically +## Edit an existing shape annotation programmatically -To modify existing shape annotation in the Syncfusion PDF viewer programmatically, you can use the **editAnnotation()** method. +To modify an existing shape annotation programmatically, use the editAnnotation() method. -Here is an example of how you can use the **editAnnotation()** method: +Here is an example of using editAnnotation(): ```html @@ -273,7 +272,7 @@ Here is an example of how you can use the **editAnnotation()** method: var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -461,50 +460,50 @@ if (editPolygonAnnotation) { ## Editing the properties of the shape annotation -The fill color, stroke color, thickness, and opacity of the shape annotation can be edited using the Edit color tool, Edit stroke color tool, Edit thickness tool, and Edit opacity tool in the annotation toolbar. +The fill color, stroke color, thickness, and opacity of shape annotations can be edited using the Edit Color, Edit Stroke Color, Edit Thickness, and Edit Opacity tools in the annotation toolbar. ### Editing fill color The fill color of the annotation can be edited using the color palette provided in the Edit Color tool. -![ShapeFillColor](../images/shape_fillColor.png) +![Edit fill color for shapes](../images/shape_fillColor.png) ### Editing stroke color The stroke color of the annotation can be edited using the color palette provided in the Edit Stroke Color tool. -![ShapeStrokeColor](../images/shape_strokecolor.png) +![Edit stroke color for shapes](../images/shape_strokecolor.png) ### Editing thickness The thickness of the border of the annotation can be edited using the range slider provided in the Edit Thickness tool. -![ShapeThickness](../images/shape_thickness.png) +![Edit thickness for shapes](../images/shape_thickness.png) ### Editing opacity The opacity of the annotation can be edited using the range slider provided in the Edit Opacity tool. -![ShapeOpacity](../images/shape_opacity.png) +![Edit opacity for shapes](../images/shape_opacity.png) ### Editing the line properties -The properties of the line shapes such as line and arrow annotations can be edited using the Line Properties window. It can be opened by selecting the Properties option in the context menu that appears on right-clicking the line and arrow annotations. +Line and arrow annotations have additional options in the Line Properties window. Open it by right-clicking a line or arrow annotation and selecting Properties from the context menu. Refer to the following code sample to set the default annotation settings. -![ShapeProperty](../images/shape_lineprty.png) +![Line properties dialog](../images/shape_lineprty.png) -## Setting default properties during the control initialization +## Set default properties during control initialization -The properties of the shape annotations can be set before creating the control using LineSettings, ArrowSettings, RectangleSettings, CircleSettings, and PolygonSettings. +Default properties for shape annotations can be set before creating the control using LineSettings, ArrowSettings, RectangleSettings, CircleSettings, and PolygonSettings. {% tabs %} {% highlight ts tabtitle="Standalone" %} var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", lineSettings : {fillColor: 'blue', opacity: 0.6, strokeColor: 'green'}, arrowSettings : {fillColor: 'green', opacity: 0.6, strokeColor: 'blue'}, rectangleSettings : {fillColor: 'yellow', opacity: 0.6, strokeColor: 'orange'}, diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/signature-annotation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/signature-annotation.md index e399be281..dec244e46 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/signature-annotation.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/signature-annotation.md @@ -1,34 +1,33 @@ --- layout: post -title: Handwritten signature in Javascript PDF Viewer control | Syncfusion -description: Learn here all about Handwritten signature in Syncfusion Javascript PDF Viewer control of Syncfusion Essential JS 2 and more. +title: Handwritten signature in JavaScript PDF Viewer control | Syncfusion +description: Learn about handwritten signatures in the Syncfusion JavaScript PDF Viewer (Essential JS 2): add, enable/disable, and edit properties. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Handwritten signature Javascript PDF Viewer control +# Handwritten signature in JavaScript PDF Viewer control -The PDF Viewer control supports adding handwritten signatures to a PDF document. The handwritten signature reduces the paper work of reviewing the content and verifies it digitally. +The PDF Viewer control supports adding handwritten signatures to a PDF document. Handwritten signatures reduce paperwork and enable digital verification. ## Adding a handwritten signature to the PDF document The handwritten signature can be added to the PDF document using the annotation toolbar. * Click the **Edit Annotation** button in the PDF Viewer toolbar. A toolbar appears below it. -* Select the **HandWritten Signature** button in the annotation toolbar. The signature panel will appear. +* Select the **HandWritten Signature** button in the annotation toolbar. The signature panel appears. -![HandWritten Signature](../images/select_sign.png) +![Open the handwritten signature panel](../images/select_sign.png) -* Draw the signature in the signature panel. +* Draw the signature in the panel. -![HandWritten Signature](../images/add_sign.png) +![Draw the handwritten signature](../images/add_sign.png) -* Then click **Create** button and move the signature using the mouse and place them in the desired location. +* Click **Create**, move the signature, and place it at the desired location. -![HandWritten Signature](../images/create_sign.png) +![Place the handwritten signature on the page](../images/create_sign.png) Refer to the following code sample to switch to the handwritten signature mode programmatically. @@ -40,7 +39,7 @@ Refer to the following code sample to switch to the handwritten signature mode p var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -76,16 +75,16 @@ if (handWrittenSignature) { {% endtabs %} -## How to enable the handwritten signature +## Enable the handwritten signature -The following code snippet describes how to enable the handwritten signature in PDF Viewer. When the value is set to `false` it disables the handwritten signature. +The following example enables or disables the handwritten signature in the PDF Viewer. Setting the value to `false` disables the feature. {% tabs %} {% highlight ts tabtitle="Standalone" %} var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", enableHandwrittenSignature : false, }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, @@ -107,11 +106,11 @@ pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} -## Adding Handwritten signature programatically to the PDF document +## Add a handwritten signature programmatically to the PDF document With the PDF Viewer library, you can programmatically add a handwritten signature to the PDF Viewer control using the [**addAnnotation()**](https://ej2.syncfusion.com/documentation/api/pdfviewer/annotation/#annotation) method. -Here is an example of how you can use the **addAnnotation()** method to add the Handwritten signature programmatically +Here is an example of adding a handwritten signature programmatically using addAnnotation(): ```html @@ -122,7 +121,7 @@ Here is an example of how you can use the **addAnnotation()** method to add the var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/27.1.48/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -234,24 +233,24 @@ if(addHandwrittenSignature){ [View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to/Add%20Handwritten%20Signature%20Programmatically) -## Editing the properties of handwritten signature +## Edit the properties of handwritten signatures -The stroke color, border thickness, and opacity of the handwritten signature can be edited using the edit stroke color tool, edit thickness tool, and edit opacity tool in the annotation toolbar. +Stroke color, border thickness, and opacity can be edited using the Edit Stroke Color, Edit Thickness, and Edit Opacity tools in the annotation toolbar. -### Editing stroke color +### Edit stroke color -The stroke color of the annotation can be edited using the color palette provided in the Edit Stroke Color tool. +Edit the stroke color using the color palette in the Edit Stroke Color tool. -![SignatureStrokeColor](../images/change_stroke.png) +![Change signature stroke color](../images/change_stroke.png) -### Editing thickness +### Edit thickness -The thickness of the border of the annotation can be edited using the range slider provided in the Edit Thickness tool. +Edit border thickness using the range slider in the Edit Thickness tool. -![SignatureThickness](../images/change_thickness.png) +![Change signature border thickness](../images/change_thickness.png) -### Editing opacity +### Edit opacity -The opacity of the annotation can be edited using the range slider provided in the Edit Opacity tool. +Edit opacity using the range slider in the Edit Opacity tool. -![SignatureOpacity](../images/change_opacity.png) \ No newline at end of file +![Change signature opacity](../images/change_opacity.png) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/stamp-annotation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/stamp-annotation.md index b1cd2ae15..0af4ee5c8 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/stamp-annotation.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/stamp-annotation.md @@ -1,17 +1,16 @@ --- layout: post -title: Stamp annotation in Javascript PDF Viewer control | Syncfusion -description: Learn here all about Stamp annotation in Syncfusion Javascript PDF Viewer control of Syncfusion Essential JS 2 and more. +title: Stamp annotation in JavaScript PDF Viewer control | Syncfusion +description: Learn about stamp annotations in the Syncfusion JavaScript PDF Viewer (Essential JS 2): dynamic, sign here, standard business, and custom stamps. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Stamp annotation in Javascript PDF Viewer control +# Stamp annotation in JavaScript PDF Viewer control -The PDF Viewer control provides options to add, edit, delete, and rotate the following stamp annotation in the PDF documents: +The PDF Viewer control provides options to add, edit, delete, and rotate the following stamp annotations in PDF documents: * Dynamic * Sign Here @@ -20,24 +19,24 @@ The PDF Viewer control provides options to add, edit, delete, and rotate the fol ![StampAnnotation](../images/stamp_annot.png) -## Adding stamp annotations to the PDF document +## Add stamp annotations to the PDF document The stamp annotations can be added to the PDF document using the annotation toolbar. * Click the **Edit Annotation** button in the PDF Viewer toolbar. A toolbar appears below it. -* Click the **Stamp Annotation** drop-down button. A drop-down pop-up will appear and shows the stamp annotations to be added. +* Click the **Stamp Annotation** drop-down button. The pop-up lists available stamp annotation types. ![StampTool](../images/stamp_tool.png) -* Select the annotation type to be added to the page in the pop-up. +* Select a stamp type to enable its annotation mode. ![StampPopup](../images/selectstamp_annot.png) -* You can add the annotation over the pages of the PDF document. +* Place the stamp on the pages of the PDF document. -N> While you're in the pan mode, for navigating through the document, and you click on the stamp annotation button to add the stamp annotation , the PDF Viewer control will smoothly transition to text select mode. This seamless transition ensures a fluid experience when switching between different interaction modes within the PDF Viewer interface. +N> When in pan mode and a stamp annotation tool is selected, the PDF Viewer switches to text select mode automatically for a smooth interaction experience. -Refer to the following code sample to switch to the stamp annotation mode. +The following examples switch to stamp annotation modes. ```html @@ -49,7 +48,7 @@ Refer to the following code sample to switch to the stamp annotation mode. var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib" + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib" }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -120,23 +119,23 @@ if (standardBusinessStamp) { {% endhighlight %} {% endtabs %} -## Adding custom stamp to the PDF document +## Add a custom stamp to the PDF document * Click the **Edit Annotation** button in the PDF Viewer toolbar. A toolbar appears below it. -* Click the **Stamp Annotation** drop-down button. A drop-down pop-up will appear and shows the stamp annotations to be added. +* Click the **Stamp Annotation** drop-down button. The pop-up lists available stamp annotation types. * Click the Custom Stamp button. ![CustomStamp](../images/customStamp.png) -* The file explorer dialog will appear, choose the image and then add the image to the PDF page. +* In the file explorer dialog, choose an image and add it to the PDF page. ->The JPG and JPEG image format is only supported in the custom stamp annotations. +>Only JPG and JPEG image formats are supported for custom stamp annotations. -## Adding a Stamp annotation to the PDF document Programmatically +## Add a stamp annotation to the PDF document programmatically -With the PDF Viewer library, you can add a Stamp annotation to the PDF Viewer control programmatically using the [**addAnnotation()**](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotation/#addannotation) method. +The PDF Viewer library allows adding a stamp annotation programmatically using the [addAnnotation()](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotation/#annotation) method. -Here's a example of how you can utilize the **addAnnotation()** method to include a Stamp annotation programmatically: +Here are examples showing how to add stamp annotations programmatically using addAnnotation(): ```html @@ -150,7 +149,7 @@ Here's a example of how you can utilize the **addAnnotation()** method to includ var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -283,11 +282,11 @@ if (customStamp) { {% endhighlight %} {% endtabs %} -## Edit the existing sticky note annotation programmatically +## Edit an existing stamp annotation programmatically -To modify existing sticky note annotation in the Syncfusion PDF viewer programmatically, you can use the **editAnnotation()** method. +To modify an existing stamp annotation programmatically, use the editAnnotation() method. -Here is an example of how you can use the **editAnnotation()** method: +Here is an example of using editAnnotation(): ```html @@ -298,7 +297,7 @@ Here is an example of how you can use the **editAnnotation()** method: var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -348,19 +347,18 @@ if (editAnnotation) { {% endhighlight %} {% endtabs %} -## Setting default properties during control initialization +## Set default properties during control initialization -The properties of the stamp annotation can be set before creating the control using the StampSettings. +Default properties for stamp annotations can be set before creating the control using StampSettings. -After editing the default opacity using the Edit Opacity tool, they will be changed to the selected values. -Refer to the following code sample to set the default sticky note annotation settings. +After changing default opacity using the Edit Opacity tool, the selected value is applied. The following example sets default stamp annotation settings. {% tabs %} {% highlight ts tabtitle="Standalone" %} var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", stampSettings : {opacity: 0.3, author: 'Guest User'} }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/sticky-notes-annotation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/sticky-notes-annotation.md index 36248a481..e5a5c63bd 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/sticky-notes-annotation.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/sticky-notes-annotation.md @@ -1,44 +1,42 @@ --- layout: post -title: Sticky notes in Javascript PDF Viewer control | Syncfusion -description: Learn here all about Sticky notes in Syncfusion Javascript PDF Viewer control of Syncfusion Essential JS 2 and more. +title: Sticky notes in JavaScript PDF Viewer control | Syncfusion +description: Learn about sticky note annotations in the Syncfusion JavaScript PDF Viewer (Essential JS 2): add, edit, delete, and default settings. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Sticky notes in Javascript PDF Viewer control +# Sticky notes in JavaScript PDF Viewer control -The PDF Viewer control provides the options to add, edit, and delete the sticky note annotations in the PDF document. +The PDF Viewer control provides options to add, edit, and delete sticky note annotations in the PDF document. ![StickyNotesAnnotation](../images/stickynotes_annotation.png) -## Adding a sticky note annotation to the PDF document +## Add a sticky note annotation to the PDF document Sticky note annotations can be added to the PDF document using the annotation toolbar. -* Click the **Comments** button in the PDF Viewer toolbar. A toolbar appears below it. -* Click the position where you want to add sticky note annotation in the PDF document. -* Sticky note annotation will be added in the clicked positions. +* Click the **Comments** button in the PDF Viewer toolbar. The annotation toolbar appears below it. +* Click the position where the sticky note annotation should be added. +* The sticky note annotation is added at the clicked position. ![StickyNotesTool](../images/stickynotes_tool.png) - Annotation comments can be added to the PDF document using the comment panel. +Annotation comments can be added using the comment panel. -* Select a Sticky note annotation in the PDF document and right-click it. -* Select the Comment option in the context menu that appears. -* Now, you can add Comments, Reply, and Status using the Comment Panel. -* Now, you can add Comments, Reply, and Status using the Comment Panel. +* Select a sticky note annotation in the PDF document and right-click it. +* Select Comment from the context menu. +* Add comments, replies, and status using the comment panel. ![StickyNotesComment](../images/stickynotes_comment.png) -## Adding a sticky note annotation to the PDF document Programmatically +## Add a sticky note annotation to the PDF document programmatically -With the PDF Viewer library, you can add a sticky note annotation to the PDF Viewer control programmatically using the [**addAnnotation()**](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotation/#addannotation) method. +The PDF Viewer library allows adding a sticky note annotation programmatically using the [addAnnotation()](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotation/#addannotation) method. -Here's a example of how you can utilize the **addAnnotation()** method to include a sticky note annotation programmatically: +Here is an example showing how to add a sticky note annotation programmatically using addAnnotation(): ```html @@ -49,7 +47,7 @@ Here's a example of how you can utilize the **addAnnotation()** method to includ var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -95,11 +93,11 @@ if (stickyNote) { {% endhighlight %} {% endtabs %} -## Edit the existing sticky note annotation programmatically +## Edit an existing sticky note annotation programmatically -To modify existing sticky note annotation in the Syncfusion PDF viewer programmatically, you can use the **editAnnotation()** method. +To modify an existing sticky note annotation programmatically, use the editAnnotation() method. -Here is an example of how you can use the **editAnnotation()** method: +Here is an example of using editAnnotation(): ```html @@ -110,7 +108,7 @@ Here is an example of how you can use the **editAnnotation()** method: var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -162,38 +160,38 @@ if (stickyNote) { {% endhighlight %} {% endtabs %} -## Editing the properties of the sticky note annotation +## Edit the properties of sticky note annotations ### Editing opacity -The opacity of the annotation can be edited using the range slider provided in the Edit Opacity tool. +Edit opacity using the range slider in the Edit Opacity tool. ![StickyNotesOpacity](../images/sticky_opacity.png) ### Editing comments -The comment, comment reply, and comment status of the annotation can be edited using the Comment Panel. +Comment text, replies, and status can be edited using the comment panel. -* Open the comment panel using the Comment Panel button showing in the annotation toolbar. +* Open the comment panel using the Comment Panel button in the annotation toolbar. ![StickyNotesComment](../images/commentPanel.png) -You can modify or delete the comments or comments replay and it’s status using the menu option provided in the comment panel. +Modify or delete comments or replies, and change status using the menu options in the comment panel. ![StickyNotesEdit](../images/sticky_editbtn.png) -## Setting default properties during the control initialization +## Set default properties during control initialization -The properties of the sticky note annotation can be set before creating the control using the StickyNoteSettings. +Default properties for sticky note annotations can be set before creating the control using StickyNotesSettings. -After editing the default opacity using the Edit Opacity tool, they will be changed to the selected values. Refer to the following code sample to set the default sticky note annotation settings. +After changing default opacity using the Edit Opacity tool, the selected value is applied. The following example sets default sticky note annotation settings. {% tabs %} {% highlight ts tabtitle="Standalone" %} var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", stickyNotesSettings : {author: 'Syncfusion'} }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, @@ -215,16 +213,16 @@ pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} -## Disabling sticky note annotations +## Disable sticky note annotations -The PDF Viewer control provides an option to disable the sticky note annotations feature. The code sample for disabling the feature is as follows. +The PDF Viewer control provides an option to disable sticky note annotations. The following example disables the feature. {% tabs %} {% highlight ts tabtitle="Standalone" %} var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", enableStickyNotesAnnotation : false }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/text-markup-annotation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/text-markup-annotation.md index f93b9c7b9..4f9df6aea 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/text-markup-annotation.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/annotations/text-markup-annotation.md @@ -1,40 +1,39 @@ --- layout: post -title: Text markup annotation in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Text markup annotation in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Text markup annotation in JavaScript PDF Viewer | Syncfusion +description: Learn to add, edit, delete, and customize text markup annotations like highlight, underline, and squiggly in Syncfusion JavaScript PDF Viewer. platform: document-processing -control: Text markup annotation -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Text markup annotation in Javascript Pdfviewer control +# Text markup annotation in JavaScript PDF Viewer -The PDF Viewer control provides the options to add, edit, and delete text markup annotations such as highlight, underline, strikethrough and squiggly annotations in the PDF document. +The PDF Viewer provides options to add, edit, and delete text markup annotations, including Highlight, Underline, Strikethrough, and Squiggly. ![Alt text](../images/text_markup_annotation.png) -## Highlight a text +## Highlight text -There are two ways to highlight a text in the PDF document: +There are two ways to highlight text: 1. Using the context menu - * Select a text in the PDF document and right-click it. - * Select **Highlight** option in the context menu that appears. +* Select text in the PDF document and right-click it. +* Select **Highlight** in the context menu. ![Alt text](../images/highlight_context.png) 2. Using the annotation toolbar - * Click the **Edit Annotation** button in the PDF Viewer toolbar. A toolbar appears below it. - * Select the **Highlight** button in the annotation toolbar. It enables the highlight mode. - * Select the text and the highlight annotation will be added. - * You can also select the text and apply the highlight annotation using the **Highlight** button. +* Click the **Edit Annotation** button in the PDF Viewer toolbar to open the annotation toolbar. +* Select **Highlight** to enable highlight mode. +* Select text to add the highlight annotation. +* Alternatively, select text first and then click **Highlight**. ![Alt text](../images/highlight_button.PNG) -In the pan mode, if the highlight mode is entered, the PDF Viewer control will switch to text select mode to enable the text selection for highlighting the text. +When pan mode is active and a text markup mode is entered, the PDF Viewer switches to text selection mode to enable selection. Refer to the following code snippet to switch to highlight mode. @@ -64,11 +63,11 @@ Add the below `serviceUrl` in the `index.html` file {% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es5/es5-text-markup-annotation/highlight-normal-mode-cs1/index.html" %} -## Highlight a text programmatically +## Highlight text programmatically -The PDF Viewer library enables you to programmatically highlight text within the PDF Viewer control using the [**addAnnotation()**](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotation/#addannotation) method. +Programmatically add highlights using the [addAnnotation](https://ej2.syncfusion.com/documentation/api/pdfviewer/annotation/#addannotation) method. -Here's an example of how you can use the **addAnnotation()** method to apply highlighting programmatically: +Example: ```html @@ -78,7 +77,7 @@ Here's an example of how you can use the **addAnnotation()** method to apply hig var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -120,21 +119,22 @@ if (highlight) { {% endhighlight %} {% endtabs %} -## Underline a text +## Underline text -There are two ways to underline a text in the PDF document: +There are two ways to underline text: 1. Using the context menu - * Select a text in the PDF document and right-click it. - * Select **Underline** option in the context menu that appears. +* Select text in the PDF document and right-click it. +* Select **Underline** in the context menu. ![Alt text](../images/underline_context.png) + 2. Using the annotation toolbar - * Click the **Edit Annotation** button in the PDF Viewer toolbar. A toolbar appears below it. - * Select the **Underline** button in the annotation toolbar. It enables the underline mode. - * Select the text and the underline annotation will be added. - * You can also select the text and apply the underline annotation using the **Underline** button. +* Click the **Edit Annotation** button in the PDF Viewer toolbar to open the annotation toolbar. +* Select **Underline** to enable underline mode. +* Select text to add the underline annotation. +* Alternatively, select text first and then click **Underline**. ![Alt text](../images/underline_button.png) @@ -169,11 +169,11 @@ Add the below `serviceUrl` in the `index.html` file {% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es5/es5-text-markup-annotation/underline-normal-mode-cs1/index.html" %} -## Underline a text programmatically +## Underline text programmatically -The PDF Viewer library enables you to programmatically Underline text within the PDF Viewer control using the [**addAnnotation()**](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotation/#addannotation) method. +Programmatically add underlines using the [addAnnotation](https://ej2.syncfusion.com/documentation/api/pdfviewer/annotation/#addannotation) method. -Here's an example of how you can use the **addAnnotation()** method to apply Underline programmatically: +Example: ```html @@ -183,7 +183,7 @@ Here's an example of how you can use the **addAnnotation()** method to apply Und var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -226,21 +226,22 @@ if (underline) { {% endhighlight %} {% endtabs %} -## Strikethrough a text +## Strikethrough text -There are two ways to strikethrough a text in the PDF document: +There are two ways to strikethrough text: 1. Using the context menu - * Select a text in the PDF document and right-click it. - * Select **Strikethrough** option in the context menu that appears. +* Select text in the PDF document and right-click it. +* Select **Strikethrough** in the context menu. ![Alt text](../images/strikethrough_context.png) + 2. Using the annotation toolbar - * Click the **Edit Annotation** button in the PDF Viewer toolbar. A toolbar appears below it. - * Select the **Strikethrough** button in the annotation toolbar. It enables the strikethrough mode. - * Select the text and the strikethrough annotation will be added. - * You can also select the text and apply the strikethrough annotation using the **Strikethrough** button. +* Click the **Edit Annotation** button in the PDF Viewer toolbar to open the annotation toolbar. +* Select **Strikethrough** to enable strikethrough mode. +* Select text to add the strikethrough annotation. +* Alternatively, select text first and then click **Strikethrough**. ![Alt text](../images/strikethrough_button.png) @@ -260,7 +261,7 @@ Add the below `serviceUrl` in the `index.html` file {% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es5/es5-text-markup-annotation/strikethrough-mode-cs1/index.html" %} -Refer to the following code snippet to switch back to normal mode from underline mode. +Refer to the following code snippet to switch back to normal mode from strikethrough mode. {% tabs %} {% highlight html tabtitle="index.html" %} @@ -274,11 +275,11 @@ Add the below `serviceUrl` in the `index.html` file {% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es5/es5-text-markup-annotation/strikethrough-normal-mode-cs1/index.html" %} -## Strikethrough a text programmatically +## Strikethrough text programmatically -The PDF Viewer library enables you to programmatically Strikethrough text within the PDF Viewer control using the [**addAnnotation()**](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotation/#addannotation) method. +Programmatically add strikethrough using the [addAnnotation](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotation/#addannotation) method. -Here's an example of how you can use the **addAnnotation()** method to apply Strikethrough programmatically: +Example: ```html @@ -288,7 +289,7 @@ Here's an example of how you can use the **addAnnotation()** method to apply Str var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -330,21 +331,21 @@ if (strikethrough) { {% endhighlight %} {% endtabs %} -## Squiggly a text +## Add squiggly to text -There are two ways to add squiggly to a text in the PDF document: +There are two ways to add squiggly to text: 1. Using the context menu - * Select a text in the PDF document and right-click it. - * Select **Squiggly** option in the context menu that appears. +* Select text in the PDF document and right-click it. +* Select **Squiggly** in the context menu. ![Alt text](../images/squiggly_context.png) 2. Using the annotation toolbar - * Click the **Edit Annotation** button in the PDF Viewer toolbar. A toolbar appears below it. - * Select the **Squiggly** button in the annotation toolbar. It enables the squiggly mode. - * Select the text and the squiggly annotation will be added. - * You can also select the text and apply the squiggly annotation using the **Squiggly** button. +* Click the **Edit Annotation** button in the PDF Viewer toolbar to open the annotation toolbar. +* Select **Squiggly** to enable squiggly mode. +* Select text to add the squiggly annotation. +* Alternatively, select text first and then click **Squiggly**. ![Alt text](../images/squiggly_button.png) @@ -378,11 +379,11 @@ Add the below `serviceUrl` in the `index.html` file {% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es5/es5-text-markup-annotation/squiggly-normal-mode-cs1/index.html" %} -## Squiggly a text programmatically +## Add squiggly to text programmatically -The PDF Viewer library enables you to programmatically add squiggly to text within the PDF Viewer control using the [**addAnnotation()**](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotation/#addannotation) method. +Programmatically add squiggly using the [addAnnotation](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotation/#addannotation) method. -Here's an example of how you can use the **addAnnotation()** method to apply squiggly programmatically: +Example: ```html @@ -393,7 +394,7 @@ Here's an example of how you can use the **addAnnotation()** method to apply squ var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/30.1.37/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -437,39 +438,39 @@ if (squiggly) { ## Deleting a text markup annotation -The selected annotation can be deleted by the following ways: +The selected annotation can be deleted in the following ways: -1. Using Delete key - * Select the annotation to be deleted. - * Click the Delete key in the keyboard. The selected annotation will be deleted. +1. Using the Delete/Backspace key + * Select the annotation. + * Press Delete (or Backspace). The selected annotation is removed. 2. Using the annotation toolbar - * Select the annotation to be deleted. - * Click the **Delete Annotation** button in the annotation toolbar. The selected annotation will be deleted. + * Select the annotation. + * Click **Delete Annotation** in the annotation toolbar. The selected annotation is removed. ![Alt text](../images/delete_button.png) -## Editing the properties of the text markup annotation +## Edit text markup annotation properties The color and the opacity of the text markup annotation can be edited using the Edit Color tool and the Edit Opacity tool in the annotation toolbar. -### Editing color +### Edit color -The color of the annotation can be edited using the color palette provided in the Edit Color tool. +Use the color palette in the Edit Color tool to change the annotation color. ![Alt text](../images/edit_color.png) -### Editing opacity +### Edit opacity -The opacity of the annotation can be edited using the range slider provided in the Edit Opacity tool. +Use the range slider in the Edit Opacity tool to change annotation opacity. ![Alt text](../images/edit_opacity.png) -## Setting default properties during control initialization +## Set default properties during control initialization -The properties of the text markup annotation can be set before creating the control using highlightSettings, underlineSettings, strikethroughSettings and squigglySettings. +Set default properties before creating the control using `highlightSettings`, `underlineSettings`, `strikethroughSettings`, and `squigglySettings`. ->After editing the default color and opacity using the Edit Color tool and Edit Opacity tool, they will be changed to the selected values. +> After editing default color and opacity using the Edit Color and Edit Opacity tools, the values update to the selected settings. Refer to the following code snippet to set the default annotation settings. @@ -503,22 +504,22 @@ pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} -## Performing undo and redo +## Perform undo and redo -The PDF Viewer performs undo and redo for the changes made in the PDF document. In text markup annotation, undo and redo actions are provided for: +The PDF Viewer supports undo and redo for changes. For text markup annotations, undo and redo are provided for: * Inclusion of the text markup annotations. * Deletion of the text markup annotations. * Change of either color or opacity of the text markup annotations. -Undo and redo actions can be done by the following ways: +Undo and redo actions can be performed in the following ways: 1. Using keyboard shortcuts: - After performing a text markup annotation action, you can undo it by using Ctrl + Z shortcut and redo by using Ctrl + Y shortcut. -2. Using toolbar: - Undo and redo can be done using the **Undo** tool and **Redo** tool provided in the toolbar. + After performing a text markup annotation action, press Ctrl+Z to undo and Ctrl+Y to redo. +2. Using the toolbar: + Use the **Undo** and **Redo** tools in the toolbar. -Refer to the following code snippet for calling undo and redo actions from the client-side. +Refer to the following code snippet to call undo and redo actions from the client side. {% tabs %} {% highlight html tabtitle="index.html" %} @@ -526,19 +527,23 @@ Refer to the following code snippet for calling undo and redo actions from the c {% endhighlight %} {% endtabs %} +N> To set up the **server-backed PDF Viewer**, +Add the below `serviceUrl` in the `index.html` file +`serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer'` + {% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es5/es5-text-markup-annotation/undo-redo-cs1/index.html" %} -## Saving the text markup annotation +## Save text markup annotations -When you click the download tool in the toolbar, the text markup annotations will be saved in the PDF document. This action will not affect the original document. +Click the download tool in the toolbar to save text markup annotations to the PDF document. The original document is not modified. -## Printing the text markup annotation +## Print text markup annotations -When the print tool is selected in the toolbar, the PDF document will be printed along with the text markup annotations added to the pages. This action will not affect the original document. +Click the print tool in the toolbar to print the PDF document with text markup annotations. The original document is not modified. -## Disabling text markup annotation +## Disable text markup annotation -The PDF Viewer control provides an option to disable the text markup annotation feature. The code snippet for disabling the feature is as follows. +Disable text markup annotations using the `enableTextMarkupAnnotation` property. {% tabs %} {% highlight js tabtitle="Standalone" %} @@ -567,4 +572,4 @@ pdfviewer.appendTo('#PdfViewer'); ## See also * [Toolbar items](../toolbar) -* [Feature Modules](../feature-module) +* [Feature modules](../feature-module) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/download.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/download.md index 6190aa153..4817bb014 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/download.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/download.md @@ -1,14 +1,13 @@ --- layout: post -title: Download in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Download in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Download in Javascript PDF Viewer control | Syncfusion +description: Learn here all about Download in Syncfusion Javascript PDF Viewer control of Syncfusion Essential JS 2 and more. platform: document-processing -control: Download -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Download in Javascript Pdfviewer control +# Download in JavaScript PDF Viewer control The PDF Viewer supports downloading the loaded PDF file. You can enable/disable the download using the following code snippet. @@ -104,7 +103,7 @@ document.getElementById('download').addEventListener('click', function () { The [downloadEnd](https://ej2.syncfusion.com/documentation/api/pdfviewer/#downloadend) event of the PDF viewer allows you to get the downloaded document as a base64 string. -The following code illustrates how to get the invoke the download action in a button click to get the downloaded document as a base64 string. And load the document from base64 string in another button click. +The following code illustrates how to get the downloaded document as a base64 string. ``` diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/ej1-api-migration.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/ej1-api-migration.md index fa866472f..b9f3cb221 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/ej1-api-migration.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/ej1-api-migration.md @@ -1,15 +1,14 @@ --- layout: post -title: Ej1 api migration in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Ej1 api migration in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: EJ1 API migration in Javascript PDF Viewer control | Syncfusion +description: Learn here all about EJ1 API migration in Syncfusion Javascript PDF Viewer control of Syncfusion Essential JS 2 and more. platform: document-processing -control: Ej1 api migration -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Ej1 api migration in Javascript Pdfviewer control +# EJ1 API migration in Javascript PDF Viewer control This article describes API migration process of PDF Viewer component from Essential JS 1 to Essential JS 2. @@ -32,7 +31,7 @@ This article describes API migration process of PDF Viewer component from Essent | Specifies the viewer interaction mode | **Property**: *interactionMode*
    `$("#viewer").ejPdfViewer({ serviceUrl: '../api/PdfViewer', interactionMode: ej.PdfViewer.InteractionMode.Pan})` | **Property**: *interactionMode*
    `var pdfviewer = new ej.pdfviewer.PdfViewer({serviceUrl:'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer',interactionMode:"Pan"});ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch,ej.pdfviewer.Navigation,ej.pdfviewer.Print);pdfviewer.appendTo('#PdfViewer');`| | Gets the current zoom percentage of the PDF document in viewer | **Property**: *zoomPercentage*
    `var pdfviewerObj = $("#viewer").data("ejPdfViewer");var zoomPercentage = pdfviewerObj.zoomPercentage;` | **Property**: *zoomPercentage*
    `var pdfviewerObj = document.getElementById("PdfViewer").ej2_instances[0]; var zoomPercentage = pdfviewerObj.zoomPercentage;`| | Specifies the name of the action method in the server | **Property**: *serverActionSettings*
    `$("#viewer").ejPdfViewer ({ServiceUrl:'../api/PdfViewer', serverActionSettings: { load: "Load", fileUpload: "FileUpload", print: "Print", download: "Download" } });});` | **Property**: *serverActionSettings*
    `var pdfviewer = new ej.pdfviewer.PdfViewer({serviceUrl:'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer',serverActionSettings: {load:'Upload', renderPages:'RenderPdfPages', renderComments:'RenderAnnotationComments', renderThumbnail:'RenderThumbnailImages' , unload:'Unload', print:'PrintImages', download:'Donwload' },});ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch,ej.pdfviewer.Navigation,ej.pdfviewer.Print);pdfviewer.appendTo('#PdfViewer');`| -| Defines the settings of the PdfViewer toolbar | **Property**: *toolbarSettings*
    `$("#viewer").ejPdfViewer({ serviceUrl: '../api/PdfViewer', toolbarSettings: { showTooltip: false } });` | **Property**: *toolbarSettings*
    `var pdfviewer = new ej.pdfviewer.PdfViewer({serviceUrl:'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer', toolbarSettings: { showTooltip : true, toolbarItem: ['OpenOption']}});ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch,ej.pdfviewer.Navigation,ej.pdfviewer.Print);pdfviewer.appendTo('#PdfViewer');`| +| Defines the settings of the PDF Viewer toolbar | **Property**: *toolbarSettings*
    `$("#viewer").ejPdfViewer({ serviceUrl: '../api/PdfViewer', toolbarSettings: { showTooltip: false } });` | **Property**: *toolbarSettings*
    `var pdfviewer = new ej.pdfviewer.PdfViewer({serviceUrl:'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer', toolbarSettings: { showTooltip : true, toolbarItem: ['OpenOption']}});ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch,ej.pdfviewer.Navigation,ej.pdfviewer.Print);pdfviewer.appendTo('#PdfViewer');`| | Gets/sets the settings of the highlight annotation | **Property**: *highlightSettings*
    `$("#viewer").ejPdfViewer({ serviceUrl: '../api/PdfViewer', highlightSettings: {color: "#ffff00", author: "Guest", opacity: 0.5, subject: "highlight", modifiedDate: "2017-03-27 12:00:51", isLocked: true} });` | **Property**: *highlightSettings*
    `var pdfviewer = new ej.pdfviewer.PdfViewer({serviceUrl:'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer', highlightSettings: {author: 'Guest User', subject: 'Important', color: '#ffff00', opacity: 0.9, modifiedDate: ''},});ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch,ej.pdfviewer.Navigation,ej.pdfviewer.Print);pdfviewer.appendTo('#PdfViewer');`| | Gets/sets the settings of the underline annotation | **Property**: *underlineSettings*
    `$("#viewer").ejPdfViewer({ serviceUrl: '../api/PdfViewer', underlineSettings: {color: "#ffff00", author: "Guest", opacity: 0.5, subject: "highlight", modifiedDate: "2017-03-27 12:00:51", isLocked: true} });` | **Property**: *underlineSettings*
    `var pdfviewer = new ej.pdfviewer.PdfViewer({serviceUrl:'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer', underlineSettings: {author: 'Guest User', subject: 'Important', color: '#ffff00', opacity: 0.9, modifiedDate: ''},});ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch,ej.pdfviewer.Navigation,ej.pdfviewer.Print);pdfviewer.appendTo('#PdfViewer');`| | Gets/sets the settings of the strikethrough annotation | **Property**: *strikethroughSettings*
    `$("#viewer").ejPdfViewer({ serviceUrl: '../api/PdfViewer', strikethroughSettings: {color: "#ffff00", author: "Guest", opacity: 0.5, subject: "highlight", modifiedDate: "2017-03-27 12:00:51", isLocked: true} });` | **Property**: *strikethroughSettings*
    `var pdfviewer = new ej.pdfviewer.PdfViewer({serviceUrl:'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer', strikethroughSettings: {author: 'Guest User', subject: 'Important', color: '#ffff00', opacity: 0.9, modifiedDate: ''},});ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch,ej.pdfviewer.Navigation,ej.pdfviewer.Print);pdfviewer.appendTo('#PdfViewer');`| diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/event.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/event.md new file mode 100644 index 000000000..873f0ab95 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/event.md @@ -0,0 +1,1298 @@ +--- +layout: post +title: Events in JavaScript PDF Viewer | Syncfusion +description: Comprehensive list of events in the Syncfusion JavaScript PDF Viewer with descriptions, event arguments, and usage examples to integrate custom logic. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Events in JavaScript PDF Viewer + +The PDF Viewer component triggers events for creation, page navigation, document life cycle, context menu interactions, comments, bookmarks, download and export, hyperlinks, annotation import/export, custom keyboard commands, printing, signatures, text search, and text selection. Use these events to integrate custom logic into application workflows. + +The following table lists commonly used events supported by the PDF Viewer component: + +| Event | Description | +| ----- | ----------- | +| [`bookmarkClick`](#bookmarkclick) | Triggers when a bookmark item is clicked in the bookmark panel. | +| [`buttonFieldClick`](#buttonfieldclick) | Triggers when a button form field is clicked. | +| [`commentAdd`](#commentadd) | Triggers when a comment is added to the comment panel. | +| [`commentDelete`](#commentdelete) | Triggers when a comment is deleted from the comment panel. | +| [`commentEdit`](#commentedit) | Triggers when a comment is edited in the comment panel. | +| [`commentSelect`](#commentselect) | Triggers when a comment is selected in the comment panel. | +| [`commentStatusChanged`](#commentstatuschanged) | Triggers when a comment’s status changes in the comment panel. | +| [`created`](#created) | Triggers during the creation of the PDF Viewer component. | +| [`customContextMenuBeforeOpen`](#customcontextmenubeforeopen) | Fires before the custom context menu opens. | +| [`customContextMenuSelect`](#customcontextmenuselect) | Fires when a custom context menu item is selected. | +| [`documentLoad`](#documentload) | Triggers while loading a document into the PDF Viewer. | +| [`documentLoadFailed`](#documentloadfailed) | Triggers when document loading fails. | +| [`documentUnload`](#documentunload) | Triggers when the document is closed. | +| [`downloadEnd`](#downloadend) | Triggers after a document is downloaded. | +| [`downloadStart`](#downloadstart) | Triggers when the download action is initiated. | +| [`exportFailed`](#exportfailed) | Triggers when exporting annotations fails. | +| [`exportStart`](#exportstart) | Triggers when exporting annotations starts. | +| [`exportSuccess`](#exportsuccess) | Triggers when annotations are exported successfully. | +| [`extractTextCompleted`](#extracttextcompleted) | Triggers when text extraction is completed. | +| [`hyperlinkClick`](#hyperlinkclick) | Triggers when a hyperlink is clicked. | +| [`hyperlinkMouseOver`](#hyperlinkmouseover) | Triggers when hovering over a hyperlink. | +| [`importFailed`](#importfailed) | Triggers when importing annotations fails. | +| [`importStart`](#importstart) | Triggers when importing annotations starts. | +| [`importSuccess`](#importsuccess) | Triggers when annotations are imported successfully. | +| [`keyboardCustomCommands`](#keyboardcustomcommands) | Triggers when customized keyboard command keys are pressed. | +| [`moveSignature`](#movesignature) | Triggers when a signature is moved across the page. | +| [`pageChange`](#pagechange) | Triggers when the current page number changes. | +| [`pageClick`](#pageclick) | Triggers when a mouse click occurs on a page. | +| [`pageMouseover`](#pagemouseover) | Triggers when moving the mouse over a page. | +| [`pageOrganizerSaveAs`](#pageorganizersaveas) | Triggers when a `save as` action is performed in the page organizer. | +| [`pageRenderComplete`](#pagerendercomplete) | Triggers after a page finishes rendering. | +| [`pageRenderInitiate`](#pagerenderinitiate) | Triggers when page rendering begins. | +| [`printEnd`](#printend) | Triggers when a print action is completed. | +| [`printStart`](#printstart) | Triggers when a print action is initiated. | +| [`removeSignature`](#removesignature) | Triggers when a signature is removed. | +| [`resizeSignature`](#resizesignature) | Triggers when a signature is resized. | +| [`resourcesLoaded`](#resourcesloaded) | Triggers after PDFium resources are loaded. | +| [`signaturePropertiesChange`](#signaturepropertieschange) | Triggers when signature properties are changed. | +| [`signatureSelect`](#signatureselect) | Triggers when a signature is selected. | +| [`signatureUnselect`](#signatureunselect) | Triggers when a signature is unselected. | +| [`textSearchComplete`](#textsearchcomplete) | Triggers when a text search is completed. | +| [`textSearchHighlight`](#textsearchhighlight) | Triggers when the searched text is highlighted. | +| [`textSearchStart`](#textsearchstart) | Triggers when a text search is initiated. | +| [`textSelectionEnd`](#textselectionend) | Triggers when text selection is complete. | +| [`textSelectionStart`](#textselectionstart) | Triggers when text selection is initiated. | +| [`thumbnailClick`](#thumbnailclick) | Triggers when a thumbnail is clicked. | +| [`toolbarClick`](#toolbarclick) | Triggers when a toolbar item is clicked. | +| [`validateFormFields`](#validateformfields) | Triggers when form field validation fails. | +| [`zoomChange`](#zoomchange) | Triggers when the magnification value changes. | + +Note: For annotation and signature events, see the dedicated Annotations Events topic. + +## bookmarkClick + +The [bookmarkClick](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#bookmarkclickevent) event triggers when a bookmark item is clicked in the bookmark panel. + +- Event arguments: [BookmarkClickEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/bookmarkClickEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + bookmarkClick: function (args) { + console.log('Bookmark clicked: ' + args.name); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## toolbarClick + +The [toolbarClick](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#toolbarclickevent) event triggers when a toolbar item is clicked. Use it to handle actions based on the clicked item's id or name. + +- Event arguments: `ClickEventArgs`. + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + toolbarClick: function (args) { + console.log('Toolbar item clicked: ' + args.name); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## validateFormFields + +The [validateFormFields](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#validateformfieldsevent) event triggers when form field validation fails, typically before a download or submit action proceeds. Use this event to inspect which required fields are empty and show custom messages or block application logic if needed. + +- Event arguments: [ValidateFormFieldsArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/validateFormFieldsArgs/) + - name: Event name + - documentName: Current document name + - formField: The last interacted field’s data (if applicable) + - nonFillableFields: Array detailing required/invalid fields + +When it triggers +- Add a form field and mark it Required (UI: right‑click field > Properties > Required). +- Leave the field empty and click Download. The event fires and provides the list of fields that failed validation. + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/form-designer.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib' +}); + +viewer.enableFormFieldsValidation = true; +viewer.validateFormFields = function (args) { + console.log('form field event name: ' + args.name); + console.log('form field document name: ' + args.documentName); + console.log('form field data: ' + args.formField); + console.log('non fillable form field details: ', + args.nonFillableFields); +}; + +viewer.appendTo('#pdfViewer'); +``` + +Tip +- To require a field programmatically, set isRequired: true when creating or editing the field via Form Designer APIs. + +## zoomChange + +The [zoomChange](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#zoomchangeevent) event triggers when the magnification value changes. + +- Event arguments: [ZoomChangeEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/zoomChangeEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + zoomChange: function (args) { + console.log('Zoom changed to: ' + args.zoomValue + '%'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## buttonFieldClick + +The [buttonFieldClick](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#buttonfieldclickevent) event triggers when a button form field is clicked. + +- Event arguments: [ButtonFieldClickEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/buttonFieldClickEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + buttonFieldClick: function (args) { + console.log('Button field clicked. Name: ' + args.name); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## commentAdd + +The [commentAdd](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#commentaddevent) event triggers when a comment is added in the comment panel. + +- Event arguments: [CommentEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/commentEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + commentAdd: function (args) { + console.log('Comment added. Id: ' + args.id); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## commentDelete + +The [commentDelete](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#commentdeleteevent) event triggers when a comment is deleted in the comment panel. + +- Event arguments: [CommentEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/commentEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + commentDelete: function (args) { + console.log('Comment deleted. Id: ' + args.id); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## commentEdit + +The [commentEdit](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#commenteditevent) event triggers when a comment is edited in the comment panel. + +- Event arguments: [CommentEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/commentEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + commentEdit: function (args) { + console.log('Comment edited. Id: ' + args.id); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## commentSelect + +The [commentSelect](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#commentselectevent) event triggers when a comment is selected in the comment panel. + +- Event arguments: [CommentEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/commentEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + commentSelect: function (args) { + console.log('Comment selected. Id: ' + args.id ); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## commentStatusChanged + +The [commentStatusChanged](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#commentstatuschangedevent) event triggers when a comment status is changed in the comment panel. + +- Event arguments: [CommentEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/commentEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + commentStatusChanged: function (args) { + console.log('Comment status changed. Id: ' + args.id + ', Status: ' + args.status ); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## created + +The [created](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#createdevent) event is triggered during the creation of the PDF Viewer component. + +- Event arguments: `void`. + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + created: function (args) { + console.log('PDF Viewer created'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## customContextMenuBeforeOpen + +The [customContextMenuBeforeOpen](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#customcontextmenubeforeopenevent) event fires just before the context menu is shown. Use it to show or hide items based on the current state (for example, only show search items when text is selected). + +- Event arguments: [CustomContextMenuBeforeOpenEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/customContextMenuBeforeOpenEventArgs/) + - name: Event name + - ids: Array of menu item ids that will be shown; remove ids to hide items for this open + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + customContextMenuBeforeOpen: function (args) { + console.log('Before open context menu at page ' + args.name); + } +}); +var menuItems = [ + { + text: 'SEARCH_ON_WEB', + id: 'web_search', + iconCss: 'e-icons e-search', + items: [ + { + text: 'SEARCH_IN_GOOGLE_IMAGE', + id: 'web_search_images', + }, + { + text: 'SEARCH_IN_WIKIPEDIA', + id: 'web_search_wikipedia', + }, + { + text: 'SEARCH_IN_YOUTUBE', + id: 'web_search_youtube', + }, + { + text: 'SEARCH_GOOGLE', + id: 'web_search_google', + }, + ], + }, + { + id: 'web_search_separator', + separator: true, + }, +]; + + viewer.appendTo("#pdfViewer"); + viewer.documentLoad = function (args) { + viewer.addCustomMenu(menuItems, false, false); + }; +``` + +## customContextMenuSelect + +The [customContextMenuSelect](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#customcontextmenuselectevent) event fires when a custom menu item is clicked. Use it to branch logic by the clicked item's id. + +- Event arguments: [CustomContextMenuSelectEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/customContextMenuSelectEventArgs/). + +- name: Event name +- id: The id of the clicked menu item + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + customContextMenuSelect: function (args) { + console.log('Context menu item selected: ' + args.name); + } +}); +var menuItems = [ + { + text: 'SEARCH_ON_WEB', + id: 'web_search', + iconCss: 'e-icons e-search', + items: [ + { text: 'SEARCH_IN_GOOGLE_IMAGE', id: 'web_search_images' }, + { text: 'SEARCH_IN_WIKIPEDIA', id: 'web_search_wikipedia' }, + { text: 'SEARCH_IN_YOUTUBE', id: 'web_search_youtube' }, + { text: 'SEARCH_GOOGLE', id: 'web_search_google' } + ] + }, + { id: 'web_search_separator', separator: true } +]; + +viewer.appendTo('#pdfViewer'); +viewer.documentLoad = function (args) { + viewer.addCustomMenu(menuItems, false, false); +}; + +``` + +## documentLoad + +The [documentLoad](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#documentloadevent) event occurs after a document is successfully loaded and parsed. + +- Event arguments: [LoadEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/loadEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + textSelectionStart: function (args) { + console.log('Text selection started on page ' + args.pageIndex + '.'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## documentLoadFailed + +The [documentLoadFailed](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#documentloadfailedevent) event triggers when loading a document fails. + +- Event arguments: [LoadFailedEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/loadFailedEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/invalid.pdf' +}); +viewer.appendTo('#pdfViewer'); +viewer.documentLoadFailed = function (args) { + console.log('Load failed. Error: ' + args.documentName); +}; +``` + +## documentUnload + +The [documentUnload](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#documentunloadevent) event triggers when closing the current document. + +- Event arguments: [UnloadEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/unloadEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib' +}); +viewer.appendTo('#pdfViewer'); +viewer.documentUnload = function (args) { + console.log('Document unloaded'); +}; +``` + +## downloadEnd + +The [downloadEnd](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#downloadendevent) event triggers after a document download completes. + +- Event arguments: [DownloadEndEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/downloadEndEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + downloadEnd: function (args) { + console.log('Download finished. File name: ' + args.fileName); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## downloadStart + +The [downloadStart](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#downloadstartevent) event triggers when the download operation is initiated. + +- Event arguments: [DownloadStartEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/downloadStartEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + downloadStart: function (args) { + console.log('Download started'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## exportFailed + +The [exportFailed](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#exportfailedevent) event triggers when exporting annotations fails. + +- Event arguments: [ExportFailureEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/exportFailureEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + exportFailed: function (args) { + console.log('Export failed: ' + args.name); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## exportStart + +The [exportStart](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#exportstartevent) event triggers when exporting annotations starts. + +- Event arguments: [ExportStartEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/exportStartEventArgs/). + +Example: + +```javascript +// ES5 example: exportStart +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + exportStart: function (args) { + console.log('Export started'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## exportSuccess + +The [exportSuccess](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#exportsuccessevent) event triggers when annotations are exported successfully. + +- Event arguments: [ExportSuccessEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/exportSuccessEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + exportSuccess: function (args) { + console.log('Export success'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## extractTextCompleted + +The [extractTextCompleted](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#extracttextcompletedevent) event triggers when text extraction completes. + +- Event arguments: [ExtractTextCompletedEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/extractTextCompletedEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + extractTextCompleted: function (args) { + var text = (args.documentTextCollection || ''); + console.log('Extracted text length: ' + text.length); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## hyperlinkClick + +The [hyperlinkClick](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#hyperlinkclickevent) event triggers when a hyperlink is clicked. + +- Event arguments: [HyperlinkClickEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/hyperlinkClickEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + hyperlinkClick: function (args) { + console.log('Hyperlink clicked: ' + args.hyperlink); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## hyperlinkMouseOver + +The [hyperlinkMouseOver](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#hyperlinkmouseoverevent) event triggers when hovering over a hyperlink. + +- Event arguments: HyperlinkMouseOverArgs. + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + hyperlinkMouseOver: function (args) { + console.log('Hyperlink hover at page: ' + args.name); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## importFailed + +The [importFailed](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#importfailedevent) event triggers when importing annotations fails. + +- Event arguments: [ImportFailureEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/importFailureEventArgs/). + +Example: + +```javascript +// ES5 example: importFailed +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + importFailed: function (args) { + console.log('Import failed: ' + args.name); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## importStart + +The [importStart](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#importstartevent) event triggers when importing annotations starts. + +- Event arguments: [ImportStartEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/importStartEventArgs/). + +Example: + +```javascript +// ES5 example: importStart +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + importStart: function (args) { + console.log('Import started'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## importSuccess + +The [importSuccess](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#importsuccessevent) event triggers when annotations are imported successfully. + +- Event arguments: [ImportSuccessEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/importSuccessEventArgs/). + +Example: + +```javascript +// ES5 example: importSuccess +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + importSuccess: function (args) { + console.log('Import success'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## keyboardCustomCommands + +The [keyboardCustomCommands](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#keyboardcustomcommandsevent) event triggers when customized keyboard command keys are pressed. + +- Event arguments: [KeyboardCustomCommandsEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/keyboardCustomCommandsEventArgs/). + + - name: Event name + - keyboardCommand: The command metadata raised by Command Manager + +When it triggers +- After registering gestures in commandManager.keyboardCommand. For example, pressing Shift + Alt + G or Shift + Alt + H triggers the event. Use this to handle custom keyboard shortcuts. + +Refer to [Keyboard interaction](./accessibility#keyboard-interaction) for details about adding and handling custom shortcut keys. +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib' +}); +viewer.commandManager = { + keyboardCommand: [ + { name: 'customCopy', gesture: { pdfKeys: ej.pdfviewer.PdfKeys.G, modifierKeys: ej.pdfviewer.ModifierKeys.Shift | ej.pdfviewer.ModifierKeys.Alt } }, + { name: 'customPaste', gesture: { pdfKeys: ej.pdfviewer.PdfKeys.H, modifierKeys: ej.pdfviewer.ModifierKeys.Shift | ej.pdfviewer.ModifierKeys.Alt } }, + { name: 'customCut', gesture: { pdfKeys: ej.pdfviewer.PdfKeys.Z, modifierKeys: ej.pdfviewer.ModifierKeys.Control } }, + { name: 'customSelectAll', gesture: { pdfKeys: ej.pdfviewer.PdfKeys.E, modifierKeys: ej.pdfviewer.ModifierKeys.Control } } + ] +}; +viewer.appendTo('#pdfViewer'); +viewer.keyboardCustomCommands = function (args) { + console.log('Custom command triggered:', args); +}; +``` + +## moveSignature + +The [moveSignature](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#movesignatureevent) event triggers when a signature is moved across the page. + +- Event arguments: `MoveSignatureEventArgs`. + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + moveSignature: function (args) { + console.log('Signature moved on page ' + args.id); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## pageChange + +The [pageChange](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#pagechangeevent) event triggers when the current page number changes (for example, via scrolling or navigation controls). + +- Event arguments: [PageChangeEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/pageChangeEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + pageChange: function (args) { + console.log('Page changed from ' + args.previousPageNumber + ' to ' + args.currentPageNumber); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## pageClick + +The [pageClick](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#pageclickevent) event triggers when a mouse click occurs on a page. + +- Event arguments: [PageClickEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/pageClickEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + pageClick: function (args) { + console.log('Page ' + args.pageNumber + ' clicked at (' + args.x + ', ' + args.y + ')'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## pageMouseover + +The [pageMouseover](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#pagemouseoverevent) event triggers when the mouse moves over a page. + +- Event arguments: `PageMouseoverEventArgs`. + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + pageMouseover: function (args) { + console.log('Mouse over page ' + args.name); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## pageOrganizerSaveAs + +The [pageOrganizerSaveAs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#pageorganizersaveasevent) event triggers when a Save As action is performed in the page organizer. + +- Event arguments: `PageOrganizerSaveAsEventArgs`. + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + pageOrganizerSaveAs: function (args) { + console.log('Page organizer save triggered. File name: ' + args.downloadDocument); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## pageRenderComplete + +The [pageRenderComplete](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#pagerendercompleteevent) event triggers after a page finishes rendering. + +- Event arguments: [PageRenderCompleteEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/pageRenderCompleteEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + pageRenderComplete: function (args) { + console.log('Page ' + args.data + ' rendering completed.'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## pageRenderInitiate + +The [pageRenderInitiate](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#pagerenderinitiateevent) event triggers when page rendering begins. + +- Event arguments: [PageRenderInitiateEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/pageRenderInitiateEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + pageRenderInitiate: function (args) { + console.log('Page ' + args.jsonData + ' rendering initiated.'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## printEnd + +The [printEnd](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#printendevent) event triggers when a print action completes. + +- Event arguments: [PrintEndEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/printEndEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + printEnd: function (args) { + console.log('Print action completed.'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## printStart + +The [printStart](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#printstartevent) event triggers when a print action is initiated. + +- Event arguments: [PrintStartEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/printStartEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + printStart: function () { + console.log('Print action initiated.'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## removeSignature + +The [removeSignature](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#removesignatureevent) event triggers when a signature is removed. + +- Event arguments: [RemoveSignatureEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/removeSignatureEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + removeSignature: function (args) { + console.log('Signature removed from page ' + args.bounds); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## resizeSignature + +The [resizeSignature](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#resizesignatureevent) event triggers when a signature is resized. + +- Event arguments: [ResizeSignatureEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/resizeSignatureEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + resizeSignature: function (args) { + console.log('Signature resized on page ' + args.currentPosition ); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## resourcesLoaded + +The [resourcesLoaded](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#resourcesloadedevent) event triggers after the viewer's required resources are loaded. + +- Event arguments: `void`. + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + resourcesLoaded: function (args) { + console.log('PDFium resources loaded.'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## signaturePropertiesChange + +The [signaturePropertiesChange](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#signaturepropertieschangeevent) event triggers when signature properties change. + +- Event arguments: [SignaturePropertiesChangeEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/signaturePropertiesChangeEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + signaturePropertiesChange: function (args) { + console.log('Signature properties changed on page ' + args.type ); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## signatureSelect + +The [signatureSelect](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#signatureselectevent) event triggers when a signature is selected. + +- Event arguments: [SignatureSelectEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/signatureSelectEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + signatureSelect: function (args) { + console.log('Signature selected on page ' + args.signature ); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## signatureUnselect + +The [signatureUnselect](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#signatureunselectevent) event triggers when a signature is unselected. + +- Event arguments: [SignatureUnselectEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/signatureUnselectEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + signatureUnselect: function (args) { + console.log('Signature unselected ' + args.signature ); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## textSearchComplete + +The [textSearchComplete](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#textsearchcompleteevent) event triggers when a text search completes. + +- Event arguments: [TextSearchCompleteEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/textSearchCompleteEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + textSearchComplete: function (args) { + console.log('Text search completed.'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## textSearchHighlight + +The [textSearchHighlight](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#textsearchhighlightevent) event triggers when searched text is highlighted. + +- Event arguments: [TextSearchHighlightEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/textSearchHighlightEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + textSearchHighlight: function (args) { + console.log('Search result ' + args.bounds + ' highlighted.'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## textSearchStart + +The [textSearchStart](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#textsearchstartevent) event triggers when a text search is initiated. + +- Event arguments: [TextSearchStartEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/textSearchStartEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + textSearchStart: function (args) { + console.log('Text search started for: "' + args.searchText + '"'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## textSelectionEnd + +The [textSelectionEnd](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#textselectionendevent) event triggers when text selection is complete. + +- Event arguments: [TextSelectionEndEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/textSelectionEndEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + textSelectionEnd: function (args) { + console.log('Text selection ended on page ' + args.pageIndex ); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## textSelectionStart + +The [textSelectionStart](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#textselectionstartevent) event triggers when text selection is initiated. + +- Event arguments: `TextSelectionStartEventArgs`. + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + textSelectionStart: function (args) { + console.log('Text selection started on page ' + args.pageIndex); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## thumbnailClick + +The [thumbnailClick](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#thumbnailclickevent) event triggers when a thumbnail is clicked. + +- Event arguments: [ThumbnailClickEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/thumbnailClickEventArgs/). + +Example: + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + thumbnailClick: function (args) { + console.log('Thumbnail clicked for page index ' + args.pageNumber + '.'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +> Tip: For annotation and signature-specific events and arguments, see the dedicated Annotations Events topic. + +## See also + +- [Annotation events](./annotations/annotation-event) +- [Form field events](./form-designer/form-field-events) +- [Organize PDF events](./organize-pdf/organize-pdf-events) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/feature-module.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/feature-module.md index 50db04aea..f4d465f5f 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/feature-module.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/feature-module.md @@ -1,32 +1,31 @@ --- layout: post -title: Feature module in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Feature module in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Feature module in JavaScript PDF Viewer Control | Syncfusion +description: Learn here all about Feature module in Syncfusion Essential JavaScript PDF Viewer control, its elements and more. platform: document-processing -control: Feature module -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Feature module in Javascript Pdfviewer control +# Feature module in JavaScript PDF Viewer Control The PDF Viewer features are segregated into individual feature-wise modules to enable selectively referencing in the application. The required modules should be injected to extend its functionality. The following are the selective modules of PDF Viewer that can be included as required: -The available PdfViewer modules are: - -* **Toolbar**:- Built-in toolbar for better user interaction. -* **Magnification**:- Perform zooming operation for better viewing experience. -* **Navigation**:- Easy navigation across the PDF pages. -* **LinkAnnotation**:- Easy navigation within and outside of the PDF document. -* **ThumbnailView**:- Easy navigation with in the PDF document. -* **BookmarkView**:- Easy navigation based on the bookmark content of the PDF document. -* **TextSelection**:- Select and copy text from a PDF file. -* **TextSearch**:- Search a text easily across the PDF document. -* **Print**:- Print the entire document or a specific page directly from the browser. -* **Annotation**:- Annotations can be added or edited in the PDF document. -* **FormFields**:- Preserve the form fields in the PDF document. -* **FormDesigner**:- Form fields can be added or edited in the PDF document. +The available PDF Viewer modules are: + +* [**Toolbar**](./toolbar-customization):- Built-in toolbar for better user interaction. +* [**Magnification**](./magnification):- Perform zooming operation for better viewing experience. +* [**Navigation**](./interactive-pdf-navigation/page-navigation):- Easy navigation across the PDF pages. +* [**LinkAnnotation**](./interactive-pdf-navigation/table-of-content-navigation):- Easy navigation within and outside of the PDF document. +* [**ThumbnailView**](./interactive-pdf-navigation/page-thumbnail-navigation):- Easy navigation with in the PDF document. +* [**BookmarkView**](./interactive-pdf-navigation/bookmark-navigation):- Easy navigation based on the bookmark content of the PDF document. +* [**TextSelection**](./textselection):- Select and copy text from a PDF file. +* [**TextSearch**](./text-search):- Search a text easily across the PDF document. +* [**Print**](./print):- Print the entire document or a specific page directly from the browser. +* [**Annotation**](./annotations/text-markup-annotation):- Annotations can be added or edited in the PDF document. +* [**FormFields**](./form-designer/create-programmatically):- Preserve the form fields in the PDF document. +* [**FormDesigner**](./form-designer/create-programmatically):- Form fields can be added or edited in the PDF document. >In addition to injecting the required modules in your application, enable corresponding properties to extend the functionality for a PDF Viewer instance. Refer to the following table. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/form-designer/create-programmatically.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/form-designer/create-programmatically.md index d0a9fc88d..3a73f2b88 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/form-designer/create-programmatically.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/form-designer/create-programmatically.md @@ -1,30 +1,29 @@ --- layout: post -title: Create programmatically in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Create programmatically in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Create form fields in the JavaScript PDF Viewer component | Syncfusion +description: Learn how to add, update, delete, save, print, validate, and import/export form fields in the Syncfusion JavaScript PDF Viewer component. platform: document-processing -control: Create programmatically -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Create programmatically in Javascript Pdfviewer control +# Create programmatically in JavaScript PDF Viewer control -The PDF Viewer control provides the option to add, edit and delete the Form Fields. The Form Fields type supported by the PDF Viewer Control are: +The PDF Viewer component provides options to add, edit, and delete form fields. The supported form field types are: - * Textbox - * Password - * CheckBox - * RadioButton - * ListBox - * DropDown - * SignatureField - * InitialField +- Textbox +- Password +- CheckBox +- RadioButton +- ListBox +- DropDown +- Signature field +- Initial field ## Add a form field to PDF document programmatically -Using addFormField method, the form fields can be added to the PDF document programmatically. We need to pass two parameters in this method. They are Form Field Type and Properties of Form Field Type. To add form field programmatically, Use the following code. +Use the addFormField method to add form fields programmatically. Pass the form field type and the corresponding property object as parameters. The following example demonstrates adding multiple fields on document load. {% tabs %} {% highlight js tabtitle="index.js" %} @@ -35,15 +34,14 @@ Using addFormField method, the form fields can be added to the PDF document prog {% endhighlight %} {% endtabs %} -N> To set up the **server-backed PDF Viewer**, -Add the below `serviceUrl` in the `index.html` file +N> To configure the server-backed PDF Viewer, add the following `serviceUrl` in the `index.html` file: `serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer'` {% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es5/addformfield-cs1/index.html" %} ## Edit/Update form field programmatically -Using updateFormField method, Form Field can be updated programmatically. We should get the Form Field object/Id from FormFieldCollections property that you would like to edit and pass it as a parameter to updateFormField method. The second parameter should be the properties that you would like to update for Form Field programmatically. We have updated the value and background Color properties of Textbox Form Field. +Use the updateFormField method to modify a form field programmatically. Retrieve the target field from the formFieldCollections property (by object or ID) and pass it as the first parameter. Provide the properties to update as the second parameter. The following example updates the background color of a Textbox field. {% tabs %} {% highlight js tabtitle="index.js" %} @@ -54,15 +52,14 @@ Using updateFormField method, Form Field can be updated programmatically. We sho {% endhighlight %} {% endtabs %} -N> To set up the **server-backed PDF Viewer**, -Add the below `serviceUrl` in the `index.html` file +N> To configure the server-backed PDF Viewer, add the following `serviceUrl` in the `index.html` file: `serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer'` {% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es5/updateformfield-cs1/index.html" %} ## Delete form field programmatically -Using deleteFormField method, the form field can be deleted programmatically. We should retrieve the Form Field object/Id from FormFieldCollections property that you would like to delete and pass it as a parameter to deleteFormField method. To delete a Form Field programmatically, use the following code. +Use the deleteFormField method to remove a form field programmatically. Retrieve the target field from the formFieldCollections property (by object or ID) and pass it to deleteFormField. The following example deletes the first form field. {% tabs %} {% highlight js tabtitle="index.js" %} @@ -73,19 +70,18 @@ Using deleteFormField method, the form field can be deleted programmatically. We {% endhighlight %} {% endtabs %} -N> To set up the **server-backed PDF Viewer**, -Add the below `serviceUrl` in the `index.html` file +N> To configure the server-backed PDF Viewer, add the following `serviceUrl` in the `index.html` file: `serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer'` {% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es5/deleteformfield-cs1/index.html" %} ## Saving the form fields -When the download icon is selected on the toolbar, the Form Fields will be saved in the PDF document and this action will not affect the original document. Refer the below GIF for further reference. +Selecting the Download icon on the toolbar saves the form fields in the exported PDF without modifying the original document. See the following GIF for reference. -![Alt text](../images/saveformfield.gif) +![Save form fields from the PDF Viewer](../images/saveformfield.gif) -You can invoke download action using following code snippet. +You can invoke the download action using the following code snippet. ``` @@ -127,11 +123,11 @@ document.getElementById('download').addEventListener('click', function () { ## Printing the form fields -When the print icon is selected on the toolbar, the PDF document will be printed along with the Form Fields added to the pages and this action will not affect the original document. Refer the below GIF for further reference. +Selecting the Print icon on the toolbar prints the PDF with the added form fields. This action does not modify the original document. See the following GIF for reference. -![Alt text](../images/printformfield.gif) +![Print the PDF with form fields](../images/printformfield.gif) -You can invoke print action using the following code snippet., +You can invoke the print action using the following code snippet: ``` @@ -173,7 +169,7 @@ document.getElementById('print').addEventListener('click', function () { ## setFormFieldMode programmatically -The **setFormFieldMode** method is a function in the Syncfusion PDF Viewer library that allows you to add a form field dynamically by passing the type of the form field. You can pass the form fields as a parameter like below. +The setFormFieldMode method enables adding a form field dynamically by specifying the field type. For example, the following adds a Password field when a button is clicked. ``` @@ -211,16 +207,15 @@ document.getElementById('addPasswordField').addEventListener('click', function ( ## Open the existing PDF document -We can open the already saved PDF document contains Form Fields in it by clicking the open icon in the toolbar. Refer the below GIF for further reference. +Open a PDF that already contains form fields by clicking the Open icon on the toolbar. See the following GIF for reference. -![Alt text](../images/openexistingpdf.gif) +![Open a PDF with existing form fields](../images/openexistingpdf.gif) ## Validate form fields -The form fields in the PDF Document will be validated when the `enableFormFieldsValidation` is set to true and hook the validateFormFields. The validateFormFields will be triggered when the PDF document is downloaded or printed with the non-filled form fields. The non-filled fields will be obtained in the `nonFillableFields` property of the event arguments of validateFormFields. - -Add the following code snippet to validate the form fields, +Form fields are validated when `enableFormFieldsValidation` is set to true and the validateFormFields event is handled. The event triggers during download or print if required fields are not filled. The non-filled fields are available in the `nonFillableFields` property of the event arguments. +Add the following code to validate form fields: {% tabs %} {% highlight js tabtitle="Standalone" %} @@ -255,11 +250,11 @@ viewer.validateFormFields = function (args) { ## Export and import form fields -The PDF Viewer control provides the support to export and import the form field data in the following formats using the `importFormFields`, `exportFormFields`, and `exportFormFieldsAsObject` methods. +The PDF Viewer component supports exporting and importing form field data using the `importFormFields`, `exportFormFields`, and `exportFormFieldsAsObject` methods in the following formats: -* FDF -* XFDF -* JSON +- FDF +- XFDF +- JSON ### Export and import as FDF @@ -268,7 +263,7 @@ Using the `exportFormFields` method, the form field data can be exported in the * The first one must be the destination path for the exported data. If the path is not specified, it will ask for the location while exporting. * The second parameter should be the format type of the form data. -The following code explains how to export the form field data as FDF. +The following example exports and imports form field data as FDF. ```javascript @@ -293,7 +288,7 @@ document.getElementById('importFdf').addEventListener('click', ()=> { ### Export and import as XFDF -The following code explains how to export the form field data as XFDF. +The following example exports and imports form field data as XFDF. ```javascript @@ -316,7 +311,7 @@ document.getElementById('importXfdf').addEventListener('click', ()=> { ### Export and import as JSON -The following code explains how to export the form field data as JSON. +The following example exports and imports form field data as JSON. ```javascript @@ -340,7 +335,7 @@ document.getElementById('importJson').addEventListener('click', ()=> { ### Export and import as Object -The PDF Viewer control supports exporting the form field data as an object, and the exported data will be imported into the current PDF document from the object. +The PDF Viewer component supports exporting the form field data as an object and importing that data back into the current PDF document. The following code shows how to export the form field data as an object and import the form field data from that object into the current PDF document via a button click. @@ -385,20 +380,20 @@ document.getElementById('importData').addEventListener('click', ()=> { ``` ## Form field properties -Form field properties in Syncfusion PDF Viewer allow you to customize and interact with form fields embedded within PDF documents. This documentation provides an overview of the form field properties supported by the Syncfusion PDF Viewer and explains how to use them effectively. +Form field properties allow customization and interaction with fields embedded in PDF documents. The following sections outline the supported field types and their configurable settings. - * Textbox - * Password - * CheckBox - * RadioButton - * ListBox - * DropDown - * SignatureField - * InitialField +- Textbox +- Password +- CheckBox +- RadioButton +- ListBox +- DropDown +- Signature field +- Initial field ### Signature and initial fields settings -Using the `updateFormField` method, the form fields can be updated programmatically. +Use the `updateFormField` method to modify form fields programmatically. The following code example explains how to update the signature field properties on a button click. @@ -424,7 +419,7 @@ document.getElementById('updateProperties').addEventListener('click',function() ``` -The following code example explains how to update the properties of the signature field added to the document from the form designer toolbar. +The following code shows how to configure default properties for a signature field added from the Form Designer toolbar. {% tabs %} {% highlight js tabtitle="Standalone" %} @@ -607,7 +602,7 @@ pdfviewer.initialFieldSettings = { Using the `updateFormField` method, the form fields can be updated programmatically. -The following code example explains how to update the Textbox field properties on a button click. +The following example updates Textbox field properties on a button click. ```html @@ -643,7 +638,7 @@ document.getElementById('updateProperties').addEventListener('click',function() ``` -The following code example explains how to update the properties of the Textbox field added to the document from the form designer toolbar. +The following code shows how to configure default properties for a Textbox field added from the Form Designer toolbar. {% tabs %} @@ -749,7 +744,7 @@ pdfviewer.textFieldSettings = { Using the `updateFormField` method, the form fields can be updated programmatically. -The following code example explains how to update the Password field properties on a button click. +The following example updates Password field properties on a button click. ```html @@ -784,7 +779,7 @@ document.getElementById('updateProperties').addEventListener('click',function() ``` -The following code example explains how to update the properties of the Password field added to the document from the form designer toolbar. +The following code shows how to configure default properties for a Password field added from the Form Designer toolbar. {% tabs %} {% highlight js tabtitle="Standalone" %} @@ -887,7 +882,7 @@ pdfviewer.passwordFieldSettings = { Using the `updateFormField` method, the form fields can be updated programmatically. -The following code example explains how to update the CheckBox field properties on a button click. +The following example updates CheckBox field properties on a button click. ```html @@ -916,7 +911,7 @@ document.getElementById('updateProperties').addEventListener('click',function() ``` -The following code example explains how to update the properties of the CheckBox field added to the document from the form designer toolbar. +The following code shows how to configure default properties for a CheckBox field added from the Form Designer toolbar. {% tabs %} {% highlight js tabtitle="Standalone" %} @@ -990,13 +985,13 @@ pdfviewer.checkBoxFieldSettings = { {% endhighlight %} {% endtabs %} -![Checkbox Settings](../images/Checkbox.png) +![CheckBox field settings in the PDF Viewer](../images/Checkbox.png) ### RadioButton field settings Using the `updateFormField` method, the form fields can be updated programmatically. -The following code example explains how to update the RadioButton field properties on a button click. +The following example updates RadioButton field properties on a button click. ```html @@ -1025,7 +1020,7 @@ document.getElementById('updateProperties').addEventListener('click',function() ``` -The following code example explains how to update the properties of the RadioButton field added to the document from the form designer toolbar. +The following code shows how to configure default properties for a RadioButton field added from the Form Designer toolbar. {% tabs %} {% highlight js tabtitle="Standalone" %} @@ -1101,13 +1096,13 @@ pdfviewer.radioButtonFieldSettings = { {% endhighlight %} {% endtabs %} -![Radiobutton Settings](../images/Radiobutton.png) +![RadioButton field settings in the PDF Viewer](../images/Radiobutton.png) ### ListBox field settings Using the `updateFormField` method, the form fields can be updated programmatically. -The following code example explains how to update the ListBox field properties on a button click. +The following example updates ListBox field properties on a button click. ```html @@ -1140,7 +1135,7 @@ document.getElementById('updateProperties').addEventListener('click',function() ``` -The following code example explains how to update the properties of the Listbox field added to the document from the form designer toolbar. +The following code shows how to configure default properties for a ListBox field added from the Form Designer toolbar. {% tabs %} {% highlight js tabtitle="Standalone" %} @@ -1239,13 +1234,13 @@ pdfviewer.listBoxFieldSettings = { {% endhighlight %} {% endtabs %} -![Listbox Settings](../images/Listbox.png) +![ListBox field settings in the PDF Viewer](../images/Listbox.png) ### DropDown field settings Using the [updateFormField](https://ej2.syncfusion.com/documentation/api/pdfviewer/#updateformfields) method, the form fields can be updated programmatically. -The following code example explains how to update the DropDown field properties on a button click. +The following example updates DropDown field properties on a button click. ```html @@ -1279,7 +1274,7 @@ document.getElementById('updateProperties').addEventListener('click',function() ``` -The following code example explains how to update the properties of the Dropdown field added to the document from the form designer toolbar. +The following code shows how to configure default properties for a DropDown field added from the Form Designer toolbar. {% tabs %} @@ -1378,4 +1373,4 @@ pdfviewer.DropdownFieldSettings = { {% endhighlight %} {% endtabs %} -![Dropdown Settings](../images/Dropdown.png) \ No newline at end of file +![DropDown field settings in the PDF Viewer](../images/Dropdown.png) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/form-designer/create-with-user-interface-interaction.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/form-designer/create-with-user-interface-interaction.md index 8162303cb..85189f12f 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/form-designer/create-with-user-interface-interaction.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/form-designer/create-with-user-interface-interaction.md @@ -1,30 +1,29 @@ --- layout: post -title: User interaction in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Create with user interface interaction in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Design form fields in the JavaScript PDF Viewer component | Syncfusion +description: Learn how to add, drag, resize, edit, and manage form fields using the UI in the Syncfusion JavaScript PDF Viewer component. platform: document-processing -control: Create with user interface interaction -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Create with user interface interaction +# Create with user interface interaction for JavaScript -The PDF viewer control provides the option for interaction with Form Fields such as Drag and resize. you can draw a Form Field dynamically by clicking the Form Field icon on the toolbar and draw it in the PDF document. The Form Fields type supported by the PDF Viewer Control are: +The PDF Viewer component supports interactive form field design, including drawing, dragging, and resizing fields directly on the page. Click the Form Field icon on the toolbar to add a field and place it on the document. Supported form field types include: - * Textbox - * Password - * CheckBox - * RadioButton - * ListBox - * DropDown - * SignatureField - * InitialField +- Textbox +- Password +- CheckBox +- RadioButton +- ListBox +- DropDown +- Signature field +- Initial field ## Enable or Disable form designer toolbar -We should inject FormDesigner module and set enableFormDesignerToolbar as true to enable the Form designer icon on the toolbar. By default, enableFormDesignerToolbar is set as true. Use the following code to inject FormDesigner module and to enable the enableFormDesignerToolbar property. +Inject the FormDesigner module and set enableFormDesignerToolbar to true to display the Form Designer icon on the toolbar. The default value is true. Use the following code to enable the toolbar option. @@ -55,41 +54,41 @@ pdfviewer.appendTo('#PdfViewer'); ## Add the form field dynamically -Click the Form Field icon on the toolbar and then click on to the PDF document to draw a Form Field. Refer the below GIF for further reference. +Click the Form Field icon on the toolbar, then click on the PDF to draw a form field. See the following GIF for reference. -![Alt text](../images/addformfield.gif) +![Add a form field using the toolbar](../images/addformfield.gif) ## Drag the form field -We provide options to drag the Form Field which is currently selected in the PDF document. Refer the below GIF for further reference. +Drag the selected form field to reposition it within the PDF document. See the following GIF for reference. -![Alt text](../images/dragformfield.gif) +![Drag a selected form field in the PDF Viewer](../images/dragformfield.gif) ## Resize the form field -We provide options to resize the Form Field which is currently selected in the PDF document. Refer the below GIF for further reference. +Resize the selected form field using the resize handles on the field boundary. See the following GIF for reference. -![Alt text](../images/resizeformfield.gif) +![Resize a selected form field in the PDF Viewer](../images/resizeformfield.gif) ## Edit or Update the form field dynamically -The properties of the Form Fields can be edited using the Form Field Properties window. It can be opened by selecting the Properties option in the context menu that appears on the right by clicking the Form Field object. Refer the below image for the properties available to customize the appearance of the Form Field. +Edit form field properties using the Form Field Properties dialog. Open it by right-clicking a form field and selecting Properties from the context menu. The following images show examples of available settings. -![Alt text](../images/generalproperties.png) +![Form field general properties dialog](../images/generalproperties.png) -![Alt text](../images/appearanceproperties.png) +![Form field appearance properties dialog](../images/appearanceproperties.png) -![Alt text](../images/dropdownproperties.png) +![DropDown field properties dialog](../images/dropdownproperties.png) ## Clipboard operation with form field -The PDF Viewer control supports the clipboard operations such as cut, copy and paste for Form Fields. You can right click on the Form Field object to view the context menu and select to the clipboard options that you would like to perform. Refer the below image for the options in the context menu. +The PDF Viewer supports clipboard operations such as cut, copy, and paste for form fields. Right-click a form field to open the context menu and choose the desired clipboard action. The following image shows the available options. -![Alt text](../images/clipboardformfield.png) +![Clipboard options for a form field in the context menu](../images/clipboardformfield.png) ## Undo and Redo -We provided support to undo/redo the Form Field actions that are performed at runtime. Use the following code example to perform undo/redo actions. +Undo and redo actions are supported for runtime changes made to form fields. Use the following code to perform undo and redo operations. ``` diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/form-designer/form-field-events.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/form-designer/form-field-events.md index 64f800d72..96246440b 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/form-designer/form-field-events.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/form-designer/form-field-events.md @@ -1,15 +1,14 @@ --- layout: post -title: Form Field Events in Javascript Pdfviewer control | Syncfusion -description: Learn here all about different form field in Syncfusion Javascript Pdfviewer component of Syncfusion Essential JS 2 and more. +title: Form Field Events in JavaScript PDF Viewer control | Syncfusion +description: Learn here all about different form field in Syncfusion JavaScript PDF Viewer component of Syncfusion Essential JS 2 and more. platform: document-processing -control: Form Field Events -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# PDF Viewer Form Field events +# PDF Viewer Form Field events in JavaScript The PDF Viewer control provides the support to different Form Field events. The Form Field events supported by the PDF Viewer Control are: diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/form-filling.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/form-filling.md new file mode 100644 index 000000000..dbf113167 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/form-filling.md @@ -0,0 +1,86 @@ +--- +layout: post +title: Form filling in JavaScript PDF Viewer | Syncfusion +description: View, fill, export, and import PDF form fields in Syncfusion JavaScript PDF Viewer, with signature support and interaction control. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Form filling in JavaScript PDF Viewer + +The PDF Viewer displays existing form fields in a PDF and enables users to fill, validate, and download the filled data. + +The PDF Viewer supports the following form field types: + +* Text box +* Password +* Check box +* Radio button +* List box +* Dropdown +* Signature field +* Initial field + +![Form filling in JavaScript PDF Viewer](./images/form-filling.png) + +## Disabling form fields + +The PDF Viewer provides an option to disable interaction with form fields. Use the following configuration to disable form fields in the viewer. + +{% tabs %} +{% highlight js tabtitle="index.js" %} + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, + ej.pdfviewer.TextSearch, ej.pdfviewer.FormFields, ej.pdfviewer.FormDesigner +); + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + enableFormDesigner: false +}); +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +## Add a handwritten signature to a signature field + +Add a handwritten signature to a signature field by following these steps: + +* Click the signature field in the PDF document to open the signature panel. + +![Signature field in JavaScript PDF Viewer](./images/form-filling-signature.png) + +* Draw the signature in the signature panel. + +![Signature panel in JavaScript PDF Viewer](./images/form-filling-signature-dialog.png) + +* Select **CREATE**. The drawn signature is added to the signature field. + +![Signature added in JavaScript PDF Viewer](./images/form-filling-signature-signed.png) + +## Delete a signature from a signature field + +Delete a signature placed in a signature field by using the Delete option in the annotation toolbar. + +![Deleting a signature in JavaScript PDF Viewer](./images/form-filling-signature-del.png) + +## Export and import form fields + +The PDF Viewer supports exporting and importing form field data using the `importFormFields`, `exportFormFields`, and `exportFormFieldsAsObject` methods. The following formats are supported: + +* FDF +* XFDF +* JSON + +For more information, see the [Form fields documentation](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/form-designer/create-programmatically#export-and-import-form-fields). + +## See also + +* [Handwritten signature in JavaScript PDF Viewer](./annotations/signature-annotation) +* [Form Designer events](./form-designer/form-field-events) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/formdesigner/programmatically-work-with-form-field.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/formdesigner/programmatically-work-with-form-field.md deleted file mode 100644 index c3a4c8cda..000000000 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/formdesigner/programmatically-work-with-form-field.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -layout: post -title: Programmatically work with form field in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Programmatically work with form field in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. -platform: document-processing -control: Programmatically work with form field -publishingplatform: Javascript -documentation: ug -domainurl: ##DomainURL## ---- - -# Programmatically work with form field in Javascript Pdfviewer control - -The PDF Viewer control provides the option to add, edit and delete the Form Fields. The Form Fields type supported by the PDF Viewer Control are: - - * Textbox - * Password - * CheckBox - * RadioButton - * ListBox - * DropDown - * SignatureField - * InitialField - -## Add a form field to PDF document programmatically - -Using addFormField method, the form fields can be added to the PDF document programmatically. We need to pass two parameters in this method. They are Form Field Type and Properties of Form Field Type. To add form field programmatically, Use the following code. - -{% tabs %} -{% highlight js tabtitle="index.js" %} -{% include code-snippet/pdfviewer/javascript-es5/addformfield-cs2/index.js %} -{% endhighlight %} -{% highlight html tabtitle="index.html" %} -{% include code-snippet/pdfviewer/javascript-es5/addformfield-cs2/index.html %} -{% endhighlight %} -{% endtabs %} - -{% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es5/addformfield-cs2/index.html" %} - -## Edit/Update form field programmatically - -Using updateFormField method, Form Field can be updated programmatically. We should get the Form Field object/Id from FormFieldCollections property that you would like to edit and pass it as a parameter to updateFormField method. The second parameter should be the properties that you would like to update for Form Field programmatically. We have updated the value and background Color properties of Textbox Form Field. - -{% tabs %} -{% highlight js tabtitle="index.js" %} -{% include code-snippet/pdfviewer/javascript-es5/updateformfield-cs2/index.js %} -{% endhighlight %} -{% highlight html tabtitle="index.html" %} -{% include code-snippet/pdfviewer/javascript-es5/updateformfield-cs2/index.html %} -{% endhighlight %} -{% endtabs %} - -{% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es5/updateformfield-cs2/index.html" %} - -## Delete form field programmatically - -Using deleteFormField method, the form field can be deleted programmatically. We should retrieve the Form Field object/Id from FormFieldCollections property that you would like to delete and pass it as a parameter to deleteFormField method. To delete a Form Field programmatically, use the following code. - -{% tabs %} -{% highlight js tabtitle="index.js" %} -{% include code-snippet/pdfviewer/javascript-es5/deleteformfield-cs2/index.js %} -{% endhighlight %} -{% highlight html tabtitle="index.html" %} -{% include code-snippet/pdfviewer/javascript-es5/deleteformfield-cs2/index.html %} -{% endhighlight %} -{% endtabs %} - -{% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es5/deleteformfield-cs2/index.html" %} - -## Saving the form fields - -When the download icon is selected on the toolbar, the Form Fields will be saved in the PDF document and this action will not affect the original document. Refer the below GIF for further reference. - -![Alt text](../images/saveformfield.gif) - -You can invoke download action using following code snippet. - -```javascript -var pdfviewer = new ej.pdfviewer.PdfViewer({ - enableDownload: true, - documentPath: "PDF_Succinctly.pdf", - serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer' - }); -ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, ej.pdfviewer.TextSearch, ej.pdfviewer.Navigation,ej.pdfviewer.Print); -pdfviewer.appendTo('#PdfViewer'); -pdfviewer.download(); - -``` - -## Printing the form fields - -When the print icon is selected on the toolbar, the PDF document will be printed along with the Form Fields added to the pages and this action will not affect the original document. Refer the below GIF for further reference. - -![Alt text](../images/printformfield.gif) - -You can invoke print action using the following code snippet., - -```javascript - -var pdfviewer = new ej.pdfviewer.PdfViewer({ - enablePrint: true, - documentPath: "PDF_Succinctly.pdf", - serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer' - }); -ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Navigation,ej.pdfviewer.Print); -pdfviewer.appendTo('#PdfViewer'); -pdfviewer.print.print(); - -``` - -## Open the existing PDF document - -We can open the already saved PDF document contains Form Fields in it by clicking the open icon in the toolbar. Refer the below GIF for further reference. - -![Alt text](../images/openexistingpdf.gif) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/formdesigner/user-interaction-with-form-fields.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/formdesigner/user-interaction-with-form-fields.md deleted file mode 100644 index 6af6e526a..000000000 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/formdesigner/user-interaction-with-form-fields.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -layout: post -title: User interaction with form fields in Javascript Pdfviewer control | Syncfusion -description: Learn here all about User interaction with form fields in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. -platform: document-processing -control: User interaction with form fields -publishingplatform: Javascript -documentation: ug -domainurl: ##DomainURL## ---- - -# User interaction with form fields in Javascript Pdfviewer control - -The PDF viewer control provides the option for interaction with Form Fields such as Drag and resize. you can draw a Form Field dynamically by clicking the Form Field icon on the toolbar and draw it in the PDF document. The Form Fields type supported by the PDF Viewer Control are: - - * Textbox - * Password - * CheckBox - * RadioButton - * ListBox - * DropDown - * SignatureField - * InitialField - -## Enable or Disable form designer toolbar - -We should inject FormDesigner module and set enableFormDesignerToolbar as true to enable the Form designer icon on the toolbar. By default, enableFormDesignerToolbar is set as true. Use the following code to inject FormDesigner module and to enable the enableFormDesignerToolbar property. - -```javascript -var pdfviewer = new ej.pdfviewer.PdfViewer({ - documentPath: "FormDesigner.pdf", - serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer', - enableFormDesignerToolbar: true -}); -ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.FormDesigner); -pdfviewer.appendTo('#PdfViewer'); -``` - -## Add the form field dynamically - -Click the Form Field icon on the toolbar and then click on to the PDF document to draw a Form Field. Refer the below GIF for further reference. - -![Alt text](../images/addformfield.gif) - -## Drag the form field - -We provide options to drag the Form Field which is currently selected in the PDF document. Refer the below GIF for further reference. - -![Alt text](../images/dragformfield.gif) - -## Resize the form field - -We provide options to resize the Form Field which is currently selected in the PDF document. Refer the below GIF for further reference. - -![Alt text](../images/resizeformfield.gif) - -## Edit or Update the form field dynamically - -The properties of the Form Fields can be edited using the Form Field Properties window. It can be opened by selecting the Properties option in the context menu that appears on the right by clicking the Form Field object. Refer the below image for the properties available to customize the appearance of the Form Field. - -![Alt text](../images/generalproperties.png) - -![Alt text](../images/appearanceproperties.png) - -![Alt text](../images/dropdownproperties.png) - -## Clipboard operation with form field - -The PDF Viewer control supports the clipboard operations such as cut, copy and paste for Form Fields. You can right click on the Form Field object to view the context menu and select to the clipboard options that you would like to perform. Refer the below image for the options in the context menu. - -![Alt text](../images/clipboardformfield.png) - -## Undo and Redo - -We provided support to undo/redo the Form Field actions that are performed at runtime. Use the following code example to perform undo/redo actions. - -```javascript -var pdfviewer = new ej.pdfviewer.PdfViewer({ - documentPath: "FormDesigner.pdf", - serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer', -}); -ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.FormDesigner); -pdfviewer.appendTo('#PdfViewer'); -pdfviewer.undo(); -pdfviewer.redo(); -``` \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/getting-started-with-server-backed.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/getting-started-with-server-backed.md index 4849dfaf0..8e98b9384 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/getting-started-with-server-backed.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/getting-started-with-server-backed.md @@ -1,23 +1,23 @@ --- layout: post -title: Getting started with Javascript PDF Viewer control | Syncfusion -description: Checkout and learn about Getting started with Javascript PDF Viewer control of Syncfusion Essential JS 2 and more details. +title: Server-backed JavaScript PDF Viewer | Syncfusion +description: Learn how to set up and use the Syncfusion JavaScript PDF Viewer in server-backed mode using CDN resources, injecting modules and web service configuration. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Getting started in Javascript PDF Viewer control +# Getting started with JavaScript PDF Viewer (server-backed) -The Essential JS 2 for JavaScript (global script) is an ES5 formatted pure JavaScript framework which can be directly used in latest web browsers. +This guide explains how to create the PDF Viewer component and configure its features in JavaScript (global script) using CDN-hosted resources in server-backed mode. -## Component Initialization with CDN link for script and style reference +> Ensure that the same version is used for all script and style references to avoid compatibility issues. -**Step 1:** Create an app folder `my_app` for the Essential JS 2 JavaScript components. +## Set up the application -**Step 2:** The Essential JS 2 component's global scripts and styles are already hosted in the below CDN link formats. +1. Create an app folder `my_app` for the Essential JS 2 JavaScript components. +2. The Essential JS 2 component's global scripts and styles are already hosted in the following CDN link formats. **Syntax:** > Script: `https://cdn.syncfusion.com/ej2/{Version}/dist/{PACKAGE_NAME}.min.js` @@ -29,7 +29,7 @@ The Essential JS 2 for JavaScript (global script) is an ES5 formatted pure JavaS > > Styles: [`https://cdn.syncfusion.com/ej2/26.2.11/ej2-base/styles/material.css`](https://cdn.syncfusion.com/ej2/26.2.11/ej2-base/styles/material.css) -**Step 3:** Create a HTML page (index.html) in `my_app` location and add the CDN link references. Now, add the `Div` element and initiate the `Essential JS 2 PDF Viewer` component in the index.html by using following code. +3. Create an HTML page (`index.html`) in the `my_app` location, add the CDN link references, add the `div` element, and initialize the Essential JS 2 PDF Viewer component by using the following code. {% tabs %} {% highlight html tabtitle="index.html" %} @@ -49,34 +49,51 @@ N> The Web API hosted link https://document.syncfusion.com/web-services/pdf-view {% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es5/es5-getting-started-cs1/index.html" %} -**Step 4:** Now, run the `index.html` in web browser, it will render the `Essential JS 2 PDF Viewer` component. +## Run the application -> For PDF Viewer serviceUrl creation, follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/how-to/create-pdfviewer-service) +Open the `index.html` file in a web browser to render the Essential JS 2 PDF Viewer component. -## How to run the PDF Viewer web service +> For PDF Viewer serviceUrl creation, follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/how-to/create-pdfviewer-service). -1. Download the sample from the [Web service sample in GitHub](https://github.com/SyncfusionExamples/EJ2-PDFViewer-WebServices) link. +## Module injection -2. Navigate to the `ASP.NET Core` folder and open it in the command prompt. +To enable additional features, inject the required modules. The following modules extend the PDF Viewer's functionality: + +* `LinkAnnotation`: Enables hyperlink navigation. +* `BookmarkView`: Displays and navigates document bookmarks. +* `Magnification`: Provides zoom in/out operations. +* `Navigation`: Enables page navigation. +* `TextSelection`: Enables text selection. +* `ThumbnailView`: Displays page thumbnails for navigation. +* `Toolbar`: Enables the built-in toolbar UI. +* `Print`: Enables printing. +* `Annotation`: Enables annotation features. +* `TextSearch`: Enables text search. +* `FormFields`: Enables form field support. +* `FormDesigner`: Enables designing and editing of form fields. + +## Run the PDF Viewer web service +1. Download the sample from the [Web service sample in GitHub](https://github.com/SyncfusionExamples/EJ2-PDFViewer-WebServices). +2. Navigate to the `ASP.NET Core` folder and open it in the command prompt. 3. Navigate to the appropriate subfolder based on your .NET version: - .NET 6.0 → `PdfViewerWebService_6.0` - .NET 8.0 → `PdfViewerWebService_8.0` -4. Use the below command to restore the required packages. +4. Use the following command to restore the required packages. ``` dotnet restore ``` -5. Use the below command to run the web service. +5. Use the following command to run the web service. ``` dotnet run ``` -6. You can see that the PDF Viewer server instance runs in the local host with the port number `localhost:5001` and navigate to the PDF Viewer Web control `localhost:5001/pdfviewer` which returns the default get response method. We can bind the link to the `serviceUrl` property of PDF Viewer as below. +6. The PDF Viewer server instance runs at `https://localhost:5001`. Navigate to `https://localhost:5001/pdfviewer`, which returns the default GET response method. Bind this link to the `serviceUrl` property of the PDF Viewer as shown below. ```javascript var pdfviewer = new ej.pdfviewer.PdfViewer({ @@ -87,6 +104,8 @@ var pdfviewer = new ej.pdfviewer.PdfViewer({ N> When configuring the server-backed PDF viewer, it's essential to understand that there is no need to include the pdfium.js and pdfium.wasm files. Unlike the standalone PDF viewer, which relies on these files for local rendering, the server-backed PDF viewer fetches and renders PDFs directly from the server. Consequently, you can exclude the copy command for deployment process, as they are not required to load and display PDFs in this context. +> Refer to the [JavaScript PDF Viewer feature tour](https://www.syncfusion.com/pdf-viewer-sdk) for an overview of capabilities. Explore the [JavaScript PDF Viewer example](https://document.syncfusion.com/demos/pdf-viewer/javascript-es5/#/tailwind3/pdfviewer/default.html) to see core features in action. + N> For hosting the web service on the Linux platform, ensure to include the [SkiaSharp.NativeAssets.Linux](https://nuget.org/packages/SkiaSharp.NativeAssets.Linux/3.116.1). Additionally, for AWS environments, utilize the following packages: | **Amazon Web Services (AWS)** |**NuGet package name** | diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/getting-started.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/getting-started.md index e41cacc28..6a005580d 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/getting-started.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/getting-started.md @@ -1,15 +1,14 @@ --- layout: post -title: Getting started with Javascript PDF Viewer control | Syncfusion -description: Checkout and learn about Getting started with Javascript PDF Viewer control of Syncfusion Essential JS 2 and more details. +title: Getting started with JavaScript PDF Viewer control | Syncfusion +description: Checkout and learn about Getting started with JavaScript PDF Viewer control of Syncfusion Essential JS 2 and more details. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Getting started in Standalone PDF Viewer control +# Getting started in JavaScript Standalone PDF Viewer control The Essential JS 2 for JavaScript (global script) is an ES5 formatted pure JavaScript framework which can be directly used in latest web browsers. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/globalization.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/globalization.md index c99ed3e1c..b0caafde0 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/globalization.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/globalization.md @@ -1,15 +1,14 @@ --- layout: post -title: Globalization in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Globalization in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Globalization in JavaScript PDF Viewer control | Syncfusion +description: Learn here all about Globalization in Syncfusion JavaScript PDF Viewer control of Syncfusion Essential JS 2 and more. platform: document-processing -control: Globalization -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Globalization in Javascript Pdfviewer control +# Globalization in JavaScript PDF Viewer control The text contents provided in the PDF Viewer can be localized using the collection of localized strings for different cultures. By default, the PDF Viewer is localized in “__en-US__”. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to-overview.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to-overview.md new file mode 100644 index 000000000..08b7d57ce --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to-overview.md @@ -0,0 +1,69 @@ +--- +layout: post +title: FAQ Section in PDF Viewer control | Syncfusion +description: In this section, you can know about the various questions asked about manipulation of in PDF Viewer control. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Frequently Asked Questions Section in JavaScript PDF Viewer control + +The frequently asked questions in Essential® PDF Viewer are listed below. + +* [How to add annotation in text search in typescript?](./how-to/add-annotation-in-text-search-js) +* [How to add custom header to the PDF Viewer ajax request?](./how-to/add-header-value) +* [How to add a save button to PDF Viewer toolbar?](./how-to/add-save-button-js) +* [How to customize the annotation selectors?](./how-to/annotation-selectors) +* [How to change the author name of the annotation dynamically?](./how-to/change-author-name-using-annotation-settings) +* [How to clear all the annotations from the PDF document?](./how-to/clear-annotations) +* [How to configure the annotation selector settings?](./how-to/configure-annotationselector-setting-js) +* [What are the supported conformance or standards of PDF Viewer?](./how-to/conformance) +* [How to change the border color of rectangle annotations?](./how-to/change-rectangle-annotations-border-color) +* [How to control the visibility of the annotation?](./how-to/control-annotation-visibility-js) +* [How to convert the PDF library bounds to PDF viewer bounds?](./how-to/convert-pdf-library-bounds-to-pdf-viewer-bounds-js) +* [How to create PDF Viewer service using ASP.NET Core?](./how-to/create-pdfviewer-service-core) +* [How to create PDF viewer web service using ASP.NET MVC?](./how-to/create-pdfviewer-service) +* [How to customize the context menu in PDF Viewer?](./how-to/custom-context-menu) +* [How to add custom font in handwritten signature?](./how-to/custom-font-signature-field-js) +* [How to add custom fonts for form fields and free text annotations?](./how-to/custom-fonts) +* [How to add a new page to the pdf document?](./how-to/add-new-page-to-the-pdf-document) +* [How to customize text search highlight color in PDF Viewer?](./how-to/customize-text-search-color) +* [How to delete a specific annotation from the PDF document?](./how-to/delete-annotation) +* [How to disable the context menu?](./how-to/disable-context-menu) +* [How to disable tile rendering in PDF Viewer?](./how-to/disable-tile-rendering) +* [How to display custom tooltip for annotation?](./how-to/display-custom-tool-tip-for-annotation) +* [How to download the pdf document when closing the browser window?](./how-to/download-document-on-window-closing) +* [How to focus on a form field after loading a document?](./how-to/focus-on-a-form-field-after-loading) +* [How to get the download start event?](./how-to/download-start-event-js) +* [How to enable or disable the local storage?](./how-to/enable-local-storage-js) +* [Enable the resizer for text markup annotation?](./how-to/enable-resize) +* [How to enable or disable the text selection?](./how-to/enable-text-selection-js) +* [How to export the PDF pages as images?](./how-to/export-as-image-js) +* [How to extract text from the PDF document?](./how-to/extract-text-completed-js) +* [How to extract text from a specific region?](./how-to/extract-text-option-js) +* [How to extract text from the PDF document?](./how-to/extract-text-js) +* [How to find the text in the PDF document asynchronously?](./how-to/find-text-async-js) +* [How to get the base64 string of the loaded document?](./how-to/get-base64-js) +* [How to get the page information of the loaded document?](./how-to/get-page-info-js) +* [How to perform highlight, underline, and strikethrough for the selected text?](./how-to/highlight-underline-strikeout-text) +* [How to identify the added annotation and its mode?](./how-to/identify-added-annotation-mode) +* [How to import annotations from the PDF document?](./how-to/import-annotations) +* [How to import and export annotations in PDF Viewer?](./how-to/import-export-annotation-js) +* [How to load a PDF document in PDF Viewer?](./how-to/load-document) +* [How to set the minimum and maximum zoom percentage?](./how-to/min-max-zoom-js) +* [How to open the bookmark pane when the document is loaded?](./how-to/open-bookmark-js) +* [How to open the thumbnail pane when the document is loaded?](./how-to/open-thumbnail) +* [How to get the annotation when it is overlapped with another annotation on its selection?](./how-to/overlapped-annotation) +* [How to get the page render started and completed event?](./how-to/pagerenderstarted-pagerendercompleted-js) +* [How to print the PDF document silently?](./how-to/print-document) +* [How to resolve the `Unable to find an entry point named 'FreeExportedValues' in DLL 'pdfium''?](./how-to/resolve-unable-to-find-an-entry-point-error) +* [How to restrict the zooming in mobile mode?](./how-to/restricting-zoom-in-mobile-mode-js) +* [How to select annotations in multi page?](./how-to/select-multi-page-annotations) +* [How to show custom stamp item in the stamp annotation?](./how-to/show-custom-stamp-item-js) +* [How to show or hide a particular annotation?](./how-to/show-hide-annotation-js) +* [How to get the signature selected and unselected event?](./how-to/signatureselect-signatureunselect-js) +* [How to unload the PDF document from the viewer?](./how-to/unload-document) +* [How to use local script and style references?](./how-to/use-local-script-and-style-references) + diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/add-annotation-in-text-search-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/add-annotation-in-text-search-js.md index b0fbdd140..608f0481f 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/add-annotation-in-text-search-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/add-annotation-in-text-search-js.md @@ -1,39 +1,36 @@ --- layout: post -title: Add Annotation in Text Search in JavaScript PdfViewer | Syncfusion -description: Learn how to add rectangle annotations using search text bounds in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Add rectangle annotation via textSearch | Syncfusion PDF Viewer +description: Learn to add rectangle annotations using text search bounds in the JavaScript PDF Viewer component, including initialization and search controls. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Add Rectangle Annotations Using Search Text Bounds in PDF Viewer +# Add rectangle annotations using text search bounds in JS PDF Viewer -## Overview +A concise guide to adding rectangle annotations at highlighted text search results in the JavaScript PDF Viewer to visually emphasize matches and improve readability. -This guide demonstrates how to add rectangle annotations based on the bounds of highlighted search text in the PDF Viewer. This technique is useful for emphasizing search results with visual markers in annotation-supported applications. - -## Steps to Add Rectangle Annotations on Search Result Highlight +## Steps to add rectangle annotations on search result highlight **Step 1:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample. -**Step 2:** Initialize the PDF Viewer with Required Modules +**Step 2:** Initialize the PDF Viewer with the required modules ```js var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', - resourceUrl:'https://cdn.syncfusion.com/ej2/28.1.33/dist/ej2-pdfviewer-lib' + resourceUrl:'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib' }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); pdfviewer.appendTo('#PdfViewer'); ``` -**Step 3:** Implement code blocks to automatically add Rectangle Annotation on Search Result Highlight +**Step 3:** Add a rectangle annotation when a search result is highlighted -Define a callback function for the `textSearchHighlight` event to add rectangle annotations +Define a callback for the `textSearchHighlight` event to add a rectangle annotation at each match. ```js // Highlight event handler for text search, which adds a rectangle annotation where the text is found @@ -50,9 +47,9 @@ pdfviewer.textSearchHighlight = function(args){ } ``` -**Step 3:** Add Search Controls +**Step 4:** Add search controls -Ensure you have the appropriate HTML buttons for text search operations +Ensure that the HTML includes buttons for text search operations. ```html @@ -60,7 +57,7 @@ Ensure you have the appropriate HTML buttons for text search operations ``` -Use the following JavaScript to handle search controls: +Use the following JavaScript code to handle search controls: ```js // Event listener for initiating a search @@ -79,6 +76,6 @@ document.getElementById("searchCancel").addEventListener("click", function() { }); ``` -By following this guide, you will enable the PDF Viewer to add rectangle annotations at search result locations, thus increasing the visibility of search results in your application. +Following these steps enables the PDF Viewer to add rectangle annotations at search result locations, improving the visibility of matches. [View Sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to/) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/add-header-value.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/add-header-value.md index ed3ba91d6..19f5ba372 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/add-header-value.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/add-header-value.md @@ -1,19 +1,17 @@ --- layout: post -title: Add header value in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Add header value in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Add header values to AJAX requests | Syncfusion PDF Viewer +description: Learn how to include custom headers in PDF Viewer AJAX requests using ajaxRequestSettings and ajaxHeaders in the JavaScript PDF Viewer component. platform: document-processing -control: Add header value -publishingplatform: Javascript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Add header value in Javascript Pdfviewer control +# Add header values in the JavaScript PDF Viewer -To add header values to an AJAX request made by a Syncfusion PDF Viewer, you can use the **ajaxHeaders** property available in the [**ajaxRequestSettings**](https://ej2.syncfusion.com/documentation/api/pdfviewer/#ajaxrequestsettings) module of the PDF Viewer. This property allows you to specify custom headers for the AJAX request. +Use the ajaxHeaders property in the PDF Viewer’s [ajaxRequestSettings](https://ej2.syncfusion.com/documentation/api/pdfviewer/#ajaxrequestsettings) to include custom headers with each AJAX request. -Here is an example of how you can use the **ajaxRequestSettings** property to add a custom header to an AJAX request made by the PDF Viewer: +Example: Add a custom Authorization header using ajaxRequestSettings ```ts @@ -31,4 +29,5 @@ viewer.ajaxRequestSettings = { ``` -Find the sample [how to add custom headers in AjaxRequestSettings](https://stackblitz.com/edit/typescript-nv1way?file=index.ts) \ No newline at end of file +Sample: How to add custom headers using ajaxRequestSettings +[StackBlitz example](https://stackblitz.com/edit/typescript-nv1way?file=index.ts) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/add-new-page-to-the-pdf-document.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/add-new-page-to-the-pdf-document.md index ef549c88b..8640a9db1 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/add-new-page-to-the-pdf-document.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/add-new-page-to-the-pdf-document.md @@ -1,23 +1,22 @@ --- layout: post -title: Add new page to the pdf document in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Add new page to the pdf document in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Add new page to PDF document - Syncfusion JavaScript PDF Viewer +description: Learn how to append a new page to a loaded PDF document in the Syncfusion JavaScript PDF Viewer control using the PDF library service. platform: document-processing -control: Add new page to the pdf document -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Add new page to the pdf document in Javascript Pdfviewer control +# Add a new page to a PDF document in JavaScript PDF Viewer control -The PDF Viewer library allows you to add a new page to the PDF document using the PDF library. +The JavaScript PDF Viewer library can append a blank page to any loaded PDF document through the accompanying PDF library service. -**Step 1:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) to create a simple PDF Viewer sample. +**Step 1:** Follow the guidance in the [Getting started with the JavaScript PDF Viewer](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) article to configure a working sample. -**Step 2:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/how-to/create-pdfviewer-service/) to create the PDF Viewer web service. +**Step 2:** Complete the web service setup by using this [guide](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/how-to/create-pdfviewer-service). -**Step 3:** Add the following code sample in the PDF Viewer controller code to add a new page in the PDF document using the PDF library. +**Step 3:** Add the following controller action to insert a new page into the loaded PDF document before returning it to the viewer. ```javascript @@ -64,4 +63,4 @@ public IActionResult Load([FromBody] Dictionary jsonObject) } ``` -[View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to/Add%20new%20page%20to%20the%20PDF%20document%20using%20PDF%20library) \ No newline at end of file +[View the sample on GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to/Add%20new%20page%20to%20the%20PDF%20document%20using%20PDF%20library) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/add-save-button-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/add-save-button-js.md index 05a8aa185..91bef26a1 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/add-save-button-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/add-save-button-js.md @@ -1,23 +1,22 @@ --- layout: post -title: Add Save button in Javascript Pdfviewer control | Syncfusion -description: Learn here all about How to add save button in Toolbar in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Add Save button to toolbar in Syncfusion JavaScript PDF Viewer +description: Learn how to add, show, hide, enable, and disable a custom Save button in the built-in toolbar of the JavaScript PDF Viewer component. platform: document-processing control: Toolbar -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Add Save button in Built-In Toolbar +# Add Save button in Built-In Toolbar in JavaScript -PDF Viewer allows you to customize (add, show, hide, enable, and disable) existing items in a toolbar. +PDF Viewer supports customizing toolbar items, including adding, showing, hiding, enabling, and disabling items. -* Save button - `Save` button-item can defined by [**CustomToolbarItemModel**](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/customToolbarItem/) and with existing items in [**ToolbarSettings**](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbarSettings/) property. Newly added save button-item click action can be defined in [`toolbarclick`](https://ej2.syncfusion.com/javascript/documentation/api/toolbar/clickEventArgs/). +- Save button: The Save button can be defined using [CustomToolbarItemModel](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/customToolbarItem/) and included alongside existing items via [ToolbarSettings](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbarSettings/). Handle the click action using [`toolbarclick`](https://ej2.syncfusion.com/javascript/documentation/api/toolbar/clickEventArgs/). -* Show, Hide - `Save` button-item can be shown or hidden using the [`ToolbarSettings`](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbarSettings/) property. Pre-defined toolbar items are available with [`ToolbarItem`](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbarItem/). +- Show or hide: The Save button can be shown or hidden using [ToolbarSettings](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbarSettings/). Predefined items are listed under [`ToolbarItem`](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbarItem/). -* Enable, Disable - `Save` button-item can be enabled or disable using [`enabletoolbaritem`](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbar/#enabletoolbaritem) +- Enable or disable: The Save button can be enabled or disabled using [`enabletoolbaritem`](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbar/#enabletoolbaritem). {% tabs %} {% highlight js tabtitle="Standalone" %} @@ -31,7 +30,7 @@ PDF Viewer allows you to customize (add, show, hide, enable, and disable) existi var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', - resourceUrl:'https://cdn.syncfusion.com/ej2/24.1.41/dist/ej2-pdfviewer-lib', + resourceUrl:'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', toolbarSettings : { toolbarItems: ['OpenOption', toolItem1, 'PageNavigationTool', 'MagnificationTool', 'PanTool', 'SelectionTool', 'SearchOption', 'PrintOption', 'UndoRedoTool', 'AnnotationEditTool', 'FormDesignerEditTool', 'CommentTool', 'SubmitForm'] } }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar,ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields); @@ -79,35 +78,33 @@ function OnCreateSearch() { {% endhighlight %} {% endtabs %} +N> Default toolbar items: ['OpenOption', 'PageNavigationTool','MagnificationTool', 'PanTool', 'SelectionTool', 'SearchOption', 'PrintOption', 'DownloadOption','UndoRedoTool', 'AnnotationEditTool', 'FormDesignerEditTool', 'CommentTool', 'SubmitForm'] -N> Default value of toolbar items is ['OpenOption', 'PageNavigationTool','MagnificationTool', 'PanTool', 'SelectionTool', 'SearchOption', 'PrintOption', 'DownloadOption','UndoRedoTool', 'AnnotationEditTool', 'FormDesignerEditTool', 'CommentTool', 'SubmitForm'] +### Align property -### Align Property +Specifies the alignment of the Save button within the toolbar. -The align property is used to specify the alignment of a `save` button-item within the toolbar. +- Left: Aligns the item to the left side of the toolbar. +- Right: Aligns the item to the right side of the toolbar. -`Left`: Aligns the item to the left side of the toolbar. -`Right`: Aligns the item to the right side of the toolbar. +### Tooltip property -### Tooltip Property +Sets the tooltip text for the Save button. The tooltip provides additional information on hover. -The tooltip property is used to set the tooltip text for a `save` button-item. Tooltip provides additional information when a user hovers over the item. +### CssClass property -### CssClass Property +Applies custom CSS classes to the Save button for styling. -The cssClass property is used to apply custom CSS classes to a `save` button-item. It allows custom styling of the `save` button-item. +### Prefix property -### Prefix Property +Sets the CSS class or icon to add as a prefix to the Save button content. -The prefix property is used to set the CSS class or icon that should be added as a prefix to the existing content of the `save` button-item. +### ID property -### ID Property +The id property within a CustomToolbarItemModel is required and uniquely identifies each toolbar item for configuration and interaction. -The id property within a CustomToolbarItemModel is a compulsory attribute that plays a vital role in toolbar customization. It serves as a unique identifier for each toolbar item, facilitating distinct references and interactions. +When defining or customizing toolbar items, assign a specific, descriptive id to each item. These properties are commonly used when defining custom toolbar items with `CustomToolbarItemModel` in the context of Syncfusion PDF Viewer. When configuring the toolbar using the `ToolbarSettings` property, include these properties to customize appearance and behavior. -When defining or customizing toolbar items, it is mandatory to assign a specific and descriptive id to each item. -These properties are commonly used when defining custom toolbar items with the `CustomToolbarItemModel`` in the context of Syncfusion PDF Viewer. When configuring the toolbar using the `ToolbarSettings`` property, you can include these properties to customize the appearance and behavior of each toolbar item. - -N> When customizing `save` button-item, you have the flexibility to include either icons or text based on your design preference. +N> When customizing the Save button, icons or text can be used based on design preference. [View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to/Add%20Save%20Button%20In%20Toolbar) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/annotation-selector.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/annotation-selector.md index 758c6c10f..3e90a4a44 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/annotation-selector.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/annotation-selector.md @@ -1,19 +1,18 @@ --- layout: post -title: Annotation selector in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Annotation selector in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Annotation selector customization | Syncfusion PDF Viewer +description: Learn how to customize annotation selectors in the JavaScript PDF Viewer component using annotationSelectorSettings with examples. platform: document-processing -control: Annotation selector -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Annotation selector in Javascript Pdfviewer control +# Customize annotation selectors in JavaScript ES5 PDF Viewer -To customize the annotation selector in Syncfusion PDF Viewer, you can use the [**annotationSelectorSettings**](https://ej2.syncfusion.com/documentation/api/pdfviewer/#annotationselectorsettings) property of the PdfViewer control. +Customize the annotation selector using the [annotationSelectorSettings](https://ej2.syncfusion.com/documentation/api/pdfviewer/#annotationselectorsettings) property of the PDF Viewer. -Here is an example of how you can customize the selector of the shape annotation: +Example: Customize the selector of a shape annotation ``` @@ -30,4 +29,5 @@ document.getElementById('annotationSelector').addEventListener('click', () => { ``` -Find the sample [how to customize the annotation selector](https://stackblitz.com/edit/js-5p3ae6?file=index.js) \ No newline at end of file +Sample: [How to customize the annotation selector] +(https://stackblitz.com/edit/js-5p3ae6?file=index.js) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/change-author-name-using-annotation-settings.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/change-author-name-using-annotation-settings.md index 056a75dbf..a5dbb0528 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/change-author-name-using-annotation-settings.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/change-author-name-using-annotation-settings.md @@ -1,34 +1,33 @@ --- layout: post -title: Change author name using annotation settings in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Change author name using annotation settings in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Change author name using annotation settings in JavaScript PDF Viewer | Syncfusion +description: Learn how to change the author name and related annotation settings using the annotationSettings API in the JavaScript PDF Viewer. platform: document-processing -control: Change author name using annotation settings -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Change author name using annotation settings in Javascript Pdfviewer control +# Change author name using annotation settings in JavaScript PDF Viewer -The Essential JavaScript PDF Viewer supports to customize a single property of the annotation settings by exposing an API for the properties common to all the annotations. +The PDF Viewer allows customizing individual annotation settings using the annotationSettings API, which exposes properties common to all annotations. -**API Name** : annotationSettings +API name: annotationSettings -|Property Name|Data type & Default Value|Description| +| Property Name | Data type & Default Value | Description | |---|---|---| -|author|String(“Guest”)|specifies the author of the annotation.| -|minWidth|Number(0)|specifies the minWidth of the annotation.| -|maxWidth|Number(0)|specifies the maxWidth of the annotation.| -|minHeight|Number(0)|specifies the minHeight of the annotation.| -|maxHeight|Number(0)|specifies the maxHeight of the annotation.| -|isLock|Boolean(false)|specifies the locked action of the annotations. [If set true unable to select the annotations]| -|isPrint|Boolean(true)|specifies whether the annotations are included or not in Print actions.| -|isDownload|Boolean(true|specifies whether the annotations are included or not in Download actions.| -|Free Text Settings| -|allowOnlyTextInput|Boolean(false)|specifies the allow only text action of the free text annotation. [If set true unable to move or resize the annotations]| - -You can change the author name and the other properties using the annotationSettings API as in the following code sample. +| author | String ("Guest") | Specifies the author of the annotation. | +| minWidth | Number (0) | Specifies the minimum width of the annotation. | +| maxWidth | Number (0) | Specifies the maximum width of the annotation. | +| minHeight | Number (0) | Specifies the minimum height of the annotation. | +| maxHeight | Number (0) | Specifies the maximum height of the annotation. | +| isLock | Boolean (false) | Specifies whether the annotation is locked. If true, the annotation cannot be selected. | +| isPrint | Boolean (true) | Specifies whether the annotation is included in print actions. | +| isDownload | Boolean (true) | Specifies whether the annotation is included in download actions. | +| Free Text Settings | +| allowOnlyTextInput | Boolean (false) | Specifies text-only mode for free text annotations. If true, moving or resizing is disabled. | + +Change the author name and other properties using the annotationSettings API as shown below. {% tabs %} {% highlight ts tabtitle="Standalone" %} diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/change-rectangle-annotations-border-color.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/change-rectangle-annotations-border-color.md index 2bc69dd94..38b798434 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/change-rectangle-annotations-border-color.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/change-rectangle-annotations-border-color.md @@ -1,21 +1,20 @@ --- layout: post -title: Change rectangle annotations border color in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Change rectangle annotations border color in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Change rectangle annotation border color in JavaScript PDF Viewer control | Syncfusion +description: Learn how to change the rectangle annotation border color in the Syncfusion JavaScript PDF Viewer control by configuring rectangleSettings. platform: document-processing -control: Change rectangle annotations border color -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Change rectangle annotations border color in Javascript Pdfviewer control +# Change rectangle annotation border color in JavaScript PDF Viewer -The Essential JavaScript PDF Viewer supports customizing the rectangle annotation's property by using the [rectangleSettings](https://ej2.syncfusion.com/documentation/api/pdfviewer/#rectanglesettings) API. +The JavaScript PDF Viewer enables customizing rectangle annotation appearance through the [rectangleSettings](https://ej2.syncfusion.com/documentation/api/pdfviewer/#rectanglesettings) API, including border color updates. -**Step 1:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) to create simple PDF Viewer sample. +**Step 1:** Follow the [Getting started with the JavaScript PDF Viewer](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) guide to create a working sample. -**Step 2:** Add the following code snippet to change the rectangle annotation's border color using the [rectangleSettings](https://ej2.syncfusion.com/documentation/api/pdfviewer/#rectanglesettings) API. +**Step 2:** Insert the following interface elements and script to change the rectangle annotation border color by using the [rectangleSettings](https://ej2.syncfusion.com/documentation/api/pdfviewer/#rectanglesettings) API. ``` @@ -40,4 +39,4 @@ document.getElementById("addRectangleAnnotation").addEventListener('click', func ``` -[View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/Annotations/How%20to%20change%20the%20rectangle%20annotation's%20border%20color) \ No newline at end of file +[View the sample on GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/Annotations/How%20to%20change%20the%20rectangle%20annotation's%20border%20color) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/clear-annotation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/clear-annotation.md index fa4627822..1b197a416 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/clear-annotation.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/clear-annotation.md @@ -1,19 +1,18 @@ --- layout: post -title: Clear annotation in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Clear annotation in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Clear annotations in JavaScript PDF Viewer | Syncfusion +description: Learn how to clear all annotations or delete specific annotations in the JavaScript PDF Viewer using deleteAnnotations and deleteAnnotationById. platform: document-processing -control: Clear annotation -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Clear annotation in Javascript Pdfviewer control +# Clear annotations in JavaScript PDF Viewer -To clear all the annotations in a PDF document using the Syncfusion PDF Viewer, you can use the [**deleteAnnotations**](https://ej2.syncfusion.com/documentation/api/pdfviewer/#deleteannotations) method. This method is used to clear all the annotations present in the currently loaded document. +Use the [deleteAnnotations](https://ej2.syncfusion.com/documentation/api/pdfviewer/#deleteannotations) method to clear all annotations in the currently loaded document. -Here is an example of how you can clear all the annotations present in the currently loaded document: +Example: Clear all annotations in the loaded document ``` @@ -30,9 +29,9 @@ document.getElementById('deleteAnnotations').addEventListener('click',()=> { ``` -We can also delete specific annotations with the **deleteAnnotationById()** method. This method is used to delete a specific annotation using its id. +To remove a specific annotation, use the deleteAnnotationById method to target an annotation by its id. -Here is an example of how you can delete specific annotations with the **deleteAnnotationById** method: +Example: Delete a specific annotation by id ``` @@ -51,4 +50,4 @@ document.getElementById('deleteAnnotationbyId').addEventListener('click', () => ``` -Find the sample [how to clear annotations using deleteAnnotations](https://stackblitz.com/edit/js-mctbeq?file=index.js) \ No newline at end of file +Sample: [How to clear annotations using deleteAnnotations](https://stackblitz.com/edit/js-mctbeq?file=index.js) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/configure-annotationselector-setting-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/configure-annotationselector-setting-js.md index 0f6d82694..e7622db1a 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/configure-annotationselector-setting-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/configure-annotationselector-setting-js.md @@ -1,30 +1,25 @@ --- layout: post -title: Annotation Selector Setting in Javascript Pdfviewer|Syncfusion. -description: Learn here all about Annotation Selector Settings in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Configure annotation selector settings in JavaScript PDF Viewer | Syncfusion +description: Learn how to configure annotation selector settings in the JavaScript PDF Viewer using annotationSelectorSettings and related options. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- +# Configure annotation selector settings -# How to Configure Annotation Selector Settings - -### Annotation Selector Settings - -The [**annotationSelectorSettings**](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotationSelectorSettings/) property allows you to customize the appearance and behavior of the annotation selector in the UI. +Use the [annotationSelectorSettings](https://ej2.syncfusion.com/documentation/api/pdfviewer/annotationSelectorSettings/) property to customize the appearance and behavior of the annotation selector in the UI. ### AnnotationSelectorSettingsModel -The [**AnnotationSelectorSettingsModel**](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotationSelectorSettingsModel/) defines the settings for the annotation selector, including border colors, sizes, and shapes. It provides fine-grained control over how annotations are displayed and interacted with. - -### How to Configure Annotation Selector Settings +The [AnnotationSelectorSettingsModel](https://ej2.syncfusion.com/documentation/api/accumulation-chart/accumulationAnnotationSettingsModel/) defines settings such as border colors, sizes, and shapes, enabling fine-grained control over how annotations are displayed and interacted with. -**Step 1:** Create a PdfViewer Instance: Initialize your PdfViewer instance. +Steps to configure annotation selector settings -**Step 2:** Set the annotationSelectorSettings Property: Define your settings to customize the annotation selector. +- Step 1: Create a PDF Viewer instance and initialize it. +- Step 2: Set the annotationSelectorSettings property to customize selector behavior. ```js let viewer: PdfViewer = new PdfViewer(); @@ -42,26 +37,18 @@ The [**AnnotationSelectorSettingsModel**](https://ej2.syncfusion.com/javascript/ viewer.appendTo("#pdfViewer"); ``` -**Step 3:** Append the Viewer to Your HTML Element: Use the appendTo method to render the PDF viewer in your desired HTML element. - -#### Key properties include: - -* **selectionBorderColor:** Sets the color for the border around selected annotations. - -* **resizerBorderColor:** Sets the color for the border of the resizer handles. - -* **resizerFillColor:** Defines the fill color for the resizer handles. - -* **resizerSize:** Determines the size of the resizer handles. - -* **selectionBorderThickness:** Specifies how thick the selection border should be. - -* **resizerShape:** Allows you to choose the shape of the resizer handles (e.g., Circle or Square). - -* **selectorLineDashArray:** Specifies the dash pattern for the selector line to enhance visual cues. +- Step 3: Append the viewer to the target HTML element using appendTo. -* **resizerLocation:** Determines where the resizer appear in relation to the annotation (e.g., Corners or Edges). +#### Key properties -* **resizerCursorType:** Sets the cursor style when hovering over the resizer, improving user interaction. +- selectionBorderColor: Sets the color for the border around selected annotations. +- resizerBorderColor: Sets the color for the border of the resizer handles. +- resizerFillColor: Defines the fill color for the resizer handles. +- resizerSize: Determines the size of the resizer handles. +- selectionBorderThickness: Specifies the thickness of the selection border. +- resizerShape: Sets the shape of the resizer handles (for example, Circle or Square). +- selectorLineDashArray: Specifies the dash pattern for the selector line. +- resizerLocation: Determines where the resizers appear relative to the annotation (for example, Corners or Edges). +- resizerCursorType: Sets the cursor style when hovering over a resizer. [View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/conformance.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/conformance.md index c6230b2fa..b6769a793 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/conformance.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/conformance.md @@ -1,27 +1,26 @@ --- layout: post -title: Know the supported conformance PDF documents | Syncfusion -description: Learn here all about the supported conformance PDF documents in Syncfusion Javascript PDF Viewer component of Syncfusion Essential JS 2 and more. +title: Supported PDF conformance levels | Syncfusion +description: Learn about the supported PDF/A and PDF/X conformance levels in the JavaScript PDF Viewer component. platform: document-processing -control: Conformance -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Know the supported conformance PDF documents in Javascript PDF Viewer component +# Supported PDF conformance in JavaScript PDF Viewer -The PDF Viewer supports the below conformance documents: +The PDF Viewer supports the following conformance levels: -* **PDF/A-1a conformance** -* **PDF/A-1b conformance** -* **PDF/X-1a conformance** -* **PDF/A-2a conformance** -* **PDF/A-2b conformance** -* **PDF/A-2u conformance** -* **PDF/A-3a conformance** -* **PDF/A-3b conformance** -* **PDF/A-3u conformance** -* **PDF/A-4 conformance** -* **PDF/A-4e conformance** -* **PDF/A-4f conformance** \ No newline at end of file +* PDF/A-1a +* PDF/A-1b +* PDF/X-1a +* PDF/A-2a +* PDF/A-2b +* PDF/A-2u +* PDF/A-3a +* PDF/A-3b +* PDF/A-3u +* PDF/A-4 +* PDF/A-4e +* PDF/A-4f diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/control-annotation-visibility-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/control-annotation-visibility-js.md index c5384930a..05eeb3013 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/control-annotation-visibility-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/control-annotation-visibility-js.md @@ -1,38 +1,40 @@ --- layout: post -title: Control Annotations Visibility in JavaScript PdfViewer | Syncfusion -description: Learn how to Control Annotations Visibility in the Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Control annotation visibility in JavaScript PDF Viewer | Syncfusion +description: Learn how to control the visibility of PDF annotations in the JavaScript PDF Viewer, ensuring annotations appear only in the viewer as needed. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Control PDF Annotations Visibility in PDF Viewer +# Control annotation visibility in PDF Viewer ### Overview -This guide demonstrates how to control the visibility of PDF annotations in documents loaded and saved using the Syncfusion PDF Viewer in JavaScript. This process allows the annotations to be visible only in specific viewers, such as the Syncfusion PDF Viewer. +This guide explains how to control the visibility of PDF annotations in documents loaded and saved using the Syncfusion PDF Viewer in JavaScript, so annotations are visible only in the viewer when required. -### How to control Annotation Visibility +### Steps to control annotation visibility **Step 1:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) to create a simple PDF Viewer sample. -**Step 2:** Add Buttons for Annotation Modification and Downloading +**Step 2:** Add buttons for annotation modification and downloading -Include buttons in your HTML for annotation modification and downloading the PDF. +Include buttons in the HTML for modifying annotations and downloading the PDF. ```html
    ``` -**Step 3**: Add the following code snippet to add annotations to the PDF document. You can also include other annotations as needed. + +**Step 3:** Add annotations to the PDF document + +Add the following code to insert annotations. Additional annotations can be included as needed. ```js var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: 'https://cdn.syncfusion.com/content/pdf/annotations-v1.pdf', - resourceUrl: "https://cdn.syncfusion.com/ej2/28.1.33/dist/ej2-pdfviewer-lib", + resourceUrl: "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -53,18 +55,19 @@ var pdfviewer = new ej.pdfviewer.PdfViewer({ }); }; ``` -**Step 4:** Add Event Listeners for Button Clicks -Attach event listeners that handle annotation visibility modifications and downloading the document. +**Step 4:** Add event listeners for button clicks + +Attach an event listener to handle annotation visibility changes and document download. ```js // Add event listener to the button with ID 'download' document.getElementById('save').addEventListener('click', save); ``` -**Step 5:** Modify Annotation Flags Function +**Step 5:** Modify annotation flags -Implement a function that changes the annotation visibility settings for the document. +Implement a function that updates annotation visibility flags for the document. ```js @@ -118,6 +121,6 @@ Implement a function that changes the annotation visibility settings for the doc } ``` -By following these steps, the annotations in a PDF document can be set to be visible in the Syncfusion PDF Viewer, providing control over annotation visibility based on different platforms. +Following these steps ensures annotations are visible in the Syncfusion PDF Viewer while controlling their visibility in the downloaded PDF. [View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/convert-pdf-library-bounds-to-pdf-viewer-bounds-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/convert-pdf-library-bounds-to-pdf-viewer-bounds-js.md index f86eb23e7..2a5c80fd0 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/convert-pdf-library-bounds-to-pdf-viewer-bounds-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/convert-pdf-library-bounds-to-pdf-viewer-bounds-js.md @@ -1,25 +1,22 @@ --- layout: post -title: Converting Library Bounds in JavaScript PdfViewer | Syncfusion -description: Learn how to convert Library bounds into Viewer bounds in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Convert PDF Library bounds to PDF Viewer bounds in JavaScript PDF Viewer | Syncfusion +description: Learn how to convert PDF Library bounds into PDF Viewer bounds when exporting annotations, ensuring accurate placement in the JavaScript PDF Viewer. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Converting PDF Library Bounds to PDF Viewer Bounds +# Convert PDF Library bounds to PDF Viewer bounds -### Overview +When exporting annotations from the PDF Library, convert the bounds values into the PDF Viewer format to ensure accurate placement. -When exporting annotations from the PDF Library, you may need to convert the bounds values into the PDF Viewer format. This guide will help you achieve that using the Syncfusion PDF Viewer component. +### Steps to convert bounds values -### How to Convert Bounds Values +**Step 1:** Initialize the PDF Viewer instance -**Step 1:** Initialize the PdfViewer Instance - -Create an instance of the PdfViewer and configure it with the required services. +Create an instance of the PDF Viewer and configure it with the required services. ```js var pdfviewer = new ej.pdfviewer.PdfViewer({ @@ -43,7 +40,7 @@ ej.pdfviewer.PdfViewer.Inject( pdfviewer.appendTo('#PdfViewer'); ``` -**Step 2:** Handle Export Success +**Step 2:** Handle export success Convert the exported blob URL to an object and then extract and convert the annotation bounds. @@ -104,9 +101,9 @@ pdfviewer.exportSuccess = function (args) { }; ``` -**Step 3:** Create a Function to Convert Blob URL to Object +**Step 3:** Convert Blob URL to object -This function fetches the blob data and converts it into a JSON object. +Fetch the blob data and convert it into a JSON object. ```js // Function to convert Blob URL to object @@ -128,6 +125,6 @@ function convertBlobURLToObject(blobURL) { ### Conclusion -By following these steps, you can successfully convert PDF Library bounds values into PDF Viewer bounds values when exporting annotations as JSON. This will help maintain accuracy in the annotation placement and ensure a seamless user experience. +These steps convert PDF Library bounds values into PDF Viewer bounds values when exporting annotations as JSON, maintaining accurate annotation placement. [View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/create-pdfviewer-service-core.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/create-pdfviewer-service-core.md index 42009e309..7673c6cd5 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/create-pdfviewer-service-core.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/create-pdfviewer-service-core.md @@ -1,24 +1,23 @@ --- layout: post -title: Create pdfviewer service in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Create pdfviewer service in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Create PDF Viewer service in JavaScript PDF Viewer | Syncfusion +description: Learn how to create an ASP.NET Core Web API service for the JavaScript PDF Viewer to handle server-side processing for rendering, text extraction, thumbnails, and more. platform: document-processing -control: Create pdfviewer service -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Create pdfviewer service in Javascript Pdfviewer control +# Create PDF Viewer service in JavaScript PDF Viewer -The Essential JavaScript PDF Viewer have server side dependency to get the details from PDF Documents for rendering. This section explains how to create the service for PDF Viewer to perform server-side preprocessing of the PDF document to be rendered in client side. +The PDF Viewer depends on a server-side service to process PDF documents for rendering. This section explains how to create an ASP.NET Core Web API service for the PDF Viewer to perform server-side preprocessing and operations used by the client. ## Prerequisites -To get started with ASP.NET CORE Web API service, refer [System requirements for ASP.NET Core controls](https://ej2.syncfusion.com/aspnetcore/documentation/system-requirements). +To get started with an ASP.NET Core Web API service, refer to [System requirements for ASP.NET Core controls](https://ej2.syncfusion.com/aspnetcore/documentation/system-requirements) -## Setup ASP.NET CORE application with Web API for PDF Viewer service +## Set up an ASP.NET Core application with Web API for the PDF Viewer service -The following steps are used to create PDF Viewer service +Follow these steps to create the PDF Viewer service **Step 1:** Select File > New > Project, in the Visual Studio menu bar. @@ -45,7 +44,7 @@ Install the **Syncfusion.EJ2.PdfViewer.AspNet.Core** package to the application. ![Alt text](./images/viewer-dependency.png) -**Step 6:** Add the API Controller to the project and named it as `PdfViewerController` . +**Step 6:** Add an API controller to the project and name it `PdfViewerController`. ![Alt text](./images/apicontroller.png) **Step 7:** Add the following code to the `PdfViewerController.cs` controller. @@ -345,7 +344,7 @@ namespace PdfViewerWebService ``` -**Step 8:** Change the launchUrl to pdfviewer (name of the controller) in the lauchSettings.json as follows. +**Step 8:** Change the launchUrl to pdfviewer (the controller name) in launchSettings.json as follows. ```json { @@ -380,9 +379,9 @@ namespace PdfViewerWebService } ``` -**Step 9:** Configuring CORS policy and add Newtonsoft.Json for JSON format support -* Browser security prevents a webpage from making requests to a different domain than the one that served the webpage. This restriction is called the same-origin policy. Cross Origin Resource Sharing (CORS) allows a server to relax the same-origin policy. Using CORS, a server can explicitly allow some cross-origin. Configure a CORS policy at application Startup.ConfigureServices. -* Prior to ASP.NET Core 3.0, the default JSON formatters implemented using the Newtonsoft.Json package. In ASP.NET Core 3.0 or later, the default JSON formatters are based on System.Text.Json. Support for Newtonsoft.Json based formatters and features is available by installing the Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet package and configuring it in Startup.ConfigureServices. +**Step 9:** Configure CORS and add Newtonsoft.Json for JSON format support +- Browsers restrict cross-origin requests by default (same-origin policy). Cross-Origin Resource Sharing (CORS) allows specific cross-origin requests. Configure a CORS policy during application startup. +- In ASP.NET Core 3.0 or later, System.Text.Json is the default. To use Newtonsoft.Json-based formatters and features, install Microsoft.AspNetCore.Mvc.NewtonsoftJson and configure it at startup. ```cs using Microsoft.AspNetCore.ResponseCompression; @@ -427,4 +426,4 @@ app.MapControllers(); app.Run(); ``` -View the sample in GitHub to [create PDF Viewer web service](https://github.com/SyncfusionExamples/EJ2-PDFViewer-WebServices/tree/main/ASP.NET%20Core/PdfViewerWebService_6.0) \ No newline at end of file +View the sample in GitHub on [how to create PDF Viewer web service](https://github.com/SyncfusionExamples/EJ2-PDFViewer-WebServices/tree/main/ASP.NET%20Core/PdfViewerWebService_6.0) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/create-pdfviewer-service.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/create-pdfviewer-service.md index 3fadb97b0..04bab6b43 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/create-pdfviewer-service.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/create-pdfviewer-service.md @@ -1,47 +1,46 @@ --- layout: post -title: Create pdfviewer service in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Create pdfviewer service in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Create PDF Viewer service using ASP.NET MVC | Syncfusion +description: Learn how to create an ASP.NET MVC Web API service for the JavaScript PDF Viewer to handle server-side processing for rendering and related operations. platform: document-processing -control: Create pdfviewer service -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Create pdfviewer service in Javascript Pdfviewer control +# Create PDF Viewer service using ASP.NET MVC -The Essential JavaScript PDF Viewer have server side dependency to get the details from PDF Documents for rendering. This section explains how to create the service for PDF Viewer to perform server-side preprocessing of the PDF document to be rendered in client side. +The PDF Viewer relies on a server-side service to process PDF documents for rendering. This section explains how to create an ASP.NET MVC Web API service to perform server-side preprocessing for the client. ## Prerequisites -To get started with ASP.NET MVC Web API service, ensure that the following software is installed on the machine. +To get started with an ASP.NET MVC Web API service, ensure the following software is installed: -* .Net Framework 4.5 and above. +* .NET Framework 4.5 or later * ASP.NET MVC 4 or ASP.NET MVC 5 * Web API * Visual Studio -## Setup ASP.NET MVC application with Web API for PDF Viewer service +## Set up an ASP.NET MVC application with Web API for the PDF Viewer service -The following steps are used to create PDF Viewer service +Follow these steps to create the PDF Viewer service -**Step 1:** Create an ASP.NET web application with the default template project in Visual Studio 2017. +**Step 1:** Create an ASP.NET web application using the default template in Visual Studio 2017. ![Alt text](./images/default-template.png) -**Step 2:** After creating the project, add the `Syncfusion.EJ2.PdfViewer.AspNet.MVC5` dependency to your project by using 'NuGet Package Manager'. +**Step 2:** After creating the project, add the `Syncfusion.EJ2.PdfViewer.AspNet.MVC5` dependency using NuGet Package Manager. Open the `NuGet` package manager. ![Alt text](./images/solution-explorer.png) -Install the **Syncfusion.EJ2.PdfViewer.AspNet.Mvc5** package to the application. +Install the **Syncfusion.EJ2.PdfViewer.AspNet.Mvc5** package for the application. ![Alt text](./images/pdfviewer-dependency.png) -**Step 3:** Add the Web API 2 Controller to the project and named it as `PdfViewerController` . +**Step 3:** Add a Web API 2 controller to the project and name it `PdfViewerController`. ![Alt text](./images/api-controller.png) -**Step 4:** Add the following code to the `PdfViewerController.cs` controller. +**Step 4:** Add the following code to `PdfViewerController.cs`. ```ts using Newtonsoft.Json; @@ -266,7 +265,7 @@ namespace MvcWebService.webapi ``` -**Step 6:** Set the Global configuration in the `Global.asax` file: +**Step 6:** Set global configuration in `Global.asax`: ``` System.Web.Http.GlobalConfiguration.Configuration.Routes.MapHttpRoute( @@ -276,4 +275,4 @@ namespace MvcWebService.webapi AppDomain.CurrentDomain.SetData("SQLServerCompactEditionUnderWebHosting", true); ``` -Download the sample to create PDF Viewer web service [here](https://www.syncfusion.com/downloads/support/directtrac/general/ze/MvcWebService587924662.zip) \ No newline at end of file +Download the sample to [create a PDF Viewer web service](https://www.syncfusion.com/downloads/support/directtrac/general/ze/MvcWebService587924662.zip) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/custom-context-menu-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/custom-context-menu-js.md index 98a02de9a..f41cc0c91 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/custom-context-menu-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/custom-context-menu-js.md @@ -1,26 +1,25 @@ --- layout: post -title: Customize context menu in Javascript PDF Viewer control | Syncfusion -description: Learn here all about Customize context menu in Syncfusion Javascript PDF Viewer control of Syncfusion Essential JS 2 and more. +title: Customize the context menu in JavaScript PDF Viewer | Syncfusion +description: Learn how to add and customize custom context menu options in the JavaScript PDF Viewer using addCustomMenu, customContextMenuSelect, and related events. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Customize context menu in Javascript Pdfviewer control +# Customize the context menu in JavaScript PDF Viewer -PDF Viewer allows you to add custom option in context menu. It can be achieved by using the [addCustomMenu()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#addcustommenu) method and custom action is defined using the [customContextMenuSelect()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#customcontextmenuselect)method. +PDF Viewer supports adding custom options to the context menu using the [addCustomMenu()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#addcustommenu) method. Define actions for custom items with the [customContextMenuSelect()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#customcontextMenuselect) method. -### Add Custom Option +### Add a custom option -The following code shows how to add custom option in context menu. +The following example adds custom options to the context menu. ```js var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', - resourceUrl:'https://cdn.syncfusion.com/ej2/24.2.3/dist/ej2-pdfviewer-lib' + resourceUrl:'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib' }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields,ej.pdfviewer.PageOrganizer); @@ -59,14 +58,14 @@ pdfviewer.documentLoad = function (args) { } ``` -### Customize custom option in context menu +### Customize the default vs custom menu -The PDF Viewer feature enables customization of custom options and the ability to toggle the display of the default context menu. When the addCustomMenu parameter is set to `true`, the default menu is hidden; conversely, when it is set to `false`, the default menu items are displayed. +Toggle the display of the default context menu. When the addCustomMenu parameter is `true`, the default menu is hidden; when `false`, default menu items are displayed alongside custom items. ```js var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', - resourceUrl:'https://cdn.syncfusion.com/ej2/24.2.3/dist/ej2-pdfviewer-lib' + resourceUrl:'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib' }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields,ej.pdfviewer.PageOrganizer); @@ -105,14 +104,14 @@ pdfviewer.documentLoad = function (args) { } ``` -#### Customize added context menu items +#### Show or hide custom items before opening -The following code shows how to hide/show added custom option in context menu using the [customContextMenuBeforeOpen()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#customcontextmenubeforeopen) method. +Use [customContextMenuBeforeOpen()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#customcontextmenubeforeopen) to hide or show custom options dynamically. ```js var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', - resourceUrl:'https://cdn.syncfusion.com/ej2/24.2.3/dist/ej2-pdfviewer-lib' + resourceUrl:'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib' }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields,ej.pdfviewer.PageOrganizer); @@ -261,7 +260,8 @@ function setReadOnlyFalse(args) { } } ``` -The following is the output of custom context menu with customization. + +The following is the output of the custom context menu with customization. {% tabs %} {% highlight ts tabtitle="index.js" %} diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/custom-font-signature-field-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/custom-font-signature-field-js.md index db666c76b..a2b60314f 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/custom-font-signature-field-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/custom-font-signature-field-js.md @@ -1,23 +1,24 @@ --- layout: post -title: How to change font family in Javascript Pdfviewer|Syncfusion. -description: Learn how to change the font family in Form Field's Type Signature in Syncfusion Javascript Pdfviewer component of Syncfusion Essential JS 2 and more. +title: Change font family in JavaScript PDF Viewer | Syncfusion +description: Learn how to change the font family for form field type signatures and initials in the JavaScript PDF Viewer using typeSignatureFonts and typeInitialFonts. platform: document-processing control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# To Change the Font Family -Change the Font Family in Type Signature of the Syncfusion PDF Viewer by adding a custom css stylesheet to the document , and then apply the desired font family to the type signature element. Include the Google font link in the HTML head section to apply the Google Font. +# Change the font family for type signatures -### Signature Field property +Change the font family for Type Signature and Initial fields by adding a stylesheet to load fonts and assigning them via the PDF Viewer settings. Include Google Font links in the HTML head to use those fonts. -The Syncfusion PDF Viewer provides the ability to change the font family for Signature and Initial Field using `typeSignatureFont` and `typeInitialFonts` property. +### Signature field property + +The PDF Viewer supports changing fonts for Signature and Initial fields using the `typeSignatureFonts` and `typeInitialFonts` properties. **Step 1:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample. -**Step 2:** Insert the following code snippet to implement the functionality for using custom fonts in Signature field. +**Step 2:** Use the following code to apply custom fonts to the Signature field. {% tabs %} {% highlight ts tabtitle="Standalone" %} @@ -42,9 +43,10 @@ pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} -### Initial Field property -Insert the following code snippet to implement the functionality for using custom fonts in Initial field. +### Initial field property + +Use the following code to apply custom fonts to the Initial field. {% tabs %} {% highlight ts tabtitle="Standalone" %} @@ -70,4 +72,4 @@ pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} -By implementing this , you can use custom fonts in form field's signature in both `signature` and `initial` field +By implementing this configuration, custom fonts can be used for both Signature and Initial form fields. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/custom-fonts.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/custom-fonts.md index d91c1aeab..4c9ebed17 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/custom-fonts.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/custom-fonts.md @@ -1,31 +1,35 @@ --- layout: post -title: Add Custom fonts in Javascript Pdfviewer control | Syncfusion -description: Learn here all about how to add custom fonts using the PDF document in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Add custom fonts in JavaScript PDF Viewer | Syncfusion +description: Learn how to add and load custom TTF fonts for documents displayed in the JavaScript PDF Viewer using the customFonts property. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# How to add custom fonts to the PDF viewer used in the PDF document +# Add custom fonts in PDF Viewer -To use custom fonts in the Syncfusion PDF Viewer within your PDF document, you need to add the custom TTF font files to the resource URL directory and configure the viewer to load these fonts. You can specify the custom font names using the -**customFonts** property, which accepts an array of font names. +The JavaScript PDF Viewer supports loading, editing, and saving custom fonts in form fields such as text boxes, list boxes, and drop-downs by using the customFonts property. Add the required TTF files to the resource URL directory used by the viewer so they can be loaded at runtime and used in forms. -The following steps are used to customize the selection border. +## Integrating Custom Font Collections into Form Fields in PDF Viewer -**Step 1:** Add the custom TTF font files to the resource URL path referenced in your application. For example, place the custom TTF files in the ej2-pdfviewer-lib folder, which will serve as the resource URL path. +To ensure proper rendering and saving of form fields that use custom fonts, especially when the fonts are not installed on the system, place the TTF files in the resource URL path referenced by the viewer and specify their names through the customFonts property (string array). These fonts will then be available for loading, editing, and saving form fields in the PDF. -**Step 2:** The following code snippet are how you can add custom fonts to the PDF viewer. +To use custom fonts in the Syncfusion PDF Viewer, add the custom TTF files to the resource URL directory and configure the viewer to load them. Specify font file names using the `customFonts` property as an array of names. + +### Steps to add custom fonts + +**Step 1:** Add custom TTF font files to the resource URL path referenced in the application. For example, place the TTF files in the ej2-pdfviewer-lib folder that serves as the resource URL path. + +**Step 2:** Use the following code to configure custom fonts in the PDF Viewer. {% tabs %} {% highlight js tabtitle="Standalone" %} var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', - resourceUrl:'https://cdn.syncfusion.com/ej2/24.1.41/dist/ej2-pdfviewer-lib', + resourceUrl:'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', customFonts: ["arialbd.ttf", "arial.ttf", "BKANT.TTF", "calibri.ttf", "GARA.TTF", "GARAIT.TTF", "msgothic.ttc", "trebuc.ttf", "wingding.ttf"] }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar,ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields); @@ -49,4 +53,6 @@ pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} -By following these steps, you can successfully integrate and use custom fonts in your PDF documents displayed in the EJ2 PDF Viewer. \ No newline at end of file +These steps integrate custom fonts into PDF documents displayed in the PDF Viewer. + +>Note: If a form field (TextBox, ListBox, DropDown) using a custom font has text larger than the field’s bounds, the downloaded PDF may render incorrectly in browsers or third‑party viewers. It displays correctly in the Syncfusion PDF Viewer. To avoid this, use a font size that fits within the field or enlarge the field before saving/downloading. \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/customize-text-search-colors.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/customize-text-search-colors.md index 47783b299..1d00d1609 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/customize-text-search-colors.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/customize-text-search-colors.md @@ -1,17 +1,16 @@ --- layout: post -title: Customize text search colors in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Customize text search colors in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Customize text search color in JavaScript PDF Viewer | Syncfusion +description: Learn how to customize text search and highlight colors in the JavaScript PDF Viewer using textSearchColorSettings. platform: document-processing -control: Customize text search colors -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Customize text search colors in Javascript Pdfviewer control +# Customize text search color in PDF Viewer -To change the text search color in the Syncfusion PDF viewer, you can use the **searchColor** property of the searchModule object. This property accepts a string value that represents the color in hexadecimal format. +Change the text search colors using the `textSearchColorSettings` properties. Set `searchColor` for matched text and `searchHighlightColor` for the active result. Both accept hexadecimal color values. ```javascript @@ -19,9 +18,7 @@ viewer.textSearchColorSettings.searchColor = "#FF0000"; ``` -This will set the text search color to red. You can use any valid hexadecimal color code to set the text search color to the desired color. - -You can also use the **searchHighlightColor** property of the searchModule object to change the highlight color of the search results. This property also accepts a string value in hexadecimal format. +The above sets the match color to red. Use any valid hex color. ```javascript @@ -29,12 +26,12 @@ viewer.textSearchColorSettings.searchHighlightColor = "#0000FF"; ``` -This will set the highlight color of the search results to blue. +The above sets the active result highlight to blue. -* [**searchColor**](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/textSearchColorSettings/#searchcolor) -* [**searchHighlightColor**](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/textSearchColorSettings/#searchhighlightcolor) +- [searchColor](https://ej2.syncfusion.com/documentation/api/pdfviewer/textSearchColorSettings/#searchcolor) +- [searchHighlightColor](https://ej2.syncfusion.com/documentation/api/pdfviewer/textSearchColorSettings/#searchhighlightcolor) -Here is an example of how you can use the searchHighlightColor property and searchColor property: +Example: Buttons to control search flow ``` @@ -67,4 +64,4 @@ document.getElementById("searchCancel").addEventListener("click", () => { ``` -Find the sample [how to customize the text search color](https://stackblitz.com/edit/js-q6nquw?file=index.js) \ No newline at end of file +Sample: [How to customize the text search color](https://stackblitz.com/edit/js-q6nquw?file=index.js) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/delete-annotations.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/delete-annotations.md index b7ad3091c..840b0c443 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/delete-annotations.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/delete-annotations.md @@ -1,23 +1,22 @@ --- layout: post -title: Delete annotations in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Delete annotations in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Delete an annotation in JavaScript PDF Viewer | Syncfusion +description: Learn how to delete a specific annotation in the JavaScript PDF Viewer using the deleteAnnotationById method. platform: document-processing -control: Delete annotations -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Delete annotations in Javascript Pdfviewer control +# Delete an annotation in PDF Viewer -The PDF Viewer library allows you to delete a specific annotation from a PDF document. Deleting a specific annotation can be done using the **deleteAnnotationById()** method. This method is used to delete a specific annotation using its id. +Use the `deleteAnnotationById()` method to remove a specific annotation from a PDF document by its id. -The following steps are used to delete a specific annotation from PDF Document. +### Steps to delete a specific annotation -**Step 1:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) to create simple PDF Viewer sample. +**Step 1:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) to create a simple PDF Viewer sample. -**Step 2:** Use the following code snippet to delete a specific annotation using `deleteAnnotationById()` method. +**Step 2:** Use the following code to delete a specific annotation using `deleteAnnotationById()`. ``` @@ -32,4 +31,4 @@ document.getElementById('deleteAnnotationbyId').addEventListener('click', () => }); ``` -Find the sample [how to delete a specific annotation using deleteAnnotationById](https://stackblitz.com/edit/5ygaeq?file=index.js) \ No newline at end of file +Sample: [How to delete a specific annotation using deleteAnnotationById](https://stackblitz.com/edit/5ygaeq?file=index.js) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/disable-context-menu-option.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/disable-context-menu-option.md index 5df3d0ce5..18cc3f395 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/disable-context-menu-option.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/disable-context-menu-option.md @@ -1,19 +1,18 @@ --- layout: post -title: Disable context menu option in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Disable context menu option in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Disable the context menu in JavaScript PDF Viewer | Syncfusion +description: Learn how to disable the context menu in the JavaScript PDF Viewer using the ContextMenuOption property. platform: document-processing -control: Disable context menu option -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Disable context menu option in Javascript Pdfviewer control +# Disable the context menu in JavaScript PDF Viewer -To disable the context menu in the Syncfusion PDF viewer control, you can use the [**ContextMenuOption**](https://ej2.syncfusion.com/documentation/api/pdfviewer/#contextmenuoption) property as `'None'` to hide all context menu options. Default value of the **ContextMenuOption** is `'RightClick'`. +Set [ContextMenuOption](https://ej2.syncfusion.com/documentation/api/pdfviewer/#contextmenuoption) to `None` to hide all context menu options. The default value is `RightClick`. -Here is an example of how you can use the **ContextMenuOption** to disable context menu in the PDF Viewer: +Example: Disable context menu ``` @@ -30,6 +29,6 @@ document.getElementById('disable').addEventListener('click', ()=> { ``` -This will hide the context menu and prevent the user from right-clicking on the PDF viewer. +This hides the context menu and prevents right-click interactions in the viewer. -Find the sample [how to disable context menu](https://stackblitz.com/edit/jlphem-uicunx?devtoolsheight=33&file=index.js) \ No newline at end of file +Sample: [How to disable the context menu](https://stackblitz.com/edit/jlphem-uicunx?devtoolsheight=33&file=index.js) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/disable-tile-renderings.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/disable-tile-renderings.md index 1b5ebba2f..0d7bfcc88 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/disable-tile-renderings.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/disable-tile-renderings.md @@ -1,23 +1,20 @@ --- layout: post -title: Disable tile renderings in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Disable tile renderings in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Disable tile rendering in JavaScript PDF Viewer | Syncfusion +description: Learn how to disable tile rendering in the JavaScript PDF Viewer using enableTileRendering to adjust performance behavior for different document sizes. platform: document-processing -control: Disable tile renderings -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Disable tile renderings in Javascript Pdfviewer control +# Disable tile rendering in JavaScript PDF Viewer -To disable the tile rendering feature in the Syncfusion PDF viewer control, you can use the **enableTileRendering** property. This property allows you to enable or disable the tile rendering feature, which is used to improve the performance of the PDF viewer when displaying large documents. +Use the `enableTileRendering` property to enable or disable tile rendering, which affects performance based on document size. -To disable the tile rendering feature, you can set the **enableTileRendering** property to `false`. +Set `enableTileRendering` to `false` to disable tile rendering. It is enabled by default and typically benefits large documents. -By default, the tile rendering feature is enabled in the PDF viewer. Disabling it may improve the performance of the PDF viewer when displaying small documents, but it may also reduce the performance when displaying large documents. - -Here is an example of how you can use the **enableTileRendering** property: +Example: Disable tile rendering ``` @@ -34,4 +31,4 @@ document.getElementById('disable').addEventListener('click', () => { ``` -Find the sample [how to disable the tile rendering](https://stackblitz.com/edit/7fefpj-n7pyna?file=index.js) \ No newline at end of file +Sample: [How to disable tile rendering](https://stackblitz.com/edit/7fefpj-n7pyna?file=index.js) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/display-custom-tool-tip-for-annotations.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/display-custom-tool-tip-for-annotations.md index 600f450b1..c861ab844 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/display-custom-tool-tip-for-annotations.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/display-custom-tool-tip-for-annotations.md @@ -1,19 +1,18 @@ --- layout: post -title: Display custom tool tip for annotations in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Display custom tool tip for annotations in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Display a custom tooltip for annotations in JavaScript PDF Viewer | Syncfusion +description: Learn how to display a custom tooltip for annotations in the JavaScript PDF Viewer using the annotationMouseover and annotationMouseLeave events. platform: document-processing -control: Display custom tool tip for annotations -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Display custom tool tip for annotations in Javascript Pdfviewer control +# Display a custom tooltip for annotations in JavaScript PDF Viewer -To display a custom tooltip for annotations using the mouseover event in the Syncfusion PDF Viewer, you can use the [**annotationMouseOver**](https://ej2.syncfusion.com/documentation/api/pdfviewer/#annotationmouseover) and **annotationMouseLeave** events . +Display custom tooltips for annotations by handling the [annotationMouseover](https://ej2.syncfusion.com/documentation/api/pdfviewer/#annotationmouseover) and annotationMouseLeave events. -Here is an example that demonstrates how to display a custom tooltip for annotations using the mouseover event in the Syncfusion PDF Viewer: +Example: Show a tooltip on mouse over ```javascript @@ -36,4 +35,4 @@ viewer.annotationMouseLeave = function(args) { ``` -Find the Sample [how to display custom tooltip for annotations using MouseOver event](https://stackblitz.com/edit/ztmvjx-byzwvq?file=index.js) \ No newline at end of file +Sample: [How to display a custom tooltip for annotations using mouseover](https://stackblitz.com/edit/ztmvjx-byzwvq?file=index.js) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/download-document-on-window-closing.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/download-document-on-window-closing.md index 4b5e37337..2176de2f1 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/download-document-on-window-closing.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/download-document-on-window-closing.md @@ -1,21 +1,20 @@ --- layout: post -title: Download document on window closing in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Download document on window closing in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Download document on window closing in JavaScript PDF Viewer control | Syncfusion +description: Learn how to download a PDF document when the browser window closes or refreshes in the Syncfusion JavaScript PDF Viewer control by handling the onbeforeunload event. platform: document-processing -control: Download document on window closing -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Download document on window closing in Javascript Pdfviewer control +# Download document on window closing in JavaScript PDF Viewer -The PDF Viewer library allows you to download a PDF document rendered in the viewer while refreshing the window or clicking the close window using the [onbeforeunload](https://ej2.syncfusion.com/documentation/api/pdfviewer/#unload) event. +The JavaScript PDF Viewer can automatically download the loaded PDF document when the browser window is refreshed or closed by handling the [onbeforeunload](https://ej2.syncfusion.com/documentation/api/pdfviewer/#unload) event. -**Step 1:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) to create a simple PDF Viewer sample. +**Step 1:** Configure a working sample by following the instructions in [Getting started with the JavaScript PDF Viewer](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/). -**Step 2:** Add the following code sample to download a PDF document while refreshing or closing the window. +**Step 2:** Add the following script to prompt the user when the window closes or refreshes and trigger the document download. ```ts @@ -33,4 +32,4 @@ window.onbeforeunload = function(e){ ``` -[View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/Download/Download%20the%20pdf%20document%20before%20closing%20window%20or%20refresh) \ No newline at end of file +[View the sample on GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/Download/Download%20the%20pdf%20document%20before%20closing%20window%20or%20refresh) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/download-start-event-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/download-start-event-js.md index 8e3816e90..432e2d95a 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/download-start-event-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/download-start-event-js.md @@ -1,21 +1,16 @@ --- layout: post -title: Controlling File Downloads in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Controlling File Downloads in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Control file downloads in JavaScript PDF Viewer | Syncfusion +description: Learn how to intercept and control file downloads in the JavaScript PDF Viewer using the downloadStart event. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Controlling File Downloads in Syncfusion PDF Viewer +# Control file downloads in PDF Viewer -In the Syncfusion PDF Viewer, we've introduced a new feature that enables you to manage file downloads more effectively. This feature allows you to intercept and potentially skip the download process of a PDF document, providing enhanced control over user interactions within your application. - -### Using the downloadStart Event - -The key to this functionality lies in the downloadStart event, which offers a mechanism to intercept the initiation of the download process. Within the event handler, you can set the cancel argument to true to programmatically prevent the download action from proceeding. +Use the downloadStart event to intercept the start of a download and optionally cancel it. In the event handler, set `args.cancel = true` to prevent the download. ```js pdfviewer.downloadStart = args => { @@ -24,8 +19,8 @@ pdfviewer.downloadStart = args => { }; ``` -By default, the cancel argument is set to `false`, indicating that the download action will proceed unless explicitly canceled by your custom logic. +By default, `args.cancel` is `false`, so the download proceeds unless explicitly canceled. -### Enhanced Flexibility +### Flexibility -By leveraging the [downloadStart](https://ej2.syncfusion.com/documentation/api/pdfviewer/#downloadstart) event and its cancel argument, you gain the ability to implement custom logic to control and potentially prevent download actions based on your application's specific requirements. This enhancement provides greater flexibility in managing user interactions with PDF documents, empowering you to tailor the experience according to your needs. \ No newline at end of file +Leverage the [downloadStart](https://ej2.syncfusion.com/documentation/api/pdfviewer/#downloadstart) event to apply custom rules for allowing or preventing downloads based on application needs. \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/enable-local-storage-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/enable-local-storage-js.md index 2071f1a1c..59e398818 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/enable-local-storage-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/enable-local-storage-js.md @@ -1,26 +1,25 @@ --- layout: post -title: Managing Local Storage in Javascript Pdfviewer control | Syncfusion -description: Learn how to manage local storage in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Manage local storage in JavaScript PDF Viewer | Syncfusion +description: Learn how to control session-specific data storage in the JavaScript PDF Viewer using the enableLocalStorage property. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Managing Local Storage in Syncfusion PDF Viewer +# Manage local storage in PDF Viewer -The Syncfusion PDF Viewer provides the `enableLocalStorage` property, which allows you to control how session-specific data is stored. You can choose to store this data in an internal collection or rely on the default session storage. +Use the `enableLocalStorage` property to control whether session-specific data is stored in session storage (default) or an internal in-memory collection. -### Using the enableLocalStorage Property +### Use enableLocalStorage -Set the `enableLocalStorage` property to manage whether the PDF Viewer uses session storage (default) or an internal collection. When set to `true`, session-specific data is kept in memory. Otherwise, session storage is used. +Set `enableLocalStorage` to manage storage behavior. When `true`, data is kept in memory; otherwise, session storage is used. ```js var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', - resourceUrl: "https://cdn.syncfusion.com/ej2/28.1.33/dist/ej2-pdfviewer-lib", + resourceUrl: "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -29,14 +28,10 @@ ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearc pdfviewer.appendTo('#PdfViewer'); ``` -### Impact and Considerations +### Considerations -- **Increased Memory Usage**: Setting `enableLocalStorage` to `true` can increase memory usage, particularly with larger documents or those containing many interactive elements, such as form fields and annotations. -- **Avoiding Memory Leaks**: It is crucial to properly dispose of the PDF Viewer instance when it's no longer needed to prevent memory leaks, especially when using in-memory storage. -- **Default Behavior**: By default, this property is set to `false`, meaning the session storage mechanism is utilized unless explicitly changed. +- Memory usage can increase when using in-memory storage with large documents or many interactive elements. +- Dispose of the PDF Viewer instance when no longer needed to avoid memory leaks. +- Default: `enableLocalStorage` is `false`, so session storage is used unless changed. -### Enhanced Control - -Leveraging the `enableLocalStorage` property provides greater flexibility in managing how data is stored during a session, allowing you to optimize performance and storage based on your application’s specific requirements. - -[View Sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to) \ No newline at end of file +[View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/enable-resize-text.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/enable-resize-text.md index 912e6e0a0..461660a24 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/enable-resize-text.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/enable-resize-text.md @@ -1,19 +1,18 @@ --- layout: post -title: Enable resize text in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Enable resize text in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Enable resize for text markup in JavaScript PDF Viewer | Syncfusion +description: Learn how to enable the text markup resizer in the JavaScript PDF Viewer using the enableTextMarkupResizer property. platform: document-processing -control: Enable resize text -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Enable resize text in Javascript Pdfviewer control +# Enable resize for text markup annotations -To enable the resizer for the text markup annotation in Syncfusion PDF viewer, you can use the [**enableTextMarkupResizer**](https://ej2.syncfusion.com/documentation/api/pdfviewer/#enabletextmarkupresizer) property. Default value of the property is false. +Enable the resizer for text markup annotations using [enableTextMarkupResizer](https://ej2.syncfusion.com/documentation/api/pdfviewer/#enabletextmarkupresizer). The default value is `false`. -Here is an example of how you can enable the resizer for the text markup annotation: +Example: Enable resizer ```javascript @@ -22,4 +21,4 @@ viewer.enableTextMarkupResizer = true; ``` -Find the sample [how to enable the resizer for the Text Markup annotation](https://stackblitz.com/edit/qzf6bk-xsk9pf?devtoolsheight=33&file=index.js) +Sample: [Enable the resizer for text markup annotations](https://stackblitz.com/edit/qzf6bk-xsk9pf?devtoolsheight=33&file=index.js) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/enable-text-selection-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/enable-text-selection-js.md index 4448c7d48..ce13d533a 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/enable-text-selection-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/enable-text-selection-js.md @@ -1,26 +1,25 @@ --- layout: post -title: Enable or Disable Text Selection in Javascript Pdfviewer control | Syncfusion -description: Learn how to enable text selection in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Enable or disable text selection in JavaScript PDF Viewer | Syncfusion +description: Learn how to enable or disable text selection in the JavaScript PDF Viewer using the enableTextSelection property. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Enable or Disable Text Selection in Syncfusion PDF Viewer +# Enable or disable text selection in PDF Viewer -The Syncfusion PDF Viewer provides the `enableTextSelection` property, which allows you to control whether users can select text within the displayed PDF document. This feature can be toggled programmatically during runtime. +Use the `enableTextSelection` property to control whether users can select text in the displayed PDF. This setting can be configured at initialization and toggled at runtime. -## Configure Text Selection on Initialization +## Configure on initialization -You can set the initial text selection behavior when initializing the PDF Viewer control by configuring the `enableTextSelection` property. +Set initial behavior when instantiating the PDF Viewer. ```js var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', - resourceUrl: "https://cdn.syncfusion.com/ej2/30.1.37/dist/ej2-pdfviewer-lib", + resourceUrl: "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", enableTextSelection: false, // Disable text selection initially }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, @@ -28,9 +27,9 @@ ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearc pdfviewer.appendTo('#PdfViewer'); ``` -## Toggle Text Selection Dynamically +## Toggle dynamically -You can change the text selection behavior at runtime using buttons, menu options, or other UI elements: +Change the behavior at runtime using buttons or other UI. ```html @@ -50,14 +49,14 @@ document.getElementById('disableTextSelection').addEventListener('click', functi }); ``` -## Use Cases and Considerations +## Use cases and considerations -- **Document Protection**: Disabling text selection helps prevent unauthorized copying of sensitive content. -- **Read-only Documents**: In scenarios where documents are meant for viewing only, disabling text selection can provide a cleaner user experience. -- **Interactive Applications**: Toggle text selection based on user roles or document states in complex applications. +- Document protection: Disable text selection to help prevent copying sensitive content. +- Read-only documents: Provide a cleaner viewing experience by preventing selection. +- Interactive apps: Toggle selection based on user roles or document states. -## Default Behavior +## Default behavior -By default, text selection is enabled in the PDF Viewer. Set the `enableTextSelection` property to `false` explicitly if you want to disable this functionality. +Text selection is enabled by default. Set `enableTextSelection` to `false` to disable it. -[View Sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to) \ No newline at end of file +[View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/export-as-image-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/export-as-image-js.md index 499eaeebb..98750f06e 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/export-as-image-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/export-as-image-js.md @@ -1,23 +1,22 @@ --- layout: post -title: Export As Image in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Export As Image in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Export pages as images in JavaScript PDF Viewer | Syncfusion +description: Learn how to export pages as Base64-encoded images in the JavaScript PDF Viewer using exportAsImage and exportAsImages. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Export As Image Javascript Pdfviewer control +# Export pages as images in JavaScript PDF Viewer -The PDF Viewer library allows you to export specified pages as a Base64-encoded image string using the **exportAsImage()** method and exporting a range of pages as Base64-encoded image strings using the **exportAsImages()** method. +Export a single page as a Base64-encoded image using `exportAsImage()` or export a range of pages using `exportAsImages()`. -The following steps are used to exportAsImage. +### Steps to export pages as images **Step 1:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) to create a simple PDF Viewer sample. -**Step 2:** The following code snippet to implement the functionality for exporting a specified page as a Base64-encoded image string or exporting a range of pages as Base64-encoded image strings. +**Step 2:** Use the following code to export a specified page as a Base64-encoded image or a range of pages as Base64-encoded images. ``` @@ -38,8 +37,7 @@ document.getElementById('exportAsImage').addEventListener('click', () => { ``` -Similarly, to code snippet for exports the specified page as a Base64-encoded image string, allowing for custom image size: - +Export a specified page as a Base64-encoded image with a custom size: ``` @@ -60,8 +58,7 @@ document.getElementById('exportAsImageWithSize').addEventListener('click', () => }); ``` -Similarly, to code snippet for exports the range of pages as Base64-encoded image strings: - +Export a range of pages as Base64-encoded image strings: ``` @@ -82,8 +79,7 @@ document.getElementById('exportAsImages').addEventListener('click', () => { ``` -Similarly, to code snippet for exports the range of pages as Base64-encoded image strings, allowing for custom image size: - +Export a range of pages as Base64-encoded images with a custom size: ``` @@ -105,4 +101,4 @@ document.getElementById('exportAsImagesWithSize').addEventListener('click', () = ``` -By following these steps, you can successfully integrate and use the export as image API in the EJ2 PDF Viewer. \ No newline at end of file +These APIs enable exporting viewer pages as images for further processing or download. \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/extract-text-completed-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/extract-text-completed-js.md index fc6363d08..f84f36413 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/extract-text-completed-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/extract-text-completed-js.md @@ -1,19 +1,17 @@ --- layout: post -title: extractTextCompleted Event in Javascript Pdfviewer control | Syncfusion -description: Learn here all about extractTextCompleted Event in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: extractTextCompleted event in JavaScript PDF Viewer | Syncfusion +description: Learn how to use the extractTextCompleted event and isExtractText property in the Syncfusion JavaScript PDF Viewer to extract text and bounds. platform: document-processing -control: Extract text -publishingplatform: Javascript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Extract text in Javascript Pdfviewer control using extractTextCompleted event +# Use extractTextCompleted to extract text in JavaScript PDF Viewer -To extract text in Syncfusion PDF viewer, you can use the [**isExtractText**](https://ej2.syncfusion.com/documentation/api/pdfviewer/#isextracttext) property and [**extractTextCompleted**](https://ej2.syncfusion.com/documentation/api/pdfviewer/#extracttextcompleted) event.This allows you to extract the text from a page along with the bounds. +Use the [isExtractText](https://ej2.syncfusion.com/documentation/api/pdfviewer/#isextracttext) property and the [extractTextCompleted](https://ej2.syncfusion.com/documentation/api/pdfviewer/#extracttextcompleted) event to extract page text along with bounds. -Here is an example of how you can use the **isExtractText** property and **extractTextCompleted** event: +The following example shows how to enable text extraction and handle the completion event: ```javascript @@ -32,4 +30,4 @@ viewer.extractTextCompleted = args => { ``` -Find the sample [how to extract Text](https://stackblitz.com/edit/kzd4jd-dcser9?file=index.js) \ No newline at end of file +Find the sample: [How to extract text](https://stackblitz.com/edit/kzd4jd-dcser9?file=index.js) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/extract-text-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/extract-text-js.md index 739ff2c42..61c903bef 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/extract-text-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/extract-text-js.md @@ -1,40 +1,35 @@ --- layout: post -title: Extract Text in Syncfusion Javascript Pdfviewer Control | Syncfusion -description: Learn about the Extract Text in Syncfusion #Platform_Name## Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Use extractText in JavaScript PDF Viewer | Syncfusion +description: Learn how to use the extractText method in the Syncfusion JavaScript PDF Viewer to extract text and bounds from one or more pages. platform: document-processing -control: Extract Text -publishingplatform: Javascript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Extract Text Method in Syncfusion PdfViewer Control +# Extract text using extractText in JavaScript PDF Viewer -The `extractText` method of the Syncfusion PdfViewer control enables text extraction from one or more pages in a PDF document. This method is useful for retrieving the text content along with its associated data, such as the bounds of each text element. +The `extractText` method extracts text from one or more pages and can return plain text or text with bounds for each element. -### extractText Method -The extractText method retrieves text data from the specified page(s) of a PDF document. It can extract text from one page, a range of pages, or even provide detailed text data, depending on the options specified. +### extractText method +Retrieves text data from one page or a range of pages based on the specified options. #### Parameters: **startIndex:** The starting page index for text extraction (0-based index). -**endIndex Or isOptions:** This can either be the ending page index for the text extraction (for extracting from multiple pages) or an option specifying text extraction criteria for a single page. +**endIndex or isOptions:** Either the ending page index (for multiple pages) or an option specifying extraction criteria for a single page. -**options (optional):** Specifies additional options, such as extracting plain text `TextOnly` or more detailed text data `TextAndBounds`. You can specify various options for text extraction. These options determine whether you want to extract plain text, text with bounds, or detailed text data. +**options (optional):** Additional options, such as `TextOnly` for plain text or `TextAndBounds` for detailed text data with bounds. -***TextOnly:*** Extracts only the plain text content without bounds or additional information. - -***TextAndBounds:*** Extracts text content along with its bounds (coordinates) within the PDF. +- TextOnly: Extracts only plain text without bounds. +- TextAndBounds: Extracts text with bounds (coordinates). #### Returns: -The method returns a Promise that resolves to an object containing two properties: - -**textData:** An array of TextDataSettingsModel objects, each representing the details of the extracted text (including bounds, page text, etc.). +Returns a Promise with: +- textData: An array of TextDataSettingsModel with details including bounds and page text. +- pageText: A concatenated string of plain text from the specified page(s). -**pageText:** A concatenated string of plain text extracted from the specified page(s). - -### Usage of extractText in Syncfusion PdfViewer Control +### Usage of extractText in Syncfusion PDF Viewer Control Here is an example that demonstrates how to use the extractText method along with event handling: ```html @@ -46,7 +41,7 @@ Here is an example that demonstrates how to use the extractText method along wit var viewer = new ej.pdfviewer.PdfViewer({ documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', - resourceUrl: "https://cdn.syncfusion.com/ej2/29.1.33/dist/ej2-pdfviewer-lib", + resourceUrl: "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); viewer.appendTo("#pdfViewer"); @@ -67,9 +62,8 @@ document.getElementById('extractTexts').addEventListener('click', function () { }); ``` -#### Explanation: -**Single Page Extraction:** The first `extractText` call extracts text from page 1 (`startIndex = 1`), using the 'TextOnly' option for plain text extraction. - -**Multiple Pages Extraction:** The second extractText call extracts text from pages 0 through 2 (`startIndex = 0, endIndex = 2`), using the `TextOnly` option for plain text extraction. +#### Explanation +- Single page: Extracts text from page 1 (`startIndex = 1`) using `TextOnly`. +- Multiple pages: Extracts text from pages 0–2 (`startIndex = 0, endIndex = 2`) using `TextOnly`. -[View Sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to) \ No newline at end of file +[View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/extract-text-option-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/extract-text-option-js.md index 808458d77..5a170fc4f 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/extract-text-option-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/extract-text-option-js.md @@ -1,18 +1,15 @@ --- layout: post -title: Extract Text Option in Syncfusion Javascript Pdfviewer Control | Syncfusion -description: Learn about the `extractTextOption` in Syncfusion #Platform_Name## Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Configure extractTextOption in JavaScript PDF Viewer | Syncfusion +description: Learn how to use the extractTextOption property in the Syncfusion JavaScript PDF Viewer to control text extraction and memory usage. platform: document-processing -control: Extract Text Option -publishingplatform: Javascript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- +# Configure extractTextOption in JavaScript PDF Viewer -# Extract Text Option in Syncfusion Javascript Pdfviewer Control - -The `extractTextOption` property in the Syncfusion PdfViewer control allows you to optimize memory usage by controlling the level of text extraction. This setting influences the data returned in the `extractTextCompleted` event. You can select one of the following options to determine the kind of text extraction and layout information to retrieve. +The `extractTextOption` property controls how text is extracted and optimizes memory usage. It also affects the data returned in the `extractTextCompleted` event. Choose one of the following options to determine the text and layout data to retrieve. ### Available Options: @@ -30,7 +27,7 @@ The following example demonstrates how to configure the `extractTextOption` prop var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', - resourceUrl: "https://cdn.syncfusion.com/ej2/29.1.33/dist/ej2-pdfviewer-lib", + resourceUrl: "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -48,6 +45,6 @@ ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearc **extractTextOption.None:** This option does not extract or return any text or layout information. It is used to optimize memory usage when no text extraction is necessary. This setting is only relevant for the `extractTextCompleted` event and cannot be used with the `ExtractText` method. -N> Text Search: When using the ` extractTextOption.None` and `extractTextOption.TextOnly` option, the findText method will not work. Instead, you should use the findTextAsync method to perform text searches asynchronously. +N> Text search: When using the `extractTextOption.TextOnly` or `extractTextOption.None` options, the `findText` method is unavailable. Use the `findTextAsync` method to perform text searches asynchronously. -[View Sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to) \ No newline at end of file +[View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/find-text-async-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/find-text-async-js.md index dedafedd6..da5fc340a 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/find-text-async-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/find-text-async-js.md @@ -1,22 +1,20 @@ --- layout: post -title: Find Text Async in Syncfusion Javascript Pdfviewer Control | Syncfusion -description: Learn about the `findTextAsync` in Syncfusion #Platform_Name## Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Use findTextAsync in JavaScript PDF Viewer | Syncfusion +description: Learn how to search text asynchronously with findTextAsync in the Syncfusion JavaScript PDF Viewer and retrieve match bounds. platform: document-processing -control: Find Text Async -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- +# Find text with findTextAsync in JavaScript PDF Viewer -# Find Text using findTextAsync Method in Syncfusion Javascript PdfViewer Control +The `findTextAsync` method searches for a string or array of strings asynchronously and returns bounding rectangles for each match. Use it to locate text positions across the document or on a specific page. -The findTextAsync method in the Syncfusion PdfViewer control allows you to search for specific text or an array of strings asynchronously within a PDF document. The method returns the bounding rectangles for each occurrence of the search term, allowing you to find and work with text positions in the document. +Here is an example of how to use `findTextAsync`: -Here is an example of how you can use the **findTextAsync** method: - -Example 1: Search for a single string ('pdf') with a case-insensitive search across all pages +Example 1: Search for a single string ('pdf') case-insensitively across all pages ```html @@ -25,7 +23,7 @@ Example 1: Search for a single string ('pdf') with a case-insensitive search acr ```js var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', - resourceUrl: "https://cdn.syncfusion.com/ej2/29.1.33/dist/ej2-pdfviewer-lib", + resourceUrl: "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -37,7 +35,7 @@ document.getElementById('findText').addEventListener('click', function () { }); }); ``` -Example 2: Search for multiple strings (['pdf', 'the']) with a case-insensitive search across all pages +Example 2: Search for multiple strings (['pdf', 'the']) case-insensitively across all pages ```js document.getElementById('findTexts').addEventListener('click', function () { pdfviewer.textSearchModule.findTextAsync(['pdf', 'the'], false).then(res => { @@ -46,29 +44,19 @@ document.getElementById('findTexts').addEventListener('click', function () { }); ``` -### Description: +### Description The `findTextAsync` method is designed for performing an asynchronous text search within a PDF document. You can use it to search for a single string or multiple strings, with the ability to control case sensitivity. By default, the search is applied to all pages of the document. However, you can adjust this behavior by specifying the page number (pageIndex), which allows you to search only a specific page if needed. -### Parameters: - -**text (string | string[]):** - -The text or an array of texts you want to search for in the document. - -**matchCase (boolean):** +### Parameters -Indicates whether the search should be case-sensitive. -When set to true, the search will match the exact case. -When set to false, the search will ignore case differences. +**text (string | string[]):** The text or array of texts to search for in the document. -**pageIndex (optional, number):** +**matchCase (boolean):** Whether the search is case-sensitive. `true` matches exact case; `false` ignores case. -Specifies the page number (zero-based index) to search within the document. -If not provided, the search will be performed across all pages in the document. -For example, passing 0 would search only the first page of the document. +**pageIndex (optional, number):** Zero-based page index to search. If omitted, searches all pages. -### Example Workflow: +### Example workflow **findTextAsync('pdf', false):** This will search for the term "pdf" in a case-insensitive manner across all pages of the document. @@ -82,4 +70,4 @@ This will search for the term "pdf" in a case-insensitive manner only on the fir **findTextAsync(['pdf', 'the'], false, 1):** This will search for the terms "pdf" and "the" in a case-insensitive manner only on the second page (page 1). -[View Sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to) \ No newline at end of file +[View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/focus-on-a-form-field-after-loading.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/focus-on-a-form-field-after-loading.md index 4f0a97c6c..ba7fdeb62 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/focus-on-a-form-field-after-loading.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/focus-on-a-form-field-after-loading.md @@ -1,23 +1,22 @@ --- layout: post -title: Focus on a form field after loading in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Focus on a form field after loading in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Focus on a form field after loading in JavaScript PDF Viewer control | Syncfusion +description: Learn how to set focus on form fields after loading a document in the Syncfusion JavaScript PDF Viewer control by calling the focusFormField API. platform: document-processing -control: Focus on a form field after loading -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Focus on a form field after loading in Javascript Pdfviewer control +# Focus on a form field after loading in JavaScript PDF Viewer -The PDF Viewer library allows you to focus to the respective form field using the [`focusFormField()`](https://ej2.syncfusion.com/documentation/api/pdfviewer/#focusformfield) API. +The JavaScript PDF Viewer library enables setting focus on a specific form field by using the [`focusFormField()`](https://ej2.syncfusion.com/documentation/api/pdfviewer/#focusformfield) API. -The following steps are used to focus to the respective form field. +Follow these steps to bring a form field into focus during document load and on demand. -**Step 1:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) to create a simple PDF Viewer sample. +**Step 1:** Complete the configuration described in [Getting started with the JavaScript PDF Viewer](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) to build a working sample. -**Step 2:** Use the following code sample to focus to the respective form field while loading as well as in a button click. +**Step 2:** Add the following markup and code to focus the desired form field when the document loads or when a button is clicked. ``` @@ -38,4 +37,4 @@ viewer.documentLoad = (args) => { }; ``` -[View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/Form%20Fields/Focusing%20the%20form%20fields%20while%20loading). \ No newline at end of file +[View the sample on GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/Form%20Fields/Focusing%20the%20form%20fields%20while%20loading). \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/get-base64-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/get-base64-js.md index cfb132f54..6d701d67b 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/get-base64-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/get-base64-js.md @@ -1,23 +1,22 @@ --- layout: post -title: Retrieving Base64 Value in JavaScript PdfViewer | Syncfusion -description: Learn how to retrieve the Base64 value of a loaded PDF document in the Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Get Base64 from loaded PDF in JavaScript PDF Viewer | Syncfusion +description: Learn how to retrieve the Base64 value of a loaded PDF in the Syncfusion JavaScript PDF Viewer using saveAsBlob and FileReader. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Retrieving Base64 Value from a PDF in PDF Viewer +# Get Base64 value from a loaded PDF ### Overview -This guide demonstrates how to fetch the base64-encoded value of a PDF document loaded in the Syncfusion PDF Viewer using JavaScript. This is useful for sending the PDF as a base64 string or processing it in the front end. +This guide shows how to get the base64-encoded value of a PDF loaded in the Syncfusion PDF Viewer using JavaScript. This is useful for sending the PDF as a base64 string or processing it on the client. ### How to Retrieve Base64 Value -**Step 1:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) to create a simple PDF Viewer sample. +**Step 1:** Follow the steps in the [Get started with JavaScript ES5 PDF Viewer](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) guide to create a sample. **Step 2:** Create a Button in Your HTML File @@ -39,9 +38,9 @@ document.getElementById('getBase64').addEventListener('click', function() { }); ``` -**Step 4:** Retrieve Base64 of the Loaded Document +**Step 4:** Retrieve Base64 of the loaded document -Create a function that uses saveAsBlob, and convert the blob to a base64 string. +Create a function that uses `saveAsBlob`, and convert the blob to a Base64 string. ```js function base64ofloadedDocument() { @@ -58,6 +57,6 @@ function base64ofloadedDocument() { ``` ### Conclusion -By implementing these steps, you can convert a PDF document loaded in the Syncfusion PDF Viewer to a base64 string on button click, facilitating the manipulation or transfer of PDF data as needed. +By following these steps, a loaded PDF can be converted to a Base64 string on button click for transfer or processing. [View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/get-page-info-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/get-page-info-js.md index 78a4e3592..008676e75 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/get-page-info-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/get-page-info-js.md @@ -1,23 +1,22 @@ --- layout: post -title: Get Page Info in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Get Page Info in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Get page info in JavaScript PDF Viewer | Syncfusion +description: Learn how to retrieve page height, width, and rotation using getPageInfo in the Syncfusion JavaScript PDF Viewer. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Get Page Info Javascript Pdfviewer control +# Get page info in JavaScript PDF Viewer -The PDF Viewer library allows you to retrieves the information of a specified page in the viewer using the **getPageInfo()** method.This provides essential information such as the height, width and rotation. +Use the **getPageInfo()** method to retrieve information for a specified page, including height, width, and rotation. -The following steps are used to getPageInfo. +The following steps show how to use `getPageInfo`. -**Step 1:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) to create a simple PDF Viewer sample. +**Step 1:** Follow the steps in the [Get started with JavaScript ES5 PDF Viewer](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) guide to create a sample. -**Step 2:** The following code snippet to implement the functionality for retrieving height, width and rotation of a specified page in the viewer. +**Step 2:** Use the following code to get the height, width, and rotation for a specified page. ```html @@ -42,6 +41,6 @@ document.getElementById('getPageInfo').addEventListener('click', function() { ``` -By following these steps, you can successfully integrate and use the get page info API in the EJ2 PDF Viewer. +By following these steps, the page info API can be integrated and used in the EJ2 PDF Viewer. -[View Sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to) \ No newline at end of file +[View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/highlight-underline-strikeout.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/highlight-underline-strikeout.md index 25784306c..70d373129 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/highlight-underline-strikeout.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/highlight-underline-strikeout.md @@ -1,21 +1,20 @@ --- layout: post -title: Highlight underline strikeout in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Highlight underline strikeout in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Highlight, underline, and strikeout text in JavaScript PDF Viewer | Syncfusion +description: Learn how to programmatically highlight, underline, and strikeout text in the Syncfusion JavaScript PDF Viewer using setAnnotationMode. platform: document-processing -control: Highlight underline strikeout -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Highlight underline strikeout in Javascript Pdfviewer control +# Highlight, underline, and strikeout text in JavaScript PDF Viewer -The PDF Viewer library allows you to highlight, underline and strikeout text in the loaded PDF document programmatically using the [**setAnnotationMode()**](https://ej2.syncfusion.com/documentation/api/pdfviewer/annotation/#setannotationmode) method. +Use the [setAnnotationMode()](https://ej2.syncfusion.com/documentation/api/pdfviewer/annotation/#setannotationmode) method to programmatically highlight, underline, and strike through text in a loaded PDF document. -**Step 1:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) to create simple PDF Viewer sample. +**Step 1:** Follow the steps in the [Get started with JavaScript ES5 PDF Viewer](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) guide to create a sample. -**Step 2:** Add the following code snippet to highlight, underline, and strikeout text in the loaded document with button click events. +**Step 2:** Add the following code snippet to highlight, underline, and strikeout text with button click events. ```javascript @@ -34,4 +33,4 @@ The PDF Viewer library allows you to highlight, underline and strikeout text in ``` -Find the Sample [how to highlight, underline and strikeout text programmatically](https://stackblitz.com/edit/bf3k6y?devtoolsheight=33&file=index.js) \ No newline at end of file +Find the sample: [Highlight, underline, and strikeout text programmatically](https://stackblitz.com/edit/bf3k6y?devtoolsheight=33&file=index.js) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/identify-added-annotation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/identify-added-annotation.md index 0021b79d1..a3c078136 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/identify-added-annotation.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/identify-added-annotation.md @@ -1,21 +1,20 @@ --- layout: post -title: Identify added annotation in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Identify added annotation in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Identify added annotation mode in JavaScript PDF Viewer | Syncfusion +description: Learn how to determine whether an added annotation was drawn, imported, or existing using the annotationSelect event in the JavaScript PDF Viewer. platform: document-processing -control: Identify added annotation -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Identify added annotation in Javascript Pdfviewer control +# Identify added annotation mode in JavaScript PDF Viewer -The PDF Viewer library allows you to identify whether the added annotations in PDF document is UI drawn, imported or existing annotation. Annotation mode can be identified using the [**annotationAddMode**](https://ej2.syncfusion.com/documentation/api/pdfviewer/#annotationadd) property of **annotationSelect**9(https://ej2.syncfusion.com/documentation/api/pdfviewer/#annotationselect) event. +Determine whether an added annotation was UI-drawn, imported, or existing using the [annotationAddMode](https://ej2.syncfusion.com/documentation/api/pdfviewer/#annotationadd) property of the [annotationSelect](https://ej2.syncfusion.com/documentation/api/pdfviewer/#annotationselect) event. -**Step 1:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) to create simple PDF Viewer sample. +**Step 1:** Follow the steps in the [Get started with JavaScript ES5 PDF Viewer](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) guide to create a sample. -**Step 2:** The following code snippet explains how to identify added annotation mode. +**Step 2:** Use the following code to identify the added annotation mode. ```javascript @@ -25,4 +24,4 @@ console.log(args.annotationAddMode); ``` -Find the Sample [how to identify added annotation mode](https://stackblitz.com/edit/xntzu8?devtoolsheight=33&file=index.js) +Find the sample: [Identify added annotation mode](https://stackblitz.com/edit/xntzu8?devtoolsheight=33&file=index.js) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/import-annotation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/import-annotation.md index dbcde76c7..e3f2711c6 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/import-annotation.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/import-annotation.md @@ -1,23 +1,22 @@ --- layout: post -title: Import annotation in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Import annotation in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Import annotations in JavaScript PDF Viewer | Syncfusion +description: Learn how to import annotations in the Syncfusion JavaScript PDF Viewer using the importAnnotations method. platform: document-processing -control: Import annotation -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Import annotation in Javascript Pdfviewer control +# Import annotations in JavaScript PDF Viewer -To import annotations into a Syncfusion PDF Viewer when loading a PDF document, you can use the [**importAnnotations()**](https://ej2.syncfusion.com/documentation/api/pdfviewer/#importannotation) method of the PDF Viewer. This method allows you to import annotations from a file or a string in the PDF Viewer. +Use the [importAnnotations()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#importannotation) method to import annotations from a file or a string when loading a PDF document. -Here is an example of how you can use the [**importAnnotations()**](https://ej2.syncfusion.com/documentation/api/pdfviewer/#importannotation) method to import annotations when loading a PDF document: +The following example shows how to import annotations during document load: -**Step 1:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) to create simple PDF Viewer sample. +**Step 1:** Follow the steps in the [Getting started with JavaScript ES5 PDF Viewer](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) guide to create a sample. -**Step 2:** Add the following code snippet to import annotations on load PDF document. +**Step 2:** Add the following code to import annotations when a PDF is loaded. ```javascript @@ -115,9 +114,9 @@ viewer.importAnnotation({ ``` -In this example, the PDF Viewer is first used to load the PDF document from a file. The **importAnnotations()** method is then used to import annotations from a string. The imported annotations will be added to the PDF Viewer and displayed along with the document. +In this example, the PDF Viewer loads a document and then imports annotations from a string. The imported annotations are added to the viewer and displayed along with the document. -Alternatively, we can import annotations from a file in JSON or XFDF format. +Alternatively, annotations can be imported from a file in JSON or XFDF format. ```javascript @@ -127,4 +126,4 @@ document.getElementById('import').addEventListener('click', function() { ``` -Find the sample [how to import annotations on loading a PDF Document](https://stackblitz.com/edit/eus1kk?file=index.js) \ No newline at end of file +Find the sample: [Import annotations on loading a PDF document](https://stackblitz.com/edit/eus1kk?file=index.js) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/import-export-annotation-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/import-export-annotation-js.md index 363894902..eb650984f 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/import-export-annotation-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/import-export-annotation-js.md @@ -1,23 +1,22 @@ --- layout: post -title: Import export annotation in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Import export annotation in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Import and export annotations in JavaScript PDF Viewer | Syncfusion +description: Learn how to import and export annotations as objects, JSON, or XFDF in the Syncfusion JavaScript PDF Viewer. platform: document-processing -control: Import export annotation -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Import export annotation in Javascript Pdfviewer control +# Import and export annotations in JavaScript PDF Viewer -The PDF Viewer library allows you to import annotations from objects or streams instead of loading it as a file. To import such annotation objects, the PDF Viewer control must export the PDF annotations as objects using the [**ExportAnnotationsAsObject()**](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#exportannotationsasobject) method. Only the annotation objects that are exported from the PDF Viewer can be imported. +Import annotations from objects or streams instead of files. To import such objects, first export annotations as objects using the [exportAnnotationsAsObject()](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#exportannotationsasobject) method. Only objects exported from the PDF Viewer can be imported. -The following steps are used to import and export annotations in various formats such as objects, JSON, and XFDF. +Use the following steps to import and export annotations as objects, JSON, or XFDF. -**Step 1:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) to create a simple PDF Viewer sample. +**Step 1:** Follow the steps provided in this [guide](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) to create a simple PDF Viewer sample. -**Step 2:** Use the following code snippet to perform import and export annotation. +**Step 2:** Use the following code to perform import and export operations. ``` @@ -53,4 +52,4 @@ document.getElementById('import').addEventListener('click', () => { ``` -[View Sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to) \ No newline at end of file +[View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/load-documents.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/load-documents.md index e85cc63b2..ddee5ea59 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/load-documents.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/load-documents.md @@ -1,23 +1,22 @@ --- layout: post -title: Load documents in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Load documents in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Load documents dynamically in JavaScript PDF Viewer | Syncfusion +description: Learn how to load or switch PDF documents dynamically in the Syncfusion JavaScript PDF Viewer using the load method. platform: document-processing -control: Load documents -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Load documents in Javascript Pdfviewer control +# Load documents dynamically in JavaScript PDF Viewer -The PDF Viewer library allows to switch or load the PDF documents dynamically after the initial load operation. To achieve this, load the PDF document as a base64 string or file name in PDF Viewer control using the [**Load()**](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#load) method dynamically. +Load or switch PDF documents dynamically after the initial load. Use the [load](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#load) method to load a PDF by Base64 string or file name. -The following steps are used to load the PDF document dynamically. +The following steps show how to load a PDF dynamically. -**Step 1:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) to create a simple PDF Viewer sample. +**Step 1:** Follow the steps in the [Get started with JavaScript ES5 PDF Viewer](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) guide to create a sample. -**Step 2:** Use the following code snippet to load PDF document using base64 string. +**Step 2:** Use the following code to load a PDF using a Base64 string. ``` @@ -31,7 +30,7 @@ document.getElementById('load1').addEventListener('click', () => { } ``` -**Step 3:** Use the following code snippet to load PDF document using document name. +**Step 3:** Use the following code to load a PDF by document name. ``` @@ -45,4 +44,4 @@ document.getElementById('load2').addEventListener('click', () => { ``` -Find the sample, [how to load PDF documents dynamically](https://stackblitz.com/edit/w82pgd?devtoolsheight=33&file=index.js) \ No newline at end of file +Find the sample: [Load PDF documents dynamically](https://stackblitz.com/edit/w82pgd?devtoolsheight=33&file=index.js) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/min-max-zoom-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/min-max-zoom-js.md index 2d94a5c39..8e6f5d4f0 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/min-max-zoom-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/min-max-zoom-js.md @@ -1,32 +1,31 @@ --- layout: post -title: Minimum and Maximum Zoom in Javascript PDF Viewer control | Syncfusion -description: Learn here all about Minimum and Maximum Zoom in Syncfusion Javascript PDF Viewer control of Syncfusion Essential JS 2 and more. +title: Configure minZoom and maxZoom in JavaScript PDF Viewer | Syncfusion +description: Learn how to configure minimum and maximum zoom levels using minZoom and maxZoom in the Syncfusion JavaScript PDF Viewer. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Minimum and Maximum Zoom Properties +# Configure minZoom and maxZoom in the PDF Viewer -The Syncfusion PDF Viewer provides the ability to control zoom levels for viewing PDF documents. The [minZoom](https://ej2.syncfusion.com/documentation/api/pdfviewer/#minzoom) and [maxZoom](https://ej2.syncfusion.com/documentation/api/pdfviewer/#maxzoom) properties enable developers to set the minimum and maximum zoom levels, ensuring a consistent and controlled viewing experience. +Control zoom levels in the PDF Viewer using the [minZoom](https://ej2.syncfusion.com/documentation/api/pdfviewer/#minzoom) and [maxZoom](https://ej2.syncfusion.com/documentation/api/pdfviewer/#maxzoom) properties to ensure a consistent viewing experience. ### minZoom -The [minZoom](https://ej2.syncfusion.com/documentation/api/pdfviewer/#minzoom) property specifies the minimum zoom percentage allowed in the PDF Viewer. This ensures that users cannot zoom out beyond a certain limit, which helps maintain readability and performance. Developers can set the `minZoom` property programmatically, defining the minimum zoom level based on the application's requirements. This is particularly useful for preventing users from zooming out too much, which could make the content difficult to read. +Specifies the minimum zoom percentage allowed. Prevents zooming out beyond a set limit to maintain readability and performance. ### maxZoom -The [maxZoom](https://ej2.syncfusion.com/documentation/api/pdfviewer/#maxzoom) property defines the maximum zoom percentage allowed in the PDF Viewer. By setting this property, developers can prevent users from zooming in too much, helping to avoid performance issues and maintain a smooth viewing experience. The `maxZoom` property can be set programmatically to control the upper limit of the zoom level. This is useful for applications where extremely high zoom levels might degrade performance or user experience. +Defines the maximum zoom percentage allowed. Prevents excessive zooming that could affect performance and usability. {% tabs %} {% highlight ts tabtitle="Standalone" %} var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", maxZoom : 100, minZoom : 10, @@ -51,7 +50,7 @@ pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} -#### Restrict Zoom Percentage on Mobile Devices +#### Restrict zoom percentage on mobile devices You can easily restrict the zoom percentage on mobile devices using the [minZoom](https://ej2.syncfusion.com/documentation/api/pdfviewer/#minzoom) and [maxZoom](https://ej2.syncfusion.com/documentation/api/pdfviewer/#maxzoom) properties. This feature allows you to set specific limits for zooming, ensuring smoother scrolling performance and efficient document loading on mobile devices. By controlling the zoom levels, you can provide a better user experience across different devices. @@ -60,7 +59,7 @@ You can easily restrict the zoom percentage on mobile devices using the [minZoom var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib" + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib" }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -100,4 +99,4 @@ pdfviewer.documentLoad = (): void => { {% endhighlight %} {% endtabs %} -By implementing this, you ensure that the maximum zoom percentage on mobile devices is limited to 200% and the minimum zoom percentage is set to 10%. This prevents performance issues that may arise from excessive zooming on mobile platforms. \ No newline at end of file +This limits maximum zoom to 200% and minimum zoom to 10% on mobile devices, helping prevent performance issues from excessive zooming. \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/open-bookmark-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/open-bookmark-js.md index 83951f7b7..5b38e5e87 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/open-bookmark-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/open-bookmark-js.md @@ -1,21 +1,20 @@ --- layout: post -title: Open Bookmark in Javascript PDF Viewer control | Syncfusion -description: Learn here all about Open Bookmark in Syncfusion Javascript PDF Viewer control of Syncfusion Essential JS 2 and more. +title: Open or close the Bookmark pane programmatically in JavaScript PDF Viewer | Syncfusion +description: Learn how to open and close the Bookmark pane programmatically in the Syncfusion JavaScript PDF Viewer using openBookmarkPane and closeBookmarkPane. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Open and Close Bookmark pane programmatically +# Open or close the Bookmark pane programmatically -The PDF Viewer library allows you to open the Bookmark pane programmatically using the **openBookmarkPane()** method. +Open the Bookmark pane programmatically using the `openBookmarkPane()` method. The following steps are used to open the Bookmark. -**Step 1:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample. +**Step 1:** Follow the steps in the [Get started with JavaScript ES5 PDF Viewer](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) guide to create a sample. **Step 2:** Insert the following code snippet to implement the functionality for opening the Bookmark pane: @@ -30,7 +29,7 @@ document.getElementById('openBookmark').addEventListener('click', () => { }); ``` -Similarly, to close the Bookmark pane programmatically, employ the following code snippet: +To close the Bookmark pane programmatically, use the following code: ```html diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/open-thumbnail-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/open-thumbnail-js.md index 6ce50403d..85b6350b9 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/open-thumbnail-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/open-thumbnail-js.md @@ -1,21 +1,20 @@ --- layout: post -title: Open thumbnail js in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Open thumbnail js in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Open the thumbnail pane programmatically in JavaScript PDF Viewer | Syncfusion +description: Learn how to open the thumbnail pane programmatically in the Syncfusion JavaScript PDF Viewer using openThumbnailPane. platform: document-processing -control: Open thumbnail js -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Open thumbnail js in Javascript Pdfviewer control +# Open the thumbnail pane programmatically -The PDF Viewer library allows you to open the thumbnail pane programmatically using the [**openThumbnailPane()**](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/thumbnailView/#openthumbnailpane) method. +Open the thumbnail pane programmatically using the [openThumbnailPane()](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/thumbnailView/#openthumbnailpane) method. The following steps are used to open the thumbnail. -**Step 1:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) to create a simple PDF Viewer sample. +**Step 1:** Follow the steps in the [Get started with JavaScript ES5 PDF Viewer](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) guide to create a sample. **Step 2:** Use the following code snippet to open thumbnail. @@ -30,4 +29,4 @@ document.getElementById('openThumbnail').addEventListener('click', () => { }); ``` -Find the sample, [how to open the thumbnail pane programmatically](https://stackblitz.com/edit/ejvemx?file=index.js) \ No newline at end of file +Find the sample: [Open the thumbnail pane programmatically](https://stackblitz.com/edit/ejvemx?file=index.js) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/overlapped-annotations.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/overlapped-annotations.md index b1d04033f..3fcb75219 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/overlapped-annotations.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/overlapped-annotations.md @@ -1,19 +1,18 @@ --- layout: post -title: Overlapped annotations in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Overlapped annotations in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Get overlapped annotations on click in JavaScript PDF Viewer | Syncfusion +description: Learn how to get overlapped annotations on click using the annotationSelect event in the Syncfusion JavaScript PDF Viewer. platform: document-processing -control: Overlapped annotations -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Overlapped annotations in Javascript Pdfviewer control +# Get overlapped annotations on click in JavaScript PDF Viewer -To get the overlapped annotations on a mouse click in a Syncfusion PDF Viewer, you can use the [**annotationCollection**](https://ej2.syncfusion.com/documentation/api/pdfviewer/#annotationcollection) property of [**annotationSelect**](https://ej2.syncfusion.com/documentation/api/pdfviewer/#annotationselect) event.This event is triggered when the user clicks on an annotation in the PDF document. +Use the [annotationCollection](https://ej2.syncfusion.com/documentation/api/pdfviewer/#annotationcollection) property of the [annotationSelect](https://ej2.syncfusion.com/documentation/api/pdfviewer/#annotationselect) event to get overlapped annotations when the user clicks an annotation. -Here is an example of how you can use the [**annotationSelect**](https://ej2.syncfusion.com/documentation/api/pdfviewer/#annotationselect) event to get the overlapped annotations on a mouse click in a Syncfusion PDF Viewer: +The following example shows how to access overlapped annotations on click: ```javascript @@ -24,4 +23,4 @@ viewer.annotationSelect =(args) =>{ ``` -Find the sample [how to get the overlapped annotations on mouse click](https://stackblitz.com/edit/a93cem-lprlap?devtoolsheight=33&file=index.js) \ No newline at end of file +Find the sample: [Get overlapped annotations on click](https://stackblitz.com/edit/a93cem-lprlap?devtoolsheight=33&file=index.js) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/pagerenderstarted-pagerendercompleted-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/pagerenderstarted-pagerendercompleted-js.md index d1a123603..903d7c1ac 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/pagerenderstarted-pagerendercompleted-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/pagerenderstarted-pagerendercompleted-js.md @@ -1,25 +1,24 @@ --- layout: post -title: Rendering events in | Syncfusion -description: Learn here all about the pageRenderInitiate and pageRenderComplete event in Syncfusion Javascript PDF Viewer component of Syncfusion Essential JS 2 and more. +title: Handle pageRenderInitiate and pageRenderComplete in JavaScript PDF Viewer | Syncfusion +description: Learn how to use the pageRenderInitiate and pageRenderComplete events in the Syncfusion JavaScript PDF Viewer during page rendering. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# PageRenderInitiate and PageRenderComplete event +# Handle pageRenderInitiate and pageRenderComplete events -In Syncfusion PDF Viewer, [pageRenderInitiate](https://ej2.syncfusion.com/documentation/api/pdfviewer/#pagerenderinitiate) and [pageRenderComplete](https://ej2.syncfusion.com/documentation/api/pdfviewer/#pagerendercomplete) actions are events that occur during the rendering process of PDF documents. +In the Syncfusion PDF Viewer, the [pageRenderInitiate](https://ej2.syncfusion.com/documentation/api/pdfviewer/#pagerenderinitiate) and [pageRenderComplete](https://ej2.syncfusion.com/documentation/api/pdfviewer/#pagerendercomplete) events occur during page rendering. **pageRenderInitiate** -The pageRenderInitiate event is triggered when the rendering of a page in the PDF document begins. This event provides developers with an opportunity to perform any necessary initialization or setup before the rendering of the page content commences. It can be utilized to prepare resources, set up rendering parameters, or execute any other actions required before the page rendering process starts. +Triggered when page rendering begins. Use this event to initialize or set up resources before rendering starts. **pageRenderComplete** -The pageRenderComplete event is triggered when the rendering of a page in the PDF document is completed. This event allows developers to perform cleanup tasks or finalize rendering-related processes after the rendering of the page content finishes. It can be used to release resources, finalize rendering settings, or handle any post-rendering tasks necessary for the application. +Triggered when page rendering completes. Use this event to perform cleanup or finalize rendering-related tasks. ```js pdfviewer.pageRenderInitiate = args => { @@ -35,6 +34,6 @@ pdfviewer.pageRenderComplete = args => { }; ``` -The provided code demonstrates how to subscribe to the [pageRenderInitiate](https://ej2.syncfusion.com/documentation/api/pdfviewer/#pagerenderinitiate) and [pageRenderComplete](https://ej2.syncfusion.com/documentation/api/pdfviewer/#pagerendercomplete) events in the Syncfusion PDF Viewer component. +The provided code demonstrates how to subscribe to these events in the Syncfusion PDF Viewer component. [View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to/PageRenderStarted%20and%20PageRenderCompleted%20event) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/print-documents.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/print-documents.md index 4471590e0..adf7d5f78 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/print-documents.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/print-documents.md @@ -1,21 +1,20 @@ --- layout: post -title: Print documents in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Print documents in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Print a document in JavaScript PDF Viewer | Syncfusion +description: Learn how to programmatically print a PDF document using the print method in the Syncfusion JavaScript PDF Viewer. platform: document-processing -control: Print documents -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Print documents in Javascript Pdfviewer control +# Print a document in JavaScript PDF Viewer -The PDF Viewer library allows you to print the PDF document programmatically using the [**print()**](https://ej2.syncfusion.com/documentation/api/pdfviewer/#print) method in the **PrintModule**. +Print a PDF document programmatically using the [print](https://ej2.syncfusion.com/documentation/api/pdfviewer/#print) method in the Print module. The following steps are used to print the PDF document programmatically. -**Step 1:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) to create a simple PDF Viewer sample. +**Step 1:** Follow the steps in the [Get started with JavaScript ES5 PDF Viewer](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) guide to create a sample. **Step 2:** Add the following code snippet to perform the print operation. @@ -30,4 +29,4 @@ document.getElementById('print').addEventListener('click', ()=> { }); ``` -Find the Sample, [how to print the PDF document programmatically](https://stackblitz.com/edit/rawhaj?devtoolsheight=33&file=index.js) \ No newline at end of file +Find the sample: [Print the PDF document programmatically](https://stackblitz.com/edit/rawhaj?devtoolsheight=33&file=index.js) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/resolve-unable-to-find-an-entry-point-error.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/resolve-unable-to-find-an-entry-point-error.md index dd9c63179..d185e435d 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/resolve-unable-to-find-an-entry-point-error.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/resolve-unable-to-find-an-entry-point-error.md @@ -1,27 +1,26 @@ --- layout: post -title: Resolve unable to find an entry point error in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Resolve unable to find an entry point error in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Resolve “unable to find an entry point” error | Syncfusion +description: Learn how to resolve the “unable to find an entry point” error after upgrading the Pdfium package in the Syncfusion JavaScript PDF Viewer. platform: document-processing -control: Resolve unable to find an entry point error -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Resolve unable to find an entry point error in Javascript Pdfviewer control +# Resolve “unable to find an entry point” error -From the release of version **21.1.0.35 (2023 Volume 1)** of Essential Studio, the Pdfium package has been upgraded to improve various functionalities like text search, text selection, rendering, and even performance. If you are updating your project to this version of the Syncfusion PDF Viewer, you may encounter the **"Web-Service is not listening"** error. The Network tab can help you identify the root cause of the issue, which is typically caused by an old version of pdfium assembly being referenced in the local web service project. Below are the assemblies to be referred to in the respective operating systems. +Starting with **21.1.0.35 (2023 Volume 1)**, the Pdfium package was upgraded to improve text search, selection, rendering, and performance. After upgrading, the PDF Viewer may display a **“Web-Service is not listening”** error. In most cases, the Network tab reveals that an outdated Pdfium assembly is referenced in the local web service project. Ensure the correct native assembly is deployed for the target OS: -* Windows – pdfium.dll -* Linux – libpdfium.so -* OSX – libpdfium.dylib +- Windows: pdfium.dll +- Linux: libpdfium.so +- macOS: libpdfium.dylib ![Error information in the Network tab](../how-to/images/ErrorinformationuintheNetworkTab.png) -## To solve this issue, you should follow the below steps +## Resolution steps -1. Clear the bin and object files of the web-service project. -2. Re-publish the web-service project. +1. Delete the bin and obj folders in the web service project. +2. Rebuild and republish the web service. -N>Note: If you are hosting your application in Azure, AWS, or in Linux environments, delete the older published files and republish the application. \ No newline at end of file +N> If hosting in Azure, AWS, or Linux environments, remove old published files on the server before republishing. \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/restricting-zoom-in-mobile-mode-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/restricting-zoom-in-mobile-mode-js.md index 6304106b2..d3b4a2a36 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/restricting-zoom-in-mobile-mode-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/restricting-zoom-in-mobile-mode-js.md @@ -1,24 +1,23 @@ --- layout: post -title: Restrict Zoom Percentage in Javascript Pdfviewer control | Syncfusion -description: Learn here all how to restrict zoom percentage in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Restrict zoom percentage on mobile devices | Syncfusion +description: Learn how to restrict zoom percentage on mobile devices using minZoom and maxZoom in the Syncfusion JavaScript PDF Viewer. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# How to Restrict Zoom Percentage on Mobile Devices +# Restrict zoom percentage on mobile devices -In Syncfusion PDF Viewer, you can easily restrict the zoom percentage on mobile devices using the **maxZoom** and **minZoom** property. This feature allows you to set specific limits for zooming, ensuring smoother scrolling performance and efficient document loading, on mobile devices. +Restrict zoom on mobile devices using the `maxZoom` and `minZoom` properties. This improves scrolling performance and document loading on mobile. {% tabs %} {% highlight js tabtitle="Standalone" %} var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib" + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib" }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -58,6 +57,6 @@ pdfviewer.documentLoad = (): void => { {% endhighlight %} {% endtabs %} -By implementing this, you ensure that the maximum zoom percentage on mobile devices is limited to 200% and the minimum zoom percentage is set to 10%. This prevents performance issues that may arise from excessive zooming on mobile platforms. +This limits maximum zoom to 200% and minimum zoom to 10% on mobile devices, helping prevent performance issues from excessive zooming. [View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to/Restrict%20Zoom%20Percentage%20on%20Mobile%20Devices) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/select-multi-page-annotation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/select-multi-page-annotation.md index 46d4f0269..6a5a7cf7c 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/select-multi-page-annotation.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/select-multi-page-annotation.md @@ -1,19 +1,18 @@ --- layout: post -title: Select multi page annotation in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Select multi page annotation in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Select multi-page annotations in JavaScript PDF Viewer | Syncfusion +description: Learn how to select multi-page TextMarkup annotations as a single annotation using enableMultiPageAnnotation in the Syncfusion JavaScript PDF Viewer. platform: document-processing -control: Select multi page annotation -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Select multi page annotation in Javascript Pdfviewer control +# Select multi-page annotations in JavaScript PDF Viewer -To select a multi-page TextMarkup annotation as a single annotation in a Syncfusion PDF viewer, you can use by enabling the [**enableMultiPageAnnotation**](https://ej2.syncfusion.com/documentation/api/pdfviewer/#enablemultipageannotation) property. By default it is `false`. +Select a multi-page TextMarkup annotation as a single annotation by enabling the [enableMultiPageAnnotation](https://ej2.syncfusion.com/documentation/api/pdfviewer/#enablemultipageannotation) property (default: `false`). -Here is an example of how you can use the [**enableMultiPageAnnotation**](https://ej2.syncfusion.com/documentation/api/pdfviewer/#enablemultipageannotation) property to select the multi page TextMarkup annotation as a single annotation, export and import multi page annotation: +The following example shows how to select, export, and import a multi-page annotation: ```javascript @@ -32,4 +31,4 @@ document.getElementById('import').addEventListener('click', () => { ``` -Find the sample [how to select multi-page TextMarkup annotation as single annotation](https://stackblitz.com/edit/1epvap-vewcbt?file=index.js) \ No newline at end of file +Find the sample: [Select a multi-page TextMarkup annotation as a single annotation](https://stackblitz.com/edit/1epvap-vewcbt?file=index.js) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/show-custom-stamp-item-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/show-custom-stamp-item-js.md index aeb73dbf0..5ffb023fb 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/show-custom-stamp-item-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/show-custom-stamp-item-js.md @@ -1,33 +1,33 @@ --- layout: post -title: Displaying Custom Items in Custom Stamp in Syncfusion PDF Viewer -description: Learn how to display custom items in the custom stamp Dropdown in Syncfusion PDF Viewer using JavaScript. +title: Show custom items in the Custom Stamp dropdown in JavaScript PDF Viewer | Syncfusion +description: Learn how to display custom items in the Custom Stamp dropdown using customStampSettings in the Syncfusion JavaScript PDF Viewer. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Displaying Custom Items in Custom Stamp Dropdown +# Show custom items in the Custom Stamp dropdown ### Overview -This guide explains how to add and display custom items in the custom stamp dropdown menu of Syncfusion's PDF Viewer using JavaScript. This feature allows users to easily access and apply custom stamps to their PDF documents. +Add and display custom items in the Custom Stamp dropdown using JavaScript. This enables users to quickly apply personalized stamps in the PDF Viewer. -### Steps to Show Custom Items in Custom Stamp Dropdown +### Steps to show custom items in the Custom Stamp dropdown -**Step 1:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample. +**Step 1:** Follow the steps in the [Get started with JavaScript ES5 PDF Viewer](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) guide to create a sample. -**Step 2:** Configure Custom Stamp Settings +**Step 2:** Configure custom stamp settings + +Use `customStampSettings` to specify the custom stamps that should appear in the dropdown menu. -Within the PDF Viewer setup, utilize `customStampSettings` to specify the custom stamps that should appear in the dropdown menu. ```js // Initialize the PDF Viewer component var pdfviewer = new ej.pdfviewer.PdfViewer({ documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', - resourceUrl: 'https://cdn.syncfusion.com/ej2/27.2.2/dist/ej2-pdfviewer-lib', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', // Configure custom stamp settings customStampSettings: { isAddToMenu: true, @@ -48,6 +48,6 @@ var pdfviewer = new ej.pdfviewer.PdfViewer({ ``` -By following these instructions, you can successfully configure to display custom items in the custom stamp dropdown, allowing users to easily apply personalized stamps to their documents. +By following these steps, the Custom Stamp dropdown will display the configured items, allowing users to apply personalized stamps to documents. [View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/show-hide-annotation-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/show-hide-annotation-js.md index 3e6bbb3be..c024fecd7 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/show-hide-annotation-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/show-hide-annotation-js.md @@ -1,41 +1,41 @@ --- layout: post -title: Show and Hide Annotations in JavaScript PdfViewer | Syncfusion -description: Learn how to show or hide annotations in the Syncfusion Javascript PdfViewer control of Syncfusion Essential JS 2 and more. +title: Show or hide annotations in JavaScript PDF Viewer | Syncfusion +description: Learn how to toggle annotation visibility in the Syncfusion JavaScript PDF Viewer by exporting and importing annotations. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Show and Hide Annotations in PDF Viewer +# Show or hide annotations in the PDF Viewer -## Overview +### Overview -This guide demonstrates how to show or hide annotations in the Syncfusion PDF Viewer control. This functionality allows users to temporarily remove annotations from view and restore them later without permanently deleting them. +Toggle annotation visibility in the Syncfusion PDF Viewer using JavaScript. Hide annotations for a cleaner view and show them again as needed. -## How to Show/Hide Annotations +### How to Toggle Annotation Visibility -**Step 1:** Follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample. +**Step 1:** Follow the steps in the [Get started with JavaScript ES5 PDF Viewer](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) guide to create a sample. -**Step 2:** Create a Button in Your HTML File +**Step 2:** Create Toggle Buttons in Your HTML File -Add a toggle button element in your HTML file that will control the visibility of annotations. +Add button elements in your HTML file that will trigger the show and hide functionality. ```html
    ``` -**Step 3:** Initialize the PDF Viewer with Annotation Support -Set up the PDF Viewer with necessary modules including Annotation support. +**Step 3:** Initialize the PDF Viewer with Required Modules + +In your JavaScript file, initialize the PDF Viewer with necessary modules including the Annotation module. ```js let exportObject = null; var pdfviewer = new ej.pdfviewer.PdfViewer({ - resourceUrl: 'https://cdn.syncfusion.com/ej2/30.1.37/dist/ej2-pdfviewer-lib', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, @@ -43,9 +43,10 @@ ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearc ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); pdfviewer.appendTo('#PdfViewer'); ``` -**Step 4:** Add Toggle Functionality for Annotations -Implement the toggle button click event to show or hide annotations. +**Step 4:** Implement the Show/Hide Annotation Functionality + +Add the code to handle the show and hide functionality of annotations by exporting and importing them as needed. ```js // Function to hide annotations @@ -67,6 +68,6 @@ document.getElementById('unhideBtn').addEventListener('click', UnHideAnnotations ``` ### Conclusion -This implementation provides a clean way to temporarily hide and show annotations in the PDF Viewer without permanently deleting them. This can be useful in scenarios where users need to temporarily view the document without annotations for better clarity. +These steps add the ability to toggle annotation visibility in a PDF Viewer application for selective viewing. [View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/signatureselect-signatureunselect-js.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/signatureselect-signatureunselect-js.md index 817a00a77..abd48e9a3 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/signatureselect-signatureunselect-js.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/signatureselect-signatureunselect-js.md @@ -1,27 +1,26 @@ --- layout: post -title: Selection events in | Syncfusion -description: Learn here all about the SignatureSelect and SignatureUnselect event in Syncfusion Javascript PDF Viewer component of Syncfusion Essential JS 2 and more. +title: Handle signatureSelect and signatureUnselect events in JavaScript PDF Viewer | Syncfusion +description: Learn how to handle signatureSelect and signatureUnselect events in the Syncfusion JavaScript PDF Viewer to manage handwritten signature selection state. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# SignatureSelect and SignatureUnselect event +# Handle signatureSelect and signatureUnselect events -The Syncfusion PDF Viewer provides event-handling capabilities for various actions, including selecting and unselecting handwritten signatures. The [signatureSelect](https://ej2.syncfusion.com/documentation/api/pdfviewer/#signatureselect) and [signatureUnselect](https://ej2.syncfusion.com/documentation/api/pdfviewer/#signatureunselect) events enable developers to programmatically manage the selection state of signatures within the PDF Viewer component. +Use the [signatureSelect](https://ej2.syncfusion.com/documentation/api/pdfviewer/#signatureselect) and [signatureUnselect](https://ej2.syncfusion.com/documentation/api/pdfviewer/#signatureunselect) events to manage the selection state of handwritten signatures in the PDF Viewer. **signatureSelect** -The [signatureSelect](https://ej2.syncfusion.com/documentation/api/pdfviewer/#signatureselect) event triggers when a handwritten signature annotation is selected. This event allows developers to capture the signature selection and handle it programmatically, such as updating the UI or storing the selection data for further processing. +Triggered when a handwritten signature annotation is selected. Use this event to capture selection and update the UI or store state. **signatureUnselect** -The [signatureUnselect](https://ej2.syncfusion.com/documentation/api/pdfviewer/#signatureunselect) event triggers when a handwritten signature annotation is unselected. This event enables developers to manage the unselection programmatically, which can be useful for tasks like cleanup operations or updating the application's state to reflect that a signature is no longer selected. +Triggered when a handwritten signature annotation is unselected. Use this event to handle cleanup or update application state. -The code snippet demonstrates how to subscribe to the [signatureSelect](https://ej2.syncfusion.com/documentation/api/pdfviewer/#signatureselect) and [signatureUnselect](https://ej2.syncfusion.com/documentation/api/pdfviewer/#signatureunselect) events in the Syncfusion PDF Viewer component. +The following code demonstrates how to subscribe to these events: ```js pdfviewer.signatureSelect = (args: any) => { @@ -33,6 +32,4 @@ pdfviewer.signatureUnselect = (args: any) => { }; ``` -The `signatureSelect` and `signatureUnselect` events in Syncfusion PDF Viewer offer robust options for managing the state of handwritten signatures within your application. By handling these events, developers can create a more interactive and dynamic user experience, responding programmatically to signature selection and unselection. - -[View sample in GitHub]() \ No newline at end of file +These events enable robust management of handwritten signature state, supporting interactive and dynamic user experiences. \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/unload-documents.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/unload-documents.md index 5902d6f0a..f3b2eed11 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/unload-documents.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/unload-documents.md @@ -1,15 +1,14 @@ --- layout: post -title: Unload documents in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Unload documents in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Unload document in JavaScript PDF Viewer | Syncfusion +description: Learn here all about Unload document in Syncfusion JavaScript PDF Viewer control of Syncfusion Essential JS 2 and more. platform: document-processing -control: Unload documents -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Unload documents in Javascript Pdfviewer control +# Unload document in JavaScript PDF Viewer The PDF Viewer library allows you to unload the PDF document being display in the PDF Viewer control programmatically using the [**unload()**](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#unload) method. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/use-local-script-and-style-references.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/use-local-script-and-style-references.md index 4bbd7eb0f..fc8abd7bb 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/use-local-script-and-style-references.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to/use-local-script-and-style-references.md @@ -1,19 +1,18 @@ --- layout: post -title: Use local script and style references in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Use local script and style references in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Use local script and style references in JavaScript PDF Viewer control | Syncfusion +description: Learn how to configure local script and style references for the Syncfusion JavaScript PDF Viewer control and reference them within your application. platform: document-processing -control: Use local script and style references -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Use local script and style references in Javascript Pdfviewer control +# Use local script and style references in JavaScript PDF Viewer -**Step 1:** Create an app folder `myapp` for Essential JS 2 JavaScript components. +**Step 1:** Create an application folder named `myapp` for Essential JS 2 JavaScript components. -**Step 2:** You can get the global scripts and styles from the [Essential Studio JavaScript (Essential JS 2)](https://www.syncfusion.com/downloads/essential-js2/) build installed location. +**Step 2:** Download the global scripts and styles from the [Essential Studio JavaScript (Essential JS 2) build](https://www.syncfusion.com/downloads/essential-js2/) installed on your machine. **Syntax:** > Script: `**(installed location)**/Syncfusion/Essential Studio/JavaScript - EJ2/{RELEASE_VERSION}/Web(Essential JS 2)/JavaScript/{PACKAGE_NAME}/dist/{PACKAGE_NAME}.min.js` @@ -25,7 +24,7 @@ domainurl: ##DomainURL## > > Styles: `C:/Program Files (x86)/Syncfusion/Essential Studio/JavaScript - EJ2/19.3.53/Web(Essential JS 2)/JavaScript/ej2-js-es5/styles/material.css` -You can also clone the [`Essential JS 2 quickstart`](https://github.com/syncfusion/ej2-quickstart.git) project and install necessary packages by using the following commands. +Alternatively, clone the [`Essential JS 2 quickstart`](https://github.com/syncfusion/ej2-quickstart.git) project and install the required packages by running the following commands. ``` git clone https://github.com/syncfusion/ej2-quickstart.git quickstart @@ -33,9 +32,9 @@ cd quickstart npm install ``` -**Step 3:** Create a folder `myapp/resources` and copy/paste the scripts and styles of ej2 package from the above installed location to `myapp/resources` location. +**Step 3:** Create a folder named `myapp/resources` and copy the EJ2 scripts and styles from the installed location into the `myapp/resources` directory. -**Step 4:** Add the `Div` element and initiate the `Essential JS 2 PDF Viewer` component with script and style references in the `index.html` by using following code +**Step 4:** Add the `div` element and initialize the Essential JS 2 PDF Viewer component in `index.html` with the local script and style references. ```html @@ -67,6 +66,6 @@ npm install ``` -**Step 6:** Now, run the `index.html` in web browser, it will render the **Essential JS 2 PDF Viewer** component as below. +**Step 5:** Run the `index.html` file in a web browser to render the **Essential JS 2 PDF Viewer** component as shown below. ![JavaScript Output](../images/javascript_output.png) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/images/Context-Menu-Page-Operations1.png b/Document-Processing/PDF/PDF-Viewer/javascript-es5/images/Context-Menu-Page-Operations1.png new file mode 100644 index 0000000000000000000000000000000000000000..3939f80c1666280429654947a8c265abd6460bd8 GIT binary patch literal 25178 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

    BrG6Sp$|PRI#Z&S^d#bkqLGZ? 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 DD`AaB literal 0 HcmV?d00001 diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/images/form-filling-signature-dialog.png b/Document-Processing/PDF/PDF-Viewer/javascript-es5/images/form-filling-signature-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..e6e87df83062cf38929cd51cdaea2756ca41c343 GIT binary patch literal 81767 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 literal 0 HcmV?d00001 diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/images/form-filling-signature-signed.png b/Document-Processing/PDF/PDF-Viewer/javascript-es5/images/form-filling-signature-signed.png new file mode 100644 index 0000000000000000000000000000000000000000..93470a0f5f624342aa9a058176092bdc4c5b4437 GIT binary patch literal 69868 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 literal 0 HcmV?d00001 diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/images/form-filling-signature.png b/Document-Processing/PDF/PDF-Viewer/javascript-es5/images/form-filling-signature.png new file mode 100644 index 0000000000000000000000000000000000000000..9be25488e2ee422ae4f8e4a67930abaf59119eb6 GIT binary patch literal 65093 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

    S@$k}jxshF$AYMUihv4;bZLnl>7xjU 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�isWncFkJjQ17hl!!X{iVex74Cl1? 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

    0fU@KKk*}KDrl- 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 MS>ts2sb6mY5BI+D&;S4c literal 0 HcmV?d00001 diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/interaction-mode.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/interaction-mode.md index c2fac1731..315d4253c 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/interaction-mode.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/interaction-mode.md @@ -1,15 +1,14 @@ --- layout: post -title: Interaction mode in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Interaction mode in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Interaction mode in Javascript PDF Viewer control | Syncfusion +description: Learn here all about Interaction mode in Syncfusion Javascript PDF Viewer control of Syncfusion Essential JS 2 and more. platform: document-processing -control: Interaction mode -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Interaction mode in Javascript Pdfviewer control +# Interaction mode in Javascript PDF Viewer control The PDF Viewer provides interaction mode for easy interaction with the loaded PDF document. Selection mode and panning mode are the two interactions modes. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/bookmark-navigation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/bookmark-navigation.md new file mode 100644 index 000000000..a9aa1aadd --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/bookmark-navigation.md @@ -0,0 +1,86 @@ +--- +layout: post +title: Bookmark Navigation in JavaScript PDF Viewer control | Syncfusion +description: Learn how to use bookmarks for quick navigation in the Syncfusion JavaScript PDF Viewer control, enhancing user experience and accessibility. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Bookmark navigation in JavaScript PDF Viewer control + +The Bookmarks saved in PDF files are loaded and made ready for easy navigation. +You can enable/disable bookmark navigation by using the following code snippet., + +{% tabs %} +{% highlight js tabtitle="Standalone" %} + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection +); + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + enableBookmark: true, + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf' +}); +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection +); + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + enableBookmark: true, + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf' +}); +pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +![Bookmarks panel](../images/bookmark.png) + +To perform bookmark navigation, you can use the **goToBookmark** method. It's important to note that the **goToBookmark** method will throw an error if the specified bookmark does not exist in the PDF document. + +Here is an example of how to use the **goToBookmark** method: + +``` + +``` + +```js +document.getElementById('gotobookmark').addEventListener('click', () => { + viewer.bookmark.goToBookmark(x, y); +}); +``` + +x - Specifies the pageIndex for Navigate. + +y - Specifies the Y coordinates value of the Page. + +Also, you can use the **getBookmarks** method to retrieve a list of all the bookmarks in a PDF document. This method returns a List of Bookmark objects, which contain information about each bookmark. + +Here is an example of how to use the getBookmarks method: + +``` + +``` + +```js +document.getElementById('getBookmarks').addEventListener('click', () => { + var getBookmarks = viewer.bookmark.getBookmarks(); + console.log(getBookmarks) +}); +``` + +## See also + +* [Toolbar items](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/toolbar/) +* [Feature modules](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/feature-module/) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/hyperlink-navigation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/hyperlink-navigation.md new file mode 100644 index 000000000..5e3a49efa --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/hyperlink-navigation.md @@ -0,0 +1,212 @@ +--- +layout: post +title: Hyperlink navigation in PDF Viewer | Syncfusion +description: Learn how to configure hyperlink navigation, including table-of-contents entries, in the Syncfusion PDF Viewer control for JavaScript. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Hyperlink navigation in PDF Viewer + +The PDF Viewer consolidates hyperlink-driven experiences, including inline links and table-of-contents (TOC) entries that target in-document destinations. These elements surface contextual entry points so users can jump directly to relevant sections without manual scrolling. + +> **Note:** The table of contents pane and hyperlink interactions rely on the same navigation infrastructure. When these capabilities are enabled, the PDF Viewer automatically surfaces TOC entries and clickable links defined in the PDF. + +## Required modules + +Inject the following modules to enable both navigation experiences: `Toolbar`, `Magnification`, `Navigation`, `LinkAnnotation`, `BookmarkView`, `TextSelection`, `ThumbnailView`, and optionally `Annotation`. + +## Table of contents navigation + +Use the table of contents to quickly navigate to headings and sections defined in the PDF. When the document contains a bookmarks/outline structure, the viewer exposes those entries in the table of contents (Bookmarks) pane. Selecting an entry navigates directly to the mapped destination. If the PDF does not include a table of contents, the pane will not list any entries. + +![Table of contents pane in PDF Viewer](../images/toc.png) + +## Hyperlink Navigation + +The PDF Viewer provides robust support for hyperlink navigation within PDF documents. This allows users to interact with embedded links, which can point to external websites or other locations within the same document. This section covers how to configure hyperlink behavior, including enabling or disabling links, controlling how they open, and responding to hyperlink-related events. + +![Hyperlink Navigation in PDF Viewer](../images/link.png) + +### Enabling and Disabling Hyperlinks + +By default, the PDF Viewer automatically detects and enables all hyperlinks present in a loaded document. This behavior can be controlled using the `enableHyperlink` property. + +- **Property**: `enableHyperlink` +- **Type**: `boolean` +- **Default**: `true` + +When `enableHyperlink` is set to `false`, all hyperlinks in the document become non-interactive. This means that users cannot click them, and no hyperlink-related events will be triggered. + +The following example demonstrates how to disable hyperlink navigation: + +{% tabs %} +{% highlight js tabtitle="Standalone" %} + + +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, +ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, ej.pdfviewer.LinkAnnotation, +ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection); + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + enableHyperlink: false // Disables all hyperlinks +}); + +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} + +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, +ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, ej.pdfviewer.LinkAnnotation, +ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection); + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + enableHyperlink: false // Disables all hyperlinks +}); + +pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +> Note: Disabling hyperlinks only affects the viewer's behavior and does not alter the original PDF document. +### Controlling Link Behavior + +The `hyperlinkOpenState` property determines how external URLs are opened when a hyperlink is clicked. + +- **Property**: `hyperlinkOpenState` +- **Type**: `'CurrentTab' | 'NewTab'` +- **Default**: `'CurrentTab'` + +By default, links open in the same browser tab (`CurrentTab`). To open links in a new tab, set this property to `'NewTab'`. This is useful for preserving the user's current viewing session. + +The following example configures hyperlinks to open in a new tab: + +{% tabs %} +{% highlight js tabtitle="Standalone" %} + +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, +ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, ej.pdfviewer.LinkAnnotation, +ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection); + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + hyperlinkOpenState: 'NewTab' // Opens links in a new browser tab +}); + +pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} + +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, +ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, ej.pdfviewer.LinkAnnotation, +ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection); + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + hyperlinkOpenState: 'NewTab' // Opens links in a new browser tab +}); + +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +### Handling Hyperlink Events + +The PDF Viewer exposes events that allow for monitoring and customizing hyperlink interactions. + +#### hyperlinkClick + +The `hyperlinkClick` event is triggered when a user clicks a hyperlink. This event can be used to implement custom logic, such as validating a URL or preventing the default navigation behavior. + +The event arguments provide the following information: +- `hyperlink`: The URL of the clicked hyperlink. +- `cancel`: A boolean that, when set to `true`, prevents the default navigation action. + +#### hyperlinkMouseOver + +The `hyperlinkMouseOver` event is triggered when the mouse pointer hovers over a hyperlink. This can be used to display custom tooltips or other visual feedback. + +The event arguments include: +- `hyperlinkElement`: The HTML anchor element (``) corresponding to the hyperlink. + +The following example demonstrates how to use these events: + +{% tabs %} +{% highlight js tabtitle="Standalone" %} + +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, +ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, ej.pdfviewer.LinkAnnotation, +ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection); + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + // Event handler for hyperlink click + hyperlinkClick: function (args) { + // Log the URL of the clicked hyperlink + console.log('Hyperlink Clicked:', args.hyperlink); + + // To prevent the default navigation behavior, set args.cancel to true + // args.cancel = true; + }, + + // Event handler for mouse hover over a hyperlink + hyperlinkMouseOver: function (args) { + // Log the href of the hyperlink element when the mouse hovers over it + if (args && args.hyperlinkElement && args.hyperlinkElement.href) { + console.log('Mouse is over hyperlink:', args.hyperlinkElement.href); + } + } +}); + +// Append the PDF Viewer to the HTML element +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} + +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, +ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, ej.pdfviewer.LinkAnnotation, +ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection); + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/', + // Event handler for hyperlink click + hyperlinkClick: function (args) { + // Log the URL of the clicked hyperlink + console.log('Hyperlink Clicked:', args.hyperlink); + + // To prevent the default navigation behavior, set args.cancel to true + // args.cancel = true; + }, + + // Event handler for mouse hover over a hyperlink + hyperlinkMouseOver: function (args) { + // Log the href of the hyperlink element when the mouse hovers over it + if (args && args.hyperlinkElement && args.hyperlinkElement.href) { + console.log('Mouse is over hyperlink:', args.hyperlinkElement.href); + } + } +}); + +// Append the PDF Viewer to the HTML element +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +## See also + +- [Bookmark navigation](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/interactive-pdf-navigation/bookmark-navigation/) +- [Page navigation](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/interactive-pdf-navigation/page-navigation/) +- [Page thumbnail navigation](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/interactive-pdf-navigation/page-thumbnail-navigation/) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/page-navigation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/page-navigation.md new file mode 100644 index 000000000..682182f8c --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/page-navigation.md @@ -0,0 +1,181 @@ +--- +layout: post +title: Page Navigation in JavaScript PDF Viewer control | Syncfusion +description: Explore how to navigate pages in the Syncfusion JavaScript PDF Viewer control using built-in options for seamless document viewing. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Navigation in JavaScript PDF Viewer control + +The JavaScript PDF Viewer supports different internal and external navigations. + +## Toolbar page navigation option + +The default toolbar of PDF Viewer contains the following navigation options + +* [**Go to page**](https://ej2.syncfusion.com/documentation/api/pdfviewer/navigation/#gotopage):- Navigates to the specific page of a PDF document. +* [**Show next page**](https://ej2.syncfusion.com/documentation/api/pdfviewer/navigation/#gotonextpage):- Navigates to the next page of PDF a document. +* [**Show previous page**](https://ej2.syncfusion.com/documentation/api/pdfviewer/navigation/#gotopreviouspage):- Navigates to the previous page of a PDF document. +* [**Show first page**](https://ej2.syncfusion.com/documentation/api/pdfviewer/navigation/#gotofirstpage):- Navigates to the first page of a PDF document. +* [**Show last page**](https://ej2.syncfusion.com/documentation/api/pdfviewer/navigation/#gotolastpage):- Navigates to the last page of a PDF document. + +```html + + + + + + +

    + + +``` + +You can enable/disable page navigation option in PDF Viewer using the following code snippet., + +{% tabs %} +{% highlight js tabtitle="Standalone" %} + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, + ej.pdfviewer.TextSelection +); + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + enableNavigation: true, + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf' +}); + +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + enableNavigation: true, + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf' +}); + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection +); + +pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +![page navigation in toolbar](../images/navigation.png) + +Also, you can programmatically perform page navigation options as follows. + +```html + + + + + + +
    + + + + + +
    +
    + + +``` + +{% tabs %} +{% highlight js tabtitle="Standalone" %} + +var viewer = new ej.pdfviewer.PdfViewer ({ + documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", + resourceUrl:'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib' +}); + +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.BookmarkView, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, + ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.Annotation, ej.pdfviewer.FormFields, + ej.pdfviewer.FormDesigner,ej.pdfviewer.PageOrganizer +); + +viewer.appendTo('#pdfViewer'); + +// Go To First Page +document.getElementById('goToFirstPage').addEventListener('click', () => { + viewer.navigation.goToFirstPage(); +}); +// Go To Last Page +document.getElementById('goToLastPage').addEventListener('click', () => { + viewer.navigation.goToLastPage(); +}); +// Go To Next Page +document.getElementById('goToNextPage').addEventListener('click', () => { + viewer.navigation.goToNextPage(); +}); +// Go To Page +document.getElementById('goToPage').addEventListener('click', () => { + viewer.navigation.goToPage(4); +}); +// Go To Previous Page +document.getElementById('goToPreviousPage').addEventListener('click', () => { + viewer.navigation.goToPreviousPage(); +}); + +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} + +var viewer = new ej.pdfviewer.PdfViewer ({ + documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", + resourceUrl:'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib' +}); + +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.BookmarkView, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, + ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.Annotation, ej.pdfviewer.FormFields, + ej.pdfviewer.FormDesigner, ej.pdfviewer.PageOrganizer +); + +viewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer'; +viewer.appendTo('#pdfViewer'); + +// Go To First Page +document.getElementById('goToFirstPage').addEventListener('click', () => { +viewer.navigation.goToFirstPage(); +}); +// Go To Last Page +document.getElementById('goToLastPage').addEventListener('click', () => { +viewer.navigation.goToLastPage(); +}); +// Go To Next Page +document.getElementById('goToNextPage').addEventListener('click', () => { +viewer.navigation.goToNextPage(); +}); +// Go To Page +document.getElementById('goToPage').addEventListener('click', () => { +viewer.navigation.goToPage(4); +}); +// Go To Previous Page +document.getElementById('goToPreviousPage').addEventListener('click', () => { +viewer.navigation.goToPreviousPage(); +}); + +{% endhighlight %} +{% endtabs %} + +Find the sample [here](https://stackblitz.com/edit/kpzmjpf7?file=index.js) to perform the page navigation options programmatically. + +## See also + +* [Toolbar items](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/toolbar/) +* [Feature modules](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/feature-module/) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/page-thumbnail-navigation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/page-thumbnail-navigation.md new file mode 100644 index 000000000..38bfc4e27 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/page-thumbnail-navigation.md @@ -0,0 +1,54 @@ +--- +layout: post +title: Thumbnail Navigation in JavaScript PDF Viewer control | Syncfusion +description: Discover how to navigate PDF pages using thumbnails in the Syncfusion JavaScript PDF Viewer control for a visual and intuitive experience. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Page Thumbnail navigation in JavaScript PDF Viewer control + +Thumbnails is the miniature representation of actual pages in PDF files. This feature displays thumbnails of the pages and allows navigation. +You can enable/disable thumbnail navigation by using the following code snippet., + +{% tabs %} +{% highlight js tabtitle="Standalone" %} + + +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, +ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, ej.pdfviewer.LinkAnnotation, +ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection); + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + enableThumbnail: true, + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf' +}); +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} + + +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, +ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, ej.pdfviewer.LinkAnnotation, +ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection); + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + enableThumbnail: true, + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf' +}); +pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +![Alt text](../images/thumbnail.png) + + +## See also + +* [Toolbar items](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/toolbar/) +* [Feature Modules](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/feature-module/) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/magnification.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/magnification.md index 0f1edb676..9a2dfb35e 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/magnification.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/magnification.md @@ -1,19 +1,18 @@ --- layout: post -title: Magnification in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Magnification in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Magnification in JavaScript PDF Viewer | Syncfusion +description: Learn how to enable and use magnification in the Syncfusion JavaScript PDF Viewer, including Zoom In, Zoom Out, Fit to Page, and Fit to Width options. platform: document-processing -control: Magnification -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Magnification in Javascript Pdfviewer control +# Magnification in JavaScript PDF Viewer -The magnification tools of the PDF Viewer contains ZoomIn, ZoomOut, Zoom, FitPage, and FitWidth tools in the default toolbar. The PDF Viewer also has an option to show or hide the magnification tools in the default toolbar. +The PDF Viewer includes magnification tools in the default toolbar: Zoom In, Zoom Out, Zoom (to a specific value), Fit to Page, and Fit to Width. The toolbar can be configured to show or hide these tools. -The following code snippet describes how to enable the magnification in PDF Viewer. +Use the following configuration to enable magnification in the PDF Viewer: ```html {% raw %} @@ -69,9 +68,9 @@ The following magnification options are available in the default toolbar of PDF * [**FitPage**](https://ej2.syncfusion.com/documentation/api/pdfviewer/magnification/#fittopage):- Fits the page width with in the available view port size. * [**FitWidth**](https://ej2.syncfusion.com/documentation/api/pdfviewer/magnification/#fittowidth):- Fits the view port width based on the page content size. -![Alt text ](./images/zoom.png) +![Magnification tools in PDF Viewer](./images/zoom.png) ->PDF Viewer can support the zoom value ranges from 10 to 400. +> The PDF Viewer supports zoom values from 10% to 400%. ## See also diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/navigation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/navigation.md index e3eb4211b..52aa2d27e 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/navigation.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/navigation.md @@ -1,21 +1,20 @@ --- layout: post -title: Navigation in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Navigation in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Navigation in JavaScript PDF Viewer | Syncfusion +description: Learn how to navigate PDF documents in the Syncfusion JavaScript PDF Viewer using toolbar controls, bookmarks, thumbnails, and hyperlinks. platform: document-processing -control: Navigation -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Navigation in Javascript Pdfviewer control +# Navigation in JavaScript PDF Viewer -The ASP.NET Core PDF Viewer supports different internal and external navigations. +The JavaScript PDF Viewer supports multiple navigation options, including toolbar controls, programmatic commands, bookmarks, thumbnails, hyperlinks, and table of contents. ## Toolbar page navigation option -The default toolbar of PDF Viewer contains the following navigation options +The default toolbar includes the following navigation options: * [**Go to page**](https://ej2.syncfusion.com/documentation/api/pdfviewer/navigation/#gotopage):- Navigates to the specific page of a PDF document. * [**Show next page**](https://ej2.syncfusion.com/documentation/api/pdfviewer/navigation/#gotonextpage):- Navigates to the next page of PDF a document. @@ -44,7 +43,7 @@ The default toolbar of PDF Viewer contains the following navigation options {% endraw %} ``` -You can enable/disable page navigation option in PDF Viewer using the following code snippet., +Enable or disable page navigation using the following configuration: {% tabs %} {% highlight js tabtitle="Standalone" %} @@ -70,9 +69,9 @@ pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} -![Alt text](./images/navigation.png) +![PDF Viewer toolbar navigation controls](./images/navigation.png) -Also, you can programmatically perform page navigation options as follows. +You can also perform page navigation programmatically: ```html {% raw %} @@ -186,11 +185,11 @@ document.getElementById('goToPreviousPage').addEventListener('click', () => { {% endhighlight %} {% endtabs %} -Find the [here](https://stackblitz.com/edit/39kfnj?file=index.js) to perform the page navigation options programmatically. +View the [programmatic navigation sample](https://stackblitz.com/edit/39kfnj?file=index.js) for a working example. ## Bookmark navigation -The Bookmarks saved in PDF files are loaded and made ready for easy navigation. You can enable/disable bookmark navigation by using the following code snippet., +Bookmarks saved in PDF files provide quick navigation. Enable or disable bookmark navigation using the following configuration: {% tabs %} {% highlight js tabtitle="Standalone" %} @@ -216,11 +215,11 @@ pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} -![Alt text](./images/bookmark.png) +![PDF Viewer bookmark panel](./images/bookmark.png) -To perform bookmark navigation, you can use the **goToBookmark** method. It's important to note that the **goToBookmark** method will throw an error if the specified bookmark does not exist in the PDF document. +Use the **goToBookmark** method to navigate to a specific bookmark. The method throws an error if the bookmark does not exist in the document. -Here is an example of how to use the **goToBookmark** method: +Example: ``` @@ -236,9 +235,9 @@ x - Specifies the pageIndex for Navigate. y - Specifies the Y coordinates value of the Page. -Also, you can use the **getBookmarks** method to retrieve a list of all the bookmarks in a PDF document. This method returns a List of Bookmark objects, which contain information about each bookmark. +Use the **getBookmarks** method to retrieve all bookmarks. The method returns a list of bookmark objects that include metadata for each entry. -Here is an example of how to use the getBookmarks method: +Example: ``` @@ -253,8 +252,7 @@ document.getElementById('getBookmarks').addEventListener('click', () => { ## Thumbnail navigation -Thumbnails is the miniature representation of actual pages in PDF files. This feature displays thumbnails of the pages and allows navigation. -You can enable/disable thumbnail navigation by using the following code snippet., +Thumbnails provide miniature representations of PDF pages for quick navigation. Enable or disable thumbnail navigation using the following configuration: {% tabs %} {% highlight js tabtitle="Standalone" %} @@ -280,19 +278,19 @@ pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} -![Alt text](./images/thumbnail.png) +![PDF Viewer thumbnail pane](./images/thumbnail.png) ## Hyperlink navigation -Hyperlink navigation features enables navigation to the URLs (website links) in a PDF file. +Hyperlink navigation enables users to open URLs embedded in the PDF. -![Alt text](./images/link.png) +![PDF Viewer hyperlink navigation](./images/link.png) ## Table of content navigation -Table of contents navigation allows users to navigate to different parts of a PDF file that are listed in the table of contents section. +Table of contents navigation allows users to jump to sections defined in the document outline. -You can enable/disable link navigation by using the following code snippet., +Enable or disable table of contents navigation using the following configuration: {% tabs %} {% highlight js tabtitle="Standalone" %} @@ -318,7 +316,7 @@ pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} -You can change the open state of the hyperlink in the PDF Viewer by using the following code snippet, +Change the hyperlink open state using the following configuration: {% tabs %} {% highlight js tabtitle="Standalone" %} @@ -345,11 +343,10 @@ pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} -``` -![Alt text](./images/toc.png) +![PDF Viewer table of contents panel](./images/toc.png) ## See also * [Toolbar items](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/toolbar/) -* [Feature Modules](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/feature-module/) \ No newline at end of file +* [Feature modules](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/feature-module/) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-amazon-s3.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-amazon-s3.md index 16d351afc..63c582691 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-amazon-s3.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-amazon-s3.md @@ -1,35 +1,33 @@ --- layout: post -title: Open PDF files from AWS S3 in Javascript Pdfviewer control | Syncfusion -description: Learn about how to Open PDF files from AWS S3 in Javascript Pdfviewer control of Syncfusion Essential JS 2 and more details. +title: Open PDF from AWS S3 in JavaScript PDF Viewer | Syncfusion +description: Learn how to load PDFs from AWS S3 in the Syncfusion JavaScript PDF Viewer component using standalone and server-backed approaches. platform: document-processing -control: Open PDF files from AWS S3 -publishingplatform: Javascript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Open PDF file from AWS S3 +# Open PDF from AWS S3 -PDF Viewer allows to load PDF file from AWS S3 using either the Standalone or Server-backed PDF Viewer. Below are the steps and a sample to demonstrate how to open a PDF from AWS S3. +The JavaScript PDF Viewer component supports loading PDF files from AWS S3 using either the standalone or the server-backed PDF Viewer. The following steps demonstrate both approaches. -## Using Standalone PDF Viewer +## Using the standalone PDF Viewer -To load a PDF file from AWS S3 in a PDF Viewer, you can follow the steps below +Follow these steps to load a PDF from AWS S3 in the standalone PDF Viewer. -**Step 1:** Create a Simple PDF Viewer Sample in JavaScript +**Step 1:** Create a PDF Viewer sample in JavaScript -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF viewer sample in JavaScript. This will give you a basic setup of the PDF viewer component. +Follow the instructions in the [getting started guide](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a basic PDF Viewer sample in JavaScript. **Step 2:** Modify the `index.html` File in the JavaScript Project -1. AWS SDK for JavaScript, used for interacting with AWS services like S3: +1. Import the required namespaces at the top of the file: ```javascript ``` -2. Configures AWS SDK with the region, access key, and secret access key. This configuration allows the application to interact with AWS services like S3. +2. Configure the AWS SDK with the region, access key, and secret access key so the application can interact with S3. N> Replace **Your Region** with the actual Region of your AWS S3 account and **Your Access Key** with the actual Access Key of your AWS S3 account and **Your Security Access Key** with the actual Security Access Key of your AWS S3 account. @@ -41,7 +39,7 @@ AWS.config.update({ }); ``` -3. Sets the parameters for fetching the PDF document from S3, including the bucket name and file key. Then Uses the getObject method of the S3 instance to retrieve the document. Converts the document data to a Base64 string and loads it into the Syncfusion PDF Viewer then load Base64 string generated into the viewer.load method. +3. Set parameters for fetching the PDF (bucket name and file key). Use S3.getObject to retrieve the document, convert it to a Base64 string, and pass it to viewer.load. N> Replace **Your Bucket Name** with the actual Bucket name of your AWS S3 account and **Your Key** with the actual File Key of your AWS S3 account. @@ -71,15 +69,17 @@ pdfviewer.created = function () { }; ``` +N> The **aws-sdk** package must be installed in your application to use the previous code example. + [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-aws-s3/tree/master/Open%20and%20Save%20PDF%20in%20AWS%20S3%20using%20Standalone). -## Using Server-Backed PDF Viewer +## Using the server-backed PDF Viewer -To load a PDF file from AWS S3 in a PDF Viewer, you can follow the steps below +Follow these steps to load a PDF from AWS S3 using the server-backed PDF Viewer. -**Step 1:** Create a Simple PDF Viewer Sample in JavaScript +**Step 1:** Create a PDF Viewer sample in JavaScript -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF viewer sample in JavaScript. This will give you a basic setup of the PDF viewer component. +Create a basic PDF Viewer sample by following the [getting started guide](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) **Step 2:** Modify the `PdfViewerController.cs` File in the Web Service Project @@ -179,11 +179,11 @@ public async Task Load([FromBody] Dictionary json } ``` -N> Replace **Your Access Key from AWS S3**, **Your Secret Key from AWS S3**, and **Your Bucket name from AWS S3** with your actual AWS access key, secret key and bucket name +N> Replace the placeholders with your actual AWS credentials and bucket name: Access Key, Secret Key, and Bucket Name. -**Step 3:** Set the PDF Viewer Properties in JavaScript PDF viewer component +**Step 3:** Configure the PDF Viewer component -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from AWS S3. Ensure that you correctly pass the document name from the files available in your AWS S3 bucket to the documentPath property. +Set the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) to your web service endpoint (replace the localhost URL with your server URL). Set documentPath to the PDF file name to load from AWS S3. Ensure the document name matches an object in your bucket. ```javascript diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-azure-active-directory.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-azure-active-directory.md index df0d3126d..8b8d91465 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-azure-active-directory.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-azure-active-directory.md @@ -1,25 +1,24 @@ --- layout: post -title: Open PDF From AAD in Javascript Pdfviewer | Syncfusion -description: Learn how to Open PDF From AAD in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Open PDF from Azure Active Directory in JavaScript PDF Viewer | Syncfusion +description: Learn how to load and save PDFs using Azure Active Directory (AAD) with the Syncfusion JavaScript PDF Viewer component. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Open PDF From Azure Active Directory in Viewer +# Open PDF from Azure Active Directory -### **Overview** +### Overview -The Syncfusion PDF Viewer allows you to load and save PDF files directly from Azure Active Directory (AAD). Below are the steps to securely load and store PDF documents from and to AAD using the PDF Viewer. +The JavaScript PDF Viewer component supports loading and saving PDF files with Azure Active Directory (AAD). The following steps explain how to securely load and store PDFs using AAD. -### **Steps to Open the PDF File from Azure Active Directory** +### Steps to open a PDF from Azure Active Directory --- -### **Step 1: Register an Application in Azure Active Directory (AAD)** +### Step 1: Register an application in Azure Active Directory (AAD) 1. **Go to the Azure Portal**: - Navigate to [Azure Portal](https://portal.azure.com). @@ -41,7 +40,7 @@ The Syncfusion PDF Viewer allows you to load and save PDF files directly from Az --- -### **Step 2: Create the Azure Storage Account** +### Step 2: Create the Azure Storage account 1. **Create a Storage Account**: - In the Azure portal, use the search bar to search for **Storage accounts**. @@ -51,7 +50,7 @@ The Syncfusion PDF Viewer allows you to load and save PDF files directly from Az --- -### **Step 3: Assign Role to the Application** +### Step 3: Assign a role to the application 1. **Go to your Storage Account**: - Navigate to **Access control (IAM)** > **Add role assignment** in your Azure Storage Account. @@ -66,7 +65,7 @@ The Syncfusion PDF Viewer allows you to load and save PDF files directly from Az ![add-role](../images/add-role.png) --- -### **Step 4: Upload the PDF Document to the Azure Storage Account** +### Step 4: Upload the PDF to Azure Storage 1. **Navigate to Data Storage**: - In the Azure portal, go to **Data storage** > **Containers**. @@ -77,7 +76,7 @@ The Syncfusion PDF Viewer allows you to load and save PDF files directly from Az ![upload-pdf](../images/upload-pdf.png) --- -### **Step 5: Server-Side Configuration** +### Step 5: Server-side configuration 1. **Configure Server-Side Code**: - Open the server-side application (e.g., ASP.NET Core) and configure the following details in the `PdfViewerController` file: @@ -92,7 +91,7 @@ The Syncfusion PDF Viewer allows you to load and save PDF files directly from Az --- -### **Step 6: Client-Side Configuration** +### Step 6: Client-side configuration 1. **Run the JS Sample**: - Start the JS sample that includes the Syncfusion PDF Viewer. @@ -106,7 +105,7 @@ The Syncfusion PDF Viewer allows you to load and save PDF files directly from Az --- -### **Step 7: Save the PDF Document to Azure** +### Step 7: Save the PDF to Azure 1. **Save PDF to AAD**: - The user can click the **Save to AAD** button to upload any modifications to the PDF back to Azure Blob Storage. @@ -114,7 +113,7 @@ The Syncfusion PDF Viewer allows you to load and save PDF files directly from Az --- -### **Server-Side Code Snippets** +### Server-side code ```cs string tenantId = "Provide the tenant id here"; string clientId = "Provide the clientid here"; @@ -170,7 +169,7 @@ public async Task SaveToAAD([FromBody] Dictionary -### **Client-side Code Snippets** +### Client-side code ```js import { PdfViewer, Toolbar, TextSelection, TextSearch, Print, Navigation, Magnification, Annotation, FormDesigner, FormFields, CustomToolbarItemModel } from '@syncfusion/ej2-pdfviewer'; diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-azure-blob-storage.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-azure-blob-storage.md index 656731270..8ec3234e4 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-azure-blob-storage.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-azure-blob-storage.md @@ -1,27 +1,26 @@ --- layout: post -title: Open PDF from Azure Blob Storage in Javascript Pdfviewer | Syncfusion -description: Learn about how to Open PDF files from Azure Blob Storage in Javascript Pdfviewer control of Syncfusion Essential JS 2 and more details. +title: Open PDF from Azure Blob Storage in JavaScript PDF Viewer | Syncfusion +description: Learn how to load PDFs from Azure Blob Storage in the Syncfusion JavaScript PDF Viewer component using standalone and server-backed approaches. platform: document-processing -control: Open PDF files from Azure Blob Storage -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Open PDF file from Azure Blob Storage +# Open PDF from Azure Blob Storage -PDF Viewer allows to load PDF file from Azure Blob Storage using either the Standalone or Server-backed PDF Viewer. Below are the steps and a sample to demonstrate how to open a PDF from Azure Blob Storage. +The JavaScript PDF Viewer component supports loading PDF files from Azure Blob Storage using either the standalone or the server-backed PDF Viewer. The following steps demonstrate both approaches. -## Using Standalone PDF Viewer +## Using the standalone PDF Viewer -To load a PDF file from Azure Blob Storage in a PDF Viewer, you can follow the steps below +Follow these steps to load a PDF from Azure Blob Storage in the standalone PDF Viewer. -**Step 1:** Create a Simple PDF Viewer Sample in JavaScript +**Step 1:** Create a PDF Viewer sample in JavaScript Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF viewer sample in JavaScript. This will give you a basic setup of the PDF viewer component. -**Step 2:** Modify the `src/app/app.ts` File in the Angular Project +**Step 2:** Modify the `src/app/app.ts` file in the JavaScript project 1. Add the following private properties to the `app.ts`, and assign the values from the configuration to the corresponding properties @@ -33,7 +32,7 @@ private containerName: string = "*Your container name in Azure*"; private blobName: string = "*Your Blob name in Azure*"; ``` -2. Constructs the URL to the PDF in Azure Blob Storage. Calls fetchAndConvertToBase64 to fetch the PDF and convert it to a base64 string. Then Loads the base64 string into the PDF Viewer. +2. Construct the URL to the PDF in Azure Blob Storage. Call `fetchAndConvertToBase64` to fetch the PDF and convert it to a base64 string. Then load the base64 string into the PDF Viewer. ```typescript pdfviewer.created = function () { @@ -50,7 +49,7 @@ pdfviewer.created = function () { } ``` -3. Then it retrieves the PDF file from the given URL and converts the fetched Blob to a base64 string using blobToBase64. +3. Retrieve the PDF from the URL and convert the fetched Blob to a base64 string using blobToBase64. ```typescript function fetchAndConvertToBase64(url : any) { @@ -72,7 +71,7 @@ function fetchAndConvertToBase64(url : any) { } ``` -4. Uses FileReader to convert a Blob to a base64 string. Resolves the promise with the base64 string or rejects it in case of an error. +4. Use FileReader to convert a Blob to a base64 string. Resolve the promise with the base64 string or reject it in case of an error. ```typescript function blobToBase64(blob : any) { @@ -92,11 +91,11 @@ function blobToBase64(blob : any) { [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-azure-blob-storage/tree/master/Open%20and%20Save%20PDF%20in%20Azure%20Blob%20Storage%20using%20Standalone). -## Using Server-Backed PDF Viewer +## Using the server-backed PDF Viewer -To load a PDF file from Azure Blob Storage in a PDF Viewer, you can follow the steps below +Follow these steps to load a PDF from Azure Blob Storage using the server-backed PDF Viewer. -**Step 1:** Create a Simple PDF Viewer Sample in JavaScript +**Step 1:** Create a PDF Viewer sample in JavaScript Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF viewer sample in JavaScript. This will give you a basic setup of the PDF viewer component. @@ -129,7 +128,7 @@ public PdfViewerController(IConfiguration configuration, ILogger jsonObject) } ``` -N> Replace **Your Connection string from Azure** with the actual connection string for your Azure Blob Storage account and **Your container name in Azure** with the actual container name +N> Replace the placeholders with your actual values: Azure storage connection string and container name. -**Step 3:** Set the PDF Viewer Properties in JavaScript PDF viewer component +**Step 3:** Configure the PDF Viewer component -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from Azure Blob Storage. Ensure that you correctly pass the document name from the files available in your azure contanier to the documentPath property. +Set the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) to your web service endpoint (replace the localhost URL with your server URL). Set documentPath to the PDF file name to load from Azure Blob Storage. Ensure the document name exists in your Azure container. ```javascript diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-box-cloud-file-storage.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-box-cloud-file-storage.md index 38d437007..9716fdc95 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-box-cloud-file-storage.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-box-cloud-file-storage.md @@ -1,27 +1,26 @@ --- layout: post -title: Open PDF files from Box cloud file storage in Javascript Pdfviewer control | Syncfusion -description: Learn about how to Open PDF files from Box cloud file storage in Javascript Pdfviewer control of Syncfusion Essential JS 2 and more details. +title: Open PDF from Box cloud storage in JavaScript PDF Viewer | Syncfusion +description: Learn how to load PDFs from Box cloud storage in the Syncfusion JavaScript PDF Viewer component using a server-backed approach. platform: document-processing -control: Open PDF files from Box cloud file storage -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Open PDF file from Box cloud file storage +# Open PDF from Box cloud storage -To load a PDF file from Box cloud file storage in a PDF Viewer, you can follow the steps below +Follow these steps to load a PDF from Box cloud storage using the server-backed PDF Viewer. -**Step 1** Set up a Box developer account and create a Box application +**Step 1:** Set up a Box developer account and create a Box application -To access Box storage programmatically, you'll need a developer account with Box. Go to the [Box Developer Console](https://developer.box.com/), sign in or create a new account, and then create a new Box application. This application will provide you with the necessary credentials Client ID and Client Secret to authenticate and access Box APIs. Before accessing files, you need to authenticate your application to access your Box account. Box API supports `OAuth 2.0 authentication` for this purpose. +Create a developer account and Box application in the [Box Developer Console](https://developer.box.com/). Note the Client ID and Client Secret. Use OAuth 2.0 to authenticate the application. -**Step 2:** Create a Simple PDF Viewer Sample in JavaScript +**Step 2:** Create a PDF Viewer sample in JavaScript Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF viewer sample in JavaScript. This will give you a basic setup of the PDF viewer component. -**Step 3:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 3:** Modify the PdfViewerController.cs file in the web service project 1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. @@ -36,7 +35,7 @@ using Box.V2.Config; using Box.V2.Models; ``` -4. Add the following private fields and constructor parameters to the `PdfViewerController` class, In the constructor, assign the values from the configuration to the corresponding fields +4. Add the following private fields and constructor parameters to PdfViewerController. In the constructor, assign values from configuration to the corresponding fields. ```csharp private IConfiguration _configuration; @@ -57,7 +56,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache } ``` -5. Modify the [Load()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#load) method to load the PDF file from Box cloud file storage. +5. Modify the [Load()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#load) method to load PDF files from Box cloud storage. ```csharp [HttpPost("Load")] @@ -127,11 +126,11 @@ public async Task Load([FromBody] Dictionary json } ``` -N> replace **Your_Box_Storage_Access_Token** with your actual box access token, and **Your_Folder_ID** with the ID of the folder in your box storage where you want to perform specific operations. Remember to use your valid box API credentials, as **Your_Box_Storage_ClientID** and **Your_Box_Storage_ClientSecret"** are placeholders for your application's API key and secret. +N> Replace the placeholders with your actual Box values: Access Token, Folder ID, Client ID, and Client Secret. -**Step 4:** Set the PDF Viewer Properties in JavaScript PDF viewer component +**Step 4:** Configure the PDF Viewer component -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from Box cloud file storage. Ensure that you correctly pass the document name from the files available in your box folder to the documentPath property. +Set the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) to your web service endpoint (replace the localhost URL with your server URL). Set documentPath to the PDF file name to load from Box cloud storage. Ensure the document name exists in your Box folder. ```javascript diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-dropbox-cloud-file-storage.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-dropbox-cloud-file-storage.md index 5778762a0..0607c3c51 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-dropbox-cloud-file-storage.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-dropbox-cloud-file-storage.md @@ -1,17 +1,16 @@ --- layout: post -title: Open PDF from Dropbox cloud storage in Javascript Pdfviewer | Syncfusion -description: Learn about how to Open PDF files from Dropbox cloud file storage in Javascript Pdfviewer control of Syncfusion Essential JS 2 and more details. +title: Open PDF from Dropbox cloud storage in JavaScript PDF Viewer | Syncfusion +description: Learn how to load PDFs from Dropbox cloud storage in the Syncfusion JavaScript PDF Viewer component using standalone and server-backed approaches. platform: document-processing -control: Open PDF files from Dropbox cloud file storage -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Open PDF file from Dropbox cloud file storage +# Open PDF from Dropbox cloud storage -PDF Viewer allows to load PDF file from Drop Box using either the Standalone or Server-backed PDF Viewer. Below are the steps and a sample to demonstrate how to open a PDF from Drop Box. +The JavaScript PDF Viewer component supports loading PDF files from Dropbox using either the standalone or the server-backed PDF Viewer. The following steps demonstrate both approaches. ## Using Standalone PDF Viewer @@ -19,13 +18,13 @@ To load a PDF file from Dropbox cloud file storage in a PDF Viewer, you can foll **Step 1** Create a Dropbox API -To create a Dropbox API App, you should follow the official documentation provided by Dropbox [link](https://www.dropbox.com/developers/documentation/dotnet#tutorial). The process involves visiting the Dropbox Developer website and using their App Console to set up your API app. This app will allow you to interact with Dropbox programmatically, enabling secure access to files and data. +Follow the [Dropbox documentation](https://www.dropbox.com/developers/documentation/dotnet#tutorial) to create an API app. This enables programmatic access with secure credentials. **Step 2:** Create a Simple PDF Viewer Sample in JavaScript Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF viewer sample in JavaScript. This will give you a basic setup of the PDF viewer component. -**Step 3:** Modify the `src/app/app.ts` File in the Angular Project +**Step 3:** Modify the `src/app/app.ts` file in the JavaScript project 1. Import the required namespaces at the top of the file: @@ -35,7 +34,7 @@ import { Dropbox } from 'dropbox'; 2. Create an instance of the Dropbox class using an access token for authentication. Next, call the filesDownload method of this Dropbox instance to download the file located at /PDF_Succinctly.pdf. Upon successfully downloading the file, extract the file blob from the response. Convert this file blob to a Base64 string using the blobToBase64 method. Finally, load the Base64 string into a PDF viewer control. -N> Replace **Your Access Token** with the actual Access Token of your Drop Box account. +N> Replace the placeholder with your actual Dropbox access token. ```typescript pdfviewer.created = function () { @@ -64,19 +63,19 @@ N> The **npm install dropbox** package must be installed in your application to [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-dropbox-cloud-file-storage/tree/master/Open%20and%20Save%20PDF%20in%20Drop%20Box%20using%20Standalone) -## Using Server-Backed PDF Viewer +## Using the server-backed PDF Viewer To load a PDF file from Dropbox cloud file storage in a PDF Viewer, you can follow the steps below -**Step 1** Create a Dropbox API +**Step 1:** Create a Dropbox API app To create a Dropbox API App, you should follow the official documentation provided by Dropbox [link](https://www.dropbox.com/developers/documentation/dotnet#tutorial). The process involves visiting the Dropbox Developer website and using their App Console to set up your API app. This app will allow you to interact with Dropbox programmatically, enabling secure access to files and data. -**Step 2:** Create a Simple PDF Viewer Sample in JavaScript +**Step 2:** Create a PDF Viewer sample in JavaScript Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF viewer sample in JavaScript. This will give you a basic setup of the PDF viewer component. -**Step 3:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 3:** Modify the `PdfViewerController.cs` file in the web service project 1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. @@ -167,11 +166,11 @@ public async Task Load([FromBody] Dictionary json } ``` -N> Replace **Your_Dropbox_Access_Token** with your actual Dropbox access token and **Your_Folder_Name** with your folder name. +N> Replace the placeholders with your actual Dropbox values: Access Token and Folder Name. -**Step 4:** Set the PDF Viewer Properties in JavaScript PDF viewer component +**Step 4:** Configure the PDF Viewer component -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from Dropbox cloud file storage. Ensure that you correctly pass the document name from the files available in your dropbox folder to the documentPath property. +Set the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) to your web service endpoint (replace the localhost URL with your server URL). Set documentPath to the PDF file name to load from Dropbox. Ensure the document name exists in your Dropbox folder. ```javascript diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-google-cloud-storage.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-google-cloud-storage.md index b79a16845..10b5d033a 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-google-cloud-storage.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-google-cloud-storage.md @@ -1,23 +1,22 @@ --- layout: post -title: Open PDF files from Google Cloud Storage in Javascript Pdfviewer control | Syncfusion -description: Learn about how to Open PDF files from Google Cloud Storage in Javascript Pdfviewer control of Syncfusion Essential JS 2 and more details. +title: Open PDF from Google Cloud Storage in JavaScript PDF Viewer | Syncfusion +description: Learn how to load PDFs from Google Cloud Storage in the Syncfusion JavaScript PDF Viewer component using a server-backed approach. platform: document-processing -control: Open PDF files from Google Cloud Storage -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Open PDF file from Google Cloud Storage +# Open PDF from Google Cloud Storage -To load a PDF file from Google Cloud Storage in a PDF Viewer, you can follow the steps below +Follow these steps to load a PDF from Google Cloud Storage using the server-backed PDF Viewer. **Step 1:** Create a Simple PDF Viewer Sample in JavaScript Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF viewer sample in JavaScript. This will give you a basic setup of the PDF viewer component. -**Step 2:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 2:** Modify the `PdfViewerController.cs` file in the web service project 1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. @@ -31,7 +30,7 @@ using Google.Cloud.Storage.V1; using Google.Apis.Auth.OAuth2; ``` -4. Add the following private fields and constructor parameters to the `PdfViewerController` class, In the constructor, assign the values from the configuration to the corresponding fields +4. Add the following private fields and constructor parameters to `PdfViewerController`. In the constructor, assign values from configuration to the corresponding fields. ```csharp // Private readonly object _storageClient @@ -95,7 +94,7 @@ public IActionResult Load([FromBody] Dictionary jsonObject) } ``` -6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration +6. Open `appsettings.json` in the web service project and add the following keys below the existing `"AllowedHosts"` configuration ```json { @@ -110,13 +109,13 @@ public IActionResult Load([FromBody] Dictionary jsonObject) } ``` -N> Replace **Your Bucket name from Google Cloud Storage** with the actual name of your Google Cloud Storage bucket +N> Replace the placeholder with the actual Google Cloud Storage bucket name. -N> Replace **path/to/service-account-key.json** with the actual file path to your service account key JSON file. Make sure to provide the correct path and filename. +N> Replace path/to/service-account-key.json with the actual file path to your service account key JSON file. -**Step 3:** Set the PDF Viewer Properties in JavaScript PDF viewer component +**Step 3:** Configure the PDF Viewer component -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from Google Cloud Storage. Ensure that you correctly pass the document name from the files available in your bucket to the documentPath property. +Set the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) to your web service endpoint (replace the localhost URL with your server URL). Set documentPath to the PDF file name to load from Google Cloud Storage. Ensure the document name exists in your bucket. ```javascript diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-google-drive.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-google-drive.md index 4035d0079..7ef06bf98 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-google-drive.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-google-drive.md @@ -1,17 +1,15 @@ --- layout: post -title: Open PDF files from Google Drive in Javascript Pdfviewer control | Syncfusion -description: Learn about how to Open PDF files from Google Drive in Javascript Pdfviewer control of Syncfusion Essential JS 2 and more details. +title: Open PDF from Google Drive in JavaScript PDF Viewer | Syncfusion +description: Learn how to load PDFs from Google Drive in the Syncfusion JavaScript PDF Viewer component using a server-backed approach. platform: document-processing -control: Open PDF files from Google Drive -publishingplatform: Javascript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Open PDF file from Google Drive +# Open PDF from Google Drive -To load a PDF file from Google Drive in a PDF Viewer, you can follow the steps below +Follow these steps to load a PDF from Google Drive using the server-backed PDF Viewer. **Step 1** Set up Google Drive API @@ -21,7 +19,7 @@ You must set up a project in the Google Developers Console and enable the Google Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF viewer sample in JavaScript. This will give you a basic setup of the PDF viewer component. -**Step 3:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 3:** Modify the `PdfViewerController.cs` file in the web service project 1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. @@ -35,7 +33,7 @@ using Google.Apis.Drive.v3; using Google.Apis.Util.Store; ``` -4. Add the following private fields and constructor parameters to the `PdfViewerController` class, In the constructor, assign the values from the configuration to the corresponding fields +4. Add the following private fields and constructor parameters to `PdfViewerController`. In the constructor, assign values from configuration to the corresponding fields. ```csharp private IConfiguration _configuration; @@ -55,7 +53,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache } ``` -5. Modify the [Load()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#load) method to load the PDF file from Google Drive. +5. Modify the [Load()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#load) method to load the PDF files from Google Drive. ```csharp [HttpPost("Load")] @@ -126,7 +124,7 @@ public async Task Load([FromBody] Dictionary json } ``` -6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration +6. Open `appsettings.json` in the web service project and add the following keys below the existing `AllowedHosts` configuration ```json { @@ -143,13 +141,13 @@ public async Task Load([FromBody] Dictionary json } ``` -N> Replace **Your Google Drive Folder ID**, **Your Application name**, and **Your Path to the OAuth 2.0 Client IDs json file** with your actual Google drive folder ID , Your name for your application and the path for the JSON file. +N> Replace the placeholders with your actual values: Google Drive Folder ID, Application name, and the path to the OAuth 2.0 client IDs JSON file. N> The **FolderId** part is the unique identifier for the folder. For example, if your folder URL is: `https://drive.google.com/drive/folders/abc123xyz456`, then the folder ID is `abc123xyz456`. -**Step 4:** Set the PDF Viewer Properties in JavaScript PDF viewer component +**Step 4:** Configure the PDF Viewer component -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from Google Drive. Ensure that you correctly pass the document name from the files available in your drive folder to the documentPath property. +Set the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) to your web service endpoint (replace the localhost URL with your server URL). Set documentPath to the PDF file name to load from Google Drive. Ensure the document name exists in your Drive folder. ```javascript diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-one-drive.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-one-drive.md index dbe2b5054..76006c42c 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-one-drive.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-file/from-one-drive.md @@ -1,27 +1,25 @@ --- layout: post -title: Open PDF files from One Drive in Javascript Pdfviewer control | Syncfusion -description: Learn about how to Open PDF files from One Drive in Javascript Pdfviewer control of Syncfusion Essential JS 2 and more details. +title: Open PDF from OneDrive in JavaScript PDF Viewer | Syncfusion +description: Learn how to load PDFs from OneDrive in the Syncfusion JavaScript PDF Viewer component using a server-backed approach. platform: document-processing -control: Open PDF files from One Drive -publishingplatform: Javascript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Open PDF file from One Drive +# Open PDF from OneDrive -To load a PDF file from One Drive in a PDF Viewer, you can follow the steps below +Follow these steps to load a PDF from OneDrive using the server-backed PDF Viewer. -**Step 1** Create the Microsoft graph API. +**Step 1:** Create a Microsoft Graph API application -Need to create a Microsoft Graph API application and obtain the necessary credentials, namely the application ID and tenant ID. Follow the steps provided in the [link](https://learn.microsoft.com/en-us/training/modules/msgraph-access-file-data/3-exercise-access-files-onedrive) to create the application and obtain the required IDs. +Create a Microsoft Graph API application and obtain the application ID and tenant ID. Follow this [guide](https://learn.microsoft.com/en-us/training/modules/msgraph-access-file-data/3-exercise-access-files-onedrive) **Step 2:** Create a Simple PDF Viewer Sample in JavaScript Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF viewer sample in JavaScript. This will give you a basic setup of the PDF viewer component. -**Step 3:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 3:** Modify the `PdfViewerController.cs` file in the web service project 1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. @@ -36,7 +34,7 @@ using Microsoft.Identity.Client; using Helpers; ``` -4. Add the following private fields and constructor parameters to the `PdfViewerController` class, In the constructor, assign the values from the configuration to the corresponding fields +4. Add the following private fields and constructor parameters to `PdfViewerController`. In the constructor, assign values from configuration to the corresponding fields. ```csharp private IConfiguration _configuration; @@ -55,7 +53,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache } ``` -5. Modify the [Load()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#load) method to load the PDF file from One Drive. +5. Modify the [Load()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#load) method to load the PDF files from One Drive. ```csharp [HttpPost("Load")] @@ -122,7 +120,7 @@ public async Task Load([FromBody] Dictionary json } ``` -6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration +6. Open `appsettings.json` in the web service project and add the following keys below the existing `AllowedHosts` configuration ```json { @@ -140,11 +138,11 @@ public async Task Load([FromBody] Dictionary json ``` -N> Replace **Your_Tenent_ID**, **Your_Application_ID**, and **Your_Folder_Name_To_Access_The_Files_In_Onedrive** with your actual tenant ID, application ID, and folder name. +N> Replace the placeholders with your actual values: Tenant ID, Application ID, and OneDrive folder name. -**Step 4:** Set the PDF Viewer Properties in JavaScript PDF viewer component +**Step 4:** Configure the PDF Viewer component -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from One Drive. Ensure that you correctly pass the document name from the files available in your drive folder to the documentPath property. +Set the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) to your web service endpoint (replace the localhost URL with your server URL). Set `documentPath` to the PDF file name to load from OneDrive. Ensure the document name exists in your OneDrive folder. ```javascript diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-files.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-files.md index 74acc3977..5dcbf146c 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-files.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/open-pdf-files.md @@ -1,33 +1,30 @@ --- layout: post -title: Open PDF files Javascript Pdfviewer control | Syncfusion -description: This page helps you to learn about how to load PDF files from various locations in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Open PDF files in JavaScript PDF Viewer | Syncfusion +description: Learn how to load PDF files in the Syncfusion JavaScript PDF Viewer from URLs, base64 strings, and databases by configuring the required server-backed services. platform: document-processing -control: Open PDF files -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Open PDF files +# Open PDF files in JavaScript PDF Viewer -You might need to open and view the PDF files from various location. In this section, you can find the information about how to open PDF files from URL, database and as base64 string. +Load documents into the PDF Viewer from hosted URLs, base64 strings, or database storage. The following sections outline each scenario and the configuration required for server-backed viewing. -## Opening a PDF from URL +## Open a PDF from a URL -If you have your PDF files in the web, you can open it in the viewer using URL. +Use this approach when the PDF file is hosted on a web server. -**Step 1:** Create a Simple PDF Viewer Sample in JavaScript +**Step 1:** Create a JavaScript PDF Viewer sample -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF viewer sample in JavaScript. This will give you a basic setup of the PDF viewer component. +Follow the [JavaScript getting started guide](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to scaffold a basic PDF Viewer application. -**Step 2:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 2:** Update the `PdfViewerController.cs` file in the web service project -1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. - -2. Open the `PdfViewerController.cs` file in your web service project. - -3. Modify the [Load()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#load) method to open it in the viewer using URL +1. Create a web service project in .NET Core 3.0 or later. Refer to [How to create a PDF Viewer web service in .NET Core](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for guidance. +2. Open the `PdfViewerController.cs` file. +3. Modify the [Load](https://ej2.syncfusion.com/documentation/api/pdfviewer/#load) method to resolve remote URLs when `isFileName` is `true`. ```csharp @@ -75,9 +72,9 @@ public IActionResult Load([FromBody] Dictionary jsonData) ``` -**Step 3:** Set the PDF Viewer Properties in React PDF viewer component +**Step 3:** Configure the PDF Viewer in the JavaScript application -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server.Modify the documentPath with the correct PDF Document URL want to load. +Update the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) with the hosted web service endpoint (replace `https://localhost:44396/pdfviewer` with your server URL) and set `documentPath` to the PDF file to load. ```javascript @@ -98,15 +95,15 @@ viewer.appendTo('#pdfViewer'); [View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/Save%20and%20Load/Load%20PDF%20file%20from%20URL) -## Opening a PDF from base64 data +## Open a PDF from base64 data -The following steps explains how the PDF file can be loaded in PDF Viewer as base64 string. +Convert PDFs to base64 strings when you need to stream content directly from an API response or store it inline. -**Step 1:** Create a Simple PDF Viewer Sample in Angular +**Step 1:** Create a JavaScript PDF Viewer sample -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF viewer sample in Angular. This will give you a basic setup of the PDF viewer component. +Use the [JavaScript getting started guide](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to initialize the PDF Viewer project. -**Step 2:** Use the following code snippet to load PDF document using base64 string. +**Step 2:** Load the document by passing a base64 string to the `load` method. ``` @@ -121,20 +118,18 @@ document.getElementById('load').addEventListener('click', () => { ``` [View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/Save%20and%20Load/Load%20PDF%20file%20from%20base64%20string/Web%20Service) -## Opening a PDF from database - -To load a PDF file from SQL Server database in a PDF Viewer, you can follow the steps below - -**Step 1:** Create a Simple PDF Viewer Sample in JavaScript +## Open a PDF from a database -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF viewer sample in JavaScript. This will give you a basic setup of the PDF viewer component. +Retrieve PDF files stored in SQL Server by extending the server-backed web service. -**Step 2:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 1:** Create a JavaScript PDF Viewer sample -1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. +Follow the [JavaScript getting started guide](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to configure the client application. -2. Open the `PdfViewerController.cs` file in your web service project. +**Step 2:** Update the `PdfViewerController.cs` file in the web service project +1. Create a web service project in .NET Core 3.0 or later. Refer to [How to create a PDF Viewer web service in .NET Core](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for detailed steps. +2. Open the `PdfViewerController.cs` file. 3. Import the required namespaces at the top of the file: ```csharp @@ -142,7 +137,7 @@ using System.IO; using System.Data.SqlClient; ``` -4. Add the following private fields and constructor parameters to the `PdfViewerController` class, In the constructor, assign the values from the configuration to the corresponding fields +4. Add the following private fields and constructor parameters to the `PdfViewerController` class. In the constructor, assign configuration values to these fields. ```csharp private IConfiguration _configuration; @@ -157,7 +152,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache } ``` -5. Modify the [Load()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#load) method to open it in the viewer using URL +5. Modify the [Load](https://ej2.syncfusion.com/documentation/api/pdfviewer/#load) method to stream the PDF from SQL Server when `isFileName` is `true`. ```csharp @@ -224,8 +219,8 @@ public IActionResult Load([FromBody] Dictionary jsonData) } ``` -N> Replace **Your Connection string from SQL server** with the actual connection string for your SQL Server database +N> Replace **Your connection string for SQL server** with the actual connection string for your SQL Server database. -N> The **System.Data.SqlClient** package must be installed in your application to use the previous code example. You need to modify the connectionString variable in the previous code example as per the connection string of your database. +N> Install the **System.Data.SqlClient** package and update the `connectionString` value to match your environment before running the sample. [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-database) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf-overview.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf-overview.md new file mode 100644 index 000000000..5201456a8 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf-overview.md @@ -0,0 +1,28 @@ +--- +layout: post +title: Organize pages in JavaScript PDF Viewer | Syncfusion +description: Learn how to reorder, rotate, insert, delete, and save pages with the Syncfusion JavaScript PDF Viewer component. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Organize pages in JavaScript PDF Viewer + +The JavaScript PDF Viewer component provides an Organize Pages panel that helps you prepare documents before sharing them. Use it to tidy scanned files, move pages into the right order, and duplicate important content without leaving the viewer. + +To open the Organize Pages panel, load a document, ensure that the Organize Pages toolbar item is enabled, and choose **Organize Pages** from the left vertical toolbar. The document must allow page-level edits; otherwise, the toolbar item is hidden. + +The Organize Pages panel supports the following actions: + +* **Rotate pages**: Fix page orientation in 90-degree increments to correct scanned pages. +* **Rearrange pages**: Drag and drop thumbnails to update the reading order. +* **Insert new pages**: Add blank pages at the required position. +* **Delete pages**: Remove pages that are no longer needed. +* **Copy pages**: Duplicate selected pages to reuse content elsewhere in the document. +* **Import a PDF document**: Merge the current document with pages from another PDF file. +* **Select all pages**: Apply bulk actions, such as rotation or deletion, to every page. +* **Save updates**: Review changes in real time and use **Save** or **Save As** to download the revised document. + +After completing the changes, apply them by selecting **Save** to overwrite the current document or **Save As** to download a new copy that retains the updated page order. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf.md index 98f3aae19..5c38ef1ae 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf.md @@ -4,7 +4,6 @@ title: Organize Pages in Javascript PDF Viewer control | Syncfusion description: Learn here all about Organize Pages in Syncfusion Javascript PDF Viewer control of Syncfusion Essential JS 2 and more. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/organize-page-mobile-view.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/organize-page-mobile-view.md new file mode 100644 index 000000000..4121ee709 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/organize-page-mobile-view.md @@ -0,0 +1,37 @@ +--- +layout: post +title: Organize Pages in Mobile PDF Viewer | Syncfusion +description: Learn how to organize pages in the mobile PDF viewer, including rotating, rearranging, inserting, deleting, and copying pages on mobile devices +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Organize Pages in Mobile PDF Viewer + +The PDF Viewer offers a mobile-responsive layout for the `Organize Pages` feature, ensuring a seamless experience on smaller devices. When viewed on a mobile device, the toolbar and navigation elements adapt to the screen size, providing easy access to all page management tools. + +## Mobile-Friendly Toolbar + +In the mobile view, the `Organize Pages` toolbar is displayed at the bottom of the screen for easy one-handed access. The toolbar includes the same set of tools as the desktop version, such as insert, delete, and rotate, but with a mobile-optimized layout. + +## Context Menu for Page Operations + +To perform actions on a page thumbnail, tap and hold on the thumbnail to open a context menu. This menu contains all the available page operations: + +* **Rotate Clockwise**: Rotate the selected page 90 degrees clockwise. +* **Rotate Counter-Clockwise**: Rotate the selected page 90 degrees counter-clockwise. +* **Insert Page**: Insert a new page. +* **Copy Page**: Duplicate the selected page. +* **Delete Page**: Remove the selected page. +* **Select All**: Select all pages in the document. + + +![Page Organizer Operations](../images/Context-Menu-Page-Operations1.png) + +## Rearranging Pages on Mobile + +To rearrange pages, tap and hold a page thumbnail to select it, then drag it to the desired position. A blue line will indicate the drop location. + +By providing a mobile-friendly interface, the PDF Viewer ensures that users can efficiently manage their PDF documents from any device, anywhere. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/organize-pdf-events.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/organize-pdf-events.md new file mode 100644 index 000000000..4b025f3d6 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/organize-pdf-events.md @@ -0,0 +1,80 @@ +--- +layout: post +title: Organize Pages Events in JavaScript PDF Viewer | Syncfusion +description: Learn how to organize pages Events in the PDF viewer, including rotating, rearranging, inserting, deleting, and copying pages on mobile devices. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Organize Pages Events in PDF Viewer + +The PDF Viewer provides events to track and respond to actions within the page organizer, allowing for the customization of page manipulation features. + +## pageOrganizerSaveAs + +The `pageOrganizerSaveAs` event is triggered when a save action is performed in the page organizer. + +- Occurs when the **Save as** button in the page organizer toolbar is clicked after modifying the document structure. + +The event arguments provide the necessary information about the save event: + +- `fileName`: The name of the currently loaded PDF document. +- `downloadDocument`: A base64 string of the modified PDF document data. +- `cancel`: A boolean that, when set to `true`, prevents the default save action from proceeding. + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, + ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + pageOrganizerSaveAs: function (args) { + console.log('File Name is ' + args.fileName); + console.log('Document data ' + args.downloadDocument); + } +}); + +pdfviewer.appendTo('#PdfViewer'); +``` + +## pageOrganizerZoomChanged + +The `pageOrganizerZoomChanged` event is triggered when the zoom level of the page organizer is changed. + +- This event is fired when the user interacts with the zoom slider in the page organizer. The `showImageZoomingSlider` property in `pageOrganizerSettings` must be set to `true` for the slider to be visible. + + +Event arguments: + +- `previousZoomValue`: The previous zoom value. +- `currentZoomValue`: The current zoom value. + +```javascript +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.Annotation, + ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + pageOrganizerZoomChanged: function (args) { + console.log('Previous Zoom Value is ' + args.previousZoom); + console.log('Current Zoom Value is ' + args.currentZoom); + } +}); + +pdfviewer.pageOrganizerSettings = { showImageZoomingSlider: true }; +pdfviewer.appendTo('#PdfViewer'); +``` + +## Related event documentation + +- Overall Viewer events: [Event](../event) +- Annotation events: [Annotation events](../annotations/annotation-event) +- Form designer events: [Form field events](../form-designer/form-field-events) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/programmatic-support-for-organize-page.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/programmatic-support-for-organize-page.md new file mode 100644 index 000000000..c6a1dcbee --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/programmatic-support-for-organize-page.md @@ -0,0 +1,155 @@ +--- +layout: post +title: Programmatic Support for Organize Pages in JavaScript PDF Viewer control | Syncfusion +description: Learn here all about Programmatic Support for Organize Pages in Syncfusion JavaScript PDF Viewer control of Syncfusion Essential JS 2 and more. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Programmatic Support for Organize Pages in JavaScript PDF Viewer control + +The PDF Viewer provides comprehensive programmatic support for organizing pages, allowing you to integrate and manage PDF functionalities directly within your application. This section details the available APIs to enable, control, and interact with the page organization features. + +## Enable or disable the page organizer + +The page organizer feature can be enabled or disabled using the `enablePageOrganizer` property. By default, this feature is enabled. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, + ej.pdfviewer.TextSearch, ej.pdfviewer.FormFields, ej.pdfviewer.FormDesigner, ej.pdfviewer.PageOrganizer +); + +var pdfviewer = new ej.pdfviewer.PdfViewer(); +pdfviewer.documentPath = 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf'; +pdfviewer.resourceUrl = 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib'; +pdfviewer.enablePageOrganizer = true; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, + ej.pdfviewer.TextSearch, ej.pdfviewer.FormFields, ej.pdfviewer.FormDesigner, ej.pdfviewer.PageOrganizer +); + +var pdfviewer = new ej.pdfviewer.PdfViewer(); +pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; +pdfviewer.documentPath = 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf'; +pdfviewer.resourceUrl = 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib'; +pdfviewer.enablePageOrganizer = true; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +## Open the page organizer on document load + +You can control whether the page organizer dialog opens automatically when a document is loaded using the `isPageOrganizerOpen` property. The default value is `false`. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, + ej.pdfviewer.TextSearch, ej.pdfviewer.FormFields, ej.pdfviewer.FormDesigner, ej.pdfviewer.PageOrganizer +); + +var pdfviewer = new ej.pdfviewer.PdfViewer(); +pdfviewer.documentPath = 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf'; +pdfviewer.resourceUrl = 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib'; +pdfviewer.isPageOrganizerOpen = true; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, + ej.pdfviewer.TextSearch, ej.pdfviewer.FormFields, ej.pdfviewer.FormDesigner, ej.pdfviewer.PageOrganizer +); + +var pdfviewer = new ej.pdfviewer.PdfViewer(); +pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; +pdfviewer.documentPath = 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf'; +pdfviewer.resourceUrl = 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib'; +pdfviewer.isPageOrganizerOpen = true; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +## Customize page organizer settings + +The `pageOrganizerSettings` API allows you to customize the page management functionalities. You can enable or disable actions such as deleting, inserting, rotating, copying, importing, and rearranging pages, as well as configure thumbnail zoom settings. By default, all actions are enabled, and standard zoom settings are applied. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, + ej.pdfviewer.TextSearch, ej.pdfviewer.FormFields, ej.pdfviewer.FormDesigner, ej.pdfviewer.PageOrganizer +); + +var pdfviewer = new ej.pdfviewer.PdfViewer(); +pdfviewer.documentPath = 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf'; +pdfviewer.resourceUrl = 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib'; +pdfviewer.pageOrganizerSettings = {canDelete: true, canInsert: true, canRotate: true, canCopy: true, canRearrange: true, canImport: true, imageZoom: 1, showImageZoomingSlider: true, imageZoomMin: 1, imageZoomMax: 5} +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, + ej.pdfviewer.TextSearch, ej.pdfviewer.FormFields, ej.pdfviewer.FormDesigner, ej.pdfviewer.PageOrganizer +); + +var pdfviewer = new ej.pdfviewer.PdfViewer(); +pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; +pdfviewer.documentPath = 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf'; +pdfviewer.resourceUrl = 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib'; +pdfviewer.pageOrganizerSettings = {canDelete: true, canInsert: true, canRotate: true, canCopy: true, canRearrange: true, canImport: true, imageZoom: 1, showImageZoomingSlider: true, imageZoomMin: 1, imageZoomMax: 5} +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +## Open the page organizer dialog + +The `openPageOrganizer` method programmatically opens the page organizer dialog, providing access to page management tools. + +```html + +``` + +```js +document.getElementById('openPageOrganizer').addEventListener('click', function () { + viewer.pageOrganizer.openPageOrganizer(); +}); +``` + +## Close the page organizer dialog + +The `closePageOrganizer` method programmatically closes the page organizer dialog. + +```html + +``` + +```js +document.getElementById('closePageOrganizer').addEventListener('click', function () { + viewer.pageOrganizer.closePageOrganizer(); +}); +``` diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/toolbar-organize-page.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/toolbar-organize-page.md new file mode 100644 index 000000000..a822128b3 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/toolbar-organize-page.md @@ -0,0 +1,140 @@ +--- +layout: post +title: Organize Page Toolbar Customization in JavaScript PDF Viewer control | Syncfusion +description: Learn here all about Organize Page Toolbar Customization in Syncfusion JavaScript PDF Viewer control of Syncfusion Essential JS 2 and more. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Organize Page Toolbar Customization in JavaScript PDF Viewer control + +The PDF Viewer allows you to customize the toolbar for the organize pages feature, enabling you to show or hide specific tools based on your application's requirements. The `pageOrganizerSettings` API provides properties to control the visibility of each tool in the organize pages dialog. + +## Show or hide the insert option + +The `canInsert` property controls the visibility of the insert tool. When set to `false`, the insert tool will be hidden from the toolbar. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, + ej.pdfviewer.TextSearch, ej.pdfviewer.FormFields, ej.pdfviewer.FormDesigner, ej.pdfviewer.PageOrganizer +); + +var pdfviewer = new ej.pdfviewer.PdfViewer(); +pdfviewer.documentPath = 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf'; +pdfviewer.resourceUrl = 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib'; +pdfviewer.pageOrganizerSettings = { canInsert: false }; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, + ej.pdfviewer.TextSearch, ej.pdfviewer.FormFields, ej.pdfviewer.FormDesigner, ej.pdfviewer.PageOrganizer +); + +var pdfviewer = new ej.pdfviewer.PdfViewer(); +pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; +pdfviewer.documentPath = 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf'; +pdfviewer.resourceUrl = 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib'; +pdfviewer.pageOrganizerSettings = { canInsert: false }; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +## Show or hide the delete option + +The `canDelete` property controls the visibility of the delete tool. When set to `false`, the delete tool will be hidden. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, + ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.FormFields, + ej.pdfviewer.FormDesigner, ej.pdfviewer.PageOrganizer +); + +var pdfviewer = new ej.pdfviewer.PdfViewer(); +pdfviewer.documentPath = 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf'; +pdfviewer.resourceUrl = 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib'; +pdfviewer.pageOrganizerSettings = {canDelete: false}; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, + ej.pdfviewer.TextSearch, ej.pdfviewer.FormFields, ej.pdfviewer.FormDesigner, ej.pdfviewer.PageOrganizer +); + +var pdfviewer = new ej.pdfviewer.PdfViewer(); +pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; +pdfviewer.documentPath = 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf'; +pdfviewer.resourceUrl = 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib'; +pdfviewer.pageOrganizerSettings = {canDelete: false}; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +## Show or hide the rotate option + +The `canRotate` property controls the visibility of the rotate tool. When set to `false`, the rotate tool will be hidden. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, + ej.pdfviewer.TextSearch, ej.pdfviewer.FormFields, ej.pdfviewer.FormDesigner, ej.pdfviewer.PageOrganizer +); + +var pdfviewer = new ej.pdfviewer.PdfViewer(); +pdfviewer.documentPath = 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf'; +pdfviewer.resourceUrl = 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib'; +pdfviewer.pageOrganizerSettings = {canRotate: false}; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, + ej.pdfviewer.TextSearch, ej.pdfviewer.FormFields, ej.pdfviewer.FormDesigner, ej.pdfviewer.PageOrganizer +); + +var pdfviewer = new ej.pdfviewer.PdfViewer(); +pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; +pdfviewer.documentPath = 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf'; +pdfviewer.resourceUrl = 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib'; +pdfviewer.pageOrganizerSettings = {canRotate: false}; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +## Show or hide the copy option + +The `canCopy` property controls the visibility of the copy tool. When set to `false`, the copy tool will be hidden. + +## Show or hide the import option + +The `canImport` property controls the visibility of the import tool. When set to `false`, the import tool will be hidden. + +## Show or hide the rearrange option + +The `canRearrange` property controls the ability to rearrange pages. When set to `false`, pages cannot be rearranged. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/ui-interactions-organize-page.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/ui-interactions-organize-page.md new file mode 100644 index 000000000..23725d9c1 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/ui-interactions-organize-page.md @@ -0,0 +1,97 @@ +--- +layout: post +title: UI Interactions for Organizing Pages in JavaScript PDF Viewer | Syncfusion +description: Learn about the UI interactions for organizing pages in the Syncfusion JavaScript PDF Viewer control, including rotating, rearranging, inserting, deleting, and copying pages. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# UI Interactions for Organizing Pages in JavaScript PDF Viewer + +The PDF Viewer provides an intuitive user interface for managing and organizing pages within a PDF document. This section covers the various UI interactions available in the `Organize Pages` dialog. + + + +## Rotating PDF pages + +You can adjust the orientation of pages to ensure proper alignment. The rotate icon in the Organize Pages dialog provides the following options: + +* **Rotate clockwise**: Rotate the selected pages 90 degrees clockwise. +* **Rotate counter-clockwise**: Rotate the selected pages 90 degrees counter-clockwise. + +![Rotate PDF pages](../images/rotate-rearrange.gif) + +## Rearranging PDF pages + +Easily change the sequence of pages using the drag-and-drop method: + +* **Drag and drop**: Click and drag a page thumbnail to the desired position within the document, then release it to reorder the pages. + +![Rearrange PDF pages](../images/rotate-rearrange.gif) + +## Inserting new pages + +Effortlessly add blank pages to your document with the following options: + +* **Insert blank page left**: Insert a blank page to the left of the selected page. +* **Insert blank page right**: Insert a blank page to the right of the selected page. + +![Insert PDF pages](../images/insert-delete-copy.gif) + +## Deleting PDF pages + +Remove unwanted pages from your document with these steps: + +1. **Select pages to delete**: Click on the thumbnails of the pages you wish to remove. You can select multiple pages at once. +2. **Delete selected pages**: Use the delete option in the Organize Pages pane to remove the selected pages from the document. + +![Delete PDF pages](../images/insert-delete-copy.gif) + +## Copying PDF pages + +Duplicate pages within your PDF document effortlessly: + +* **Select pages to copy**: Click on the page thumbnails you wish to duplicate. +* **Copy selected pages**: Use the copy option to create duplicates. The copied pages will be added to the right of the selected pages. + +![Copy PDF pages](../images/insert-delete-copy.gif) + +## Importing a PDF document + +Seamlessly import another PDF document into your current document: + +* **Import PDF document**: Click the **Import Document** button to select and import a PDF. The imported document will be inserted as a thumbnail. If a page is selected, the thumbnail will be added to its right. If no pages are selected, it will be added as the first page. The imported PDF will be merged with the current document upon saving. + +![Import PDF](../images/import.gif) + +## Selecting all pages + +Select all pages simultaneously to perform bulk operations, such as rotating or deleting all pages at once. + +![Select all PDF pages](../images/selectall.png) + +## Zooming page thumbnails + +Adjust the size of page thumbnails for better visibility and precision: + +* Use the zoom slider to increase or decrease the thumbnail size. +* Zoom in to see more detail on each page. +* Zoom out to view more pages at once. + +![Zoom PDF pages](../images/zoomOrganize.png) + +## Real-time updates and saving + +All changes are reflected instantly in the Organize Pages dialog. Click the **Save** button to apply the modifications to the document. Use the **Save As** feature to download a new version of the PDF with your changes. + +## Keyboard shortcuts + +The following keyboard shortcuts are available in the Organize Pages dialog: + +* **Ctrl+Z**: Undo the last action. +* **Ctrl+Y**: Redo the last undone action. +* **Ctrl+Scroll**: Zoom in and out on page thumbnails for better visibility. + +![Undo and Redo actions](../images/undo-redo.png) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/overview.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/overview.md index 1174fb29b..fa8ccd658 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/overview.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/overview.md @@ -1,39 +1,40 @@ --- -title: Overview of JavaScript PDF Viewer Component | Syncfusion -description: Checkout and learn about overview of the Syncfusion JavaScript PDF Viewer component and much more details. +layout: post +title: Overview of JavaScript PDF Viewer component | Syncfusion +description: Learn about the Syncfusion JavaScript PDF Viewer component, its key capabilities, and supported platforms. platform: document-processing control: PDF Viewer -documentation: UG +documentation: ug --- -# Overview of JavaScript PDF Viewer Component +# Overview of JavaScript PDF Viewer component -The Syncfusion [`JavaScript PDF Viewer`](https://www.syncfusion.com/pdf-viewer-sdk) component is a lightweight and modular component for viewing and printing PDF files. It provides the best viewing experience available with core interactions such as zooming, scrolling, text searching, text selection, and text copying. The thumbnail, bookmark, hyperlink and table of contents support provides easy navigation within and outside the PDF files. +The Syncfusion [JavaScript PDF Viewer](https://www.syncfusion.com/pdf-viewer-sdk) component enables users to view, annotate, prepare and fill forms, and print PDF files directly in web applications. ## Setup -To install PDF Viewer and its dependent packages, use the following command. +Install the PDF Viewer and its dependent packages with the following command. ``` npm install @syncfusion/ej2-pdfviewer ``` -## Key Features - -*[`View PDF Document`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) - Open and display both the normal and the protected PDF files with AES and RC4 encryption. -*[`Annotations`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/annotation/text-markup-annotation) - Annotate with text markup, shapes, stamps, ink, and sticky notes.Form filling and form designing can be done. -*[`Form Fields`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/form-designer/create-fillable-pdf-forms/create-programmatically) - Form filling and form designing can be done. -*[`Signature`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/handwritten-signature) - Hand-written and digital signatures are allowed. -*[`Toolbar`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/toolbar) - Built-in-toolbar and custom toolbars to perform user interaction of PDF Viewer functionalities. -*[`Navigation`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/navigation) - Easy navigation with the help of bookmarks, thumbnails, hyperlinks, and table of contents. -*[`Magnification`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/magnification) - Fit to page, fit to width, and automatic (fits to the visible area). -*[`Search`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/text-search) - Search a text easily across the PDF document. -*[`Core Interactions`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/interaction-mode) - Allows scrolling, zooming, panning, selection, and page navigation. -*[`Print`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/print) - Print the entire document or a specific page directly from the browser. -*[`Globalization`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/globalization) - Provides inherent support to localize the UI. - -## Supported Web platforms - -* [Javascript](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) +## Key features + +* [`View PDF document`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) – Open and display both standard and encrypted PDF files with AES or RC4 protection. +* [`Annotations`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/annotation/text-markup-annotation) – Add text markup, shapes, stamps, ink, and sticky notes. +* [`Form fields`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/form-designer/create-fillable-pdf-forms/create-programmatically) – Design and fill interactive forms. +* [`Signature`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/handwritten-signature) – Capture handwritten or digital signatures in the document. +* [`Toolbar`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/toolbar) – Use the built-in toolbar or create custom toolbars for common interactions. +* [`Navigation`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/navigation) – Navigate using bookmarks, thumbnails, hyperlinks, and the table of contents. +* [`Magnification`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/magnification) – Adjust zoom with fit-to-page, fit-to-width, or automatic options. +* [`Search`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/text-search) – Find text anywhere in the PDF document. +* [`Core interactions`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/interaction-mode) – Scroll, zoom, pan, select, and navigate between pages. +* [`Print`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/print) – Print the entire PDF or selected pages from the browser. +* [`Globalization`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/globalization) – Localize the user interface for different languages and cultures. + +## Supported web platforms + +* [JavaScript (ES5)](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) * [Angular](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/angular/getting-started) * [React](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/react/getting-started) * [Vue](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/vue/getting-started) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/print.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/print.md index c67aa4752..2140ed3dd 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/print.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/print.md @@ -1,16 +1,17 @@ --- layout: post -title: Print in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Print in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Print in JavaScript PDF Viewer | Syncfusion +description: Learn how to enable, customize, and monitor printing in the Syncfusion JavaScript PDF Viewer component. platform: document-processing control: Print -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Print in Javascript Pdfviewer control +# Print in JavaScript PDF Viewer -The PDF Viewer supports printing the loaded PDF file. You can enable/disable the print using the following code snippet. +The Syncfusion JavaScript PDF Viewer component lets users print a loaded PDF document through the built-in toolbar or programmatic calls. Control whether printing is available by setting the `enablePrint` property. + +The following HTML and JavaScript examples render the PDF Viewer with printing enabled in standalone and server-backed applications. ```html {% raw %} @@ -58,9 +59,11 @@ pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} -![Alt text](./images/print.png) +Select **Print** in the built-in toolbar to open the browser print dialog. + +![PDF Viewer print dialog preview](./images/print.png) -You can invoke print action using the following code snippet., +To start printing from code, call the `print.print()` method after loading a document. This approach is useful when you need to wire up custom UI or initiate printing automatically. ``` @@ -100,16 +103,15 @@ document.getElementById('print').addEventListener('click', function () { {% endhighlight %} {% endtabs %} -## Customization Print Quality using PrintScaleFactor API +## Customize print quality using the printScaleFactor API -The PDF Viewer allows you to adjust the print quality using the [PrintScaleFactor](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#printScaleFactor) API. The quality of the print improves as the print quality value increases from 0.5 to 5. +The PDF Viewer allows you to adjust the print rendering quality by setting the [printScaleFactor](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#printScaleFactor) property. Valid values range from 0.5 to 5. Higher values produce sharper output but also increase rendering time. -When the value is less than 0.5, the PDF is printed at a standard quality. When the value exceeds 5, the PDF is still printed at the standard quality. In standard quality, printScaleFactor value is set to 1 as default value. -The effective range for print quality is between 0.5 and 5. Higher values within this range will result in better print quality, but also increase the print time. +By default, `printScaleFactor` is set to 1. -By default, the printScaleFactor is set to 1. +N> Values outside the 0.5–5 range revert to the standard print quality (value 1). -* **The following code snippet demonstrates how to customize print quality using the PrintScaleFactor API in the PDF Viewer.** +The following example demonstrates how to update the scale factor before printing. {% tabs %} {% highlight js tabtitle="Standalone" %} @@ -138,9 +140,193 @@ pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} +## Enable print rotation in the PDF Viewer + +Set the `enablePrintRotation` property to control whether landscape pages are rotated automatically to fit the paper orientation. Keep it enabled to minimize clipping, or disable it to preserve the original orientation. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + enablePrintRotation: true +}); + +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.BookmarkView, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.TextSelection, ej.pdfviewer.Print, ej.pdfviewer.Navigation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.Annotation +); + +viewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/', + enablePrintRotation: true +}); + +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.BookmarkView, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.TextSelection, ej.pdfviewer.Print, ej.pdfviewer.Navigation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.Annotation +); + +viewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +## Print modes in the PDF Viewer + +Use the `printMode` property to choose how the document is printed. + +The supported values are: +* `Default`: Prints the document from the same window. +* `NewWindow`: Prints the document from a new window or tab, which can help with browser pop-up policies. + +N> Browser pop-up blockers must allow new windows or tabs when you use `PrintMode.NewWindow`. + +The following example shows how to set the print mode. +{% tabs %} +{% highlight js tabtitle="Standalone" %} + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + printMode: 'NewWindow' +}); + +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.BookmarkView, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.TextSelection, ej.pdfviewer.Print, ej.pdfviewer.Navigation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.Annotation +); + +viewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/', + printMode: 'NewWindow' +}); + +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.BookmarkView, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.TextSelection, ej.pdfviewer.Print, ej.pdfviewer.Navigation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.Annotation +); + +viewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + [View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to/Customize%20Print%20Quality) +## Print events + +Subscribe to print lifecycle events to track usage and implement custom workflows. + +| Name | Description | +|--------------|-------------| +| `printStart` | Raised when a print action begins. Use the event to log activity or cancel printing. | +| `printEnd` | Raised after a print action completes. Use the event to notify users or clean up resources. | + +### printStart event +The [`printStart`](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#printstart) event runs when printing starts from the toolbar or from code. Use it to validate prerequisites or cancel the action. + +#### Event arguments +Review [`PrintStartEventArgs`](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/printStartEventArgs/) for details such as `fileName` and the `cancel` option. + +The following example logs the file that is being printed and shows how to cancel the operation. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + printStart: function(args) { + console.log('Print action has started for file ' + args.fileName); + } +}); + +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.BookmarkView, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.TextSelection, ej.pdfviewer.Print, ej.pdfviewer.Navigation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.Annotation +); + +viewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/', + printStart: function(args) { + console.log('Print action has started for file ' + args.fileName); + } +}); + +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.BookmarkView, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.TextSelection, ej.pdfviewer.Print, ej.pdfviewer.Navigation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.Annotation +); + +viewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +### printEnd event +The [`printEnd`](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#printend) event triggers after printing completes. Use it to finalize analytics or inform users that printing finished. + +#### Event arguments +See [`PrintEndEventArgs`](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/printEndEventArgs/) for available values such as `fileName`. + +The following example logs the printed file name. + +{% tabs %} +{% highlight js tabtitle="Standalone" %} + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + printEnd: function(args) { + console.log('Printed File Name: ' + args.fileName); + } +}); + +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.BookmarkView, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.TextSelection, ej.pdfviewer.Print, ej.pdfviewer.Navigation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.Annotation +); + +viewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/', + printEnd: function(args) { + console.log('Printed File Name: ' + args.fileName); + } +}); + +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.BookmarkView, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.TextSelection, ej.pdfviewer.Print, ej.pdfviewer.Navigation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.Annotation +); + +viewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + ## See also * [Toolbar items](./toolbar) -* [Feature Modules](./feature-module) +* [Feature modules](./feature-module) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-amazon-s3.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-amazon-s3.md index 73d86cf31..3977fedbd 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-amazon-s3.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-amazon-s3.md @@ -1,35 +1,34 @@ --- layout: post -title: Save PDF files to AWS S3 in Javascript Pdfviewer control | Syncfusion -description: Learn about how to Save PDF files to AWS S3 in Javascript Pdfviewer control of Syncfusion Essential JS 2 and more details. +title: Save PDF files to AWS S3 in JavaScript PDF Viewer | Syncfusion +description: Learn how to save PDF files to AWS S3 using the Syncfusion JavaScript PDF Viewer component in standalone and server-backed configurations. platform: document-processing -control: Save PDF files to AWS S3 -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Save PDF file to AWS S3 +# Save PDF files to AWS S3 -PDF Viewer allows to save PDF file to AWS S3 using either the Standalone or Server-backed PDF Viewer. Below are the steps and a sample to demonstrate how to save PDF to AWS S3. +The JavaScript PDF Viewer component supports saving PDF files to AWS S3 using either the standalone or server-backed configuration. The following steps demonstrate both approaches. ## Using Standalone PDF Viewer -To save a PDF file to AWS S3, you can follow the steps below +To save a PDF file to AWS S3, you can follow the steps below: -**Step 1:** Create a Simple PDF Viewer Sample in JavaScript +**Step 1:** Create a PDF Viewer sample in JavaScript -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF viewer sample in JavaScript. This will give you a basic setup of the PDF viewer component. +Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample in JavaScript. This will set up the basic structure of your PDF Viewer application. -**Step 2:** Modify the `index.html` File in the JavaScript Project +**Step 2:** Modify the `index.html` file in the JavaScript project -1. AWS SDK for JavaScript, used for interacting with AWS services like S3: +1. Include the AWS SDK for JavaScript using this script ```javascript ``` -2. Configures AWS SDK with the region, access key, and secret access key. This configuration allows the application to interact with AWS services like S3. +2. Configure the AWS SDK with the region, access key, and secret access key. This enables the application to interact with AWS services such as S3. N> Replace **Your Region** with the actual Region of your AWS S3 account and **Your Access Key** with the actual Access Key of your AWS S3 account and **Your Security Access Key** with the actual Security Access Key of your AWS S3 account. @@ -41,7 +40,7 @@ AWS.config.update({ }); ``` -3. Configure a custom toolbar item for the download function to save a PDF file in Azure Blob Storage. +3. Configure a custom toolbar item for the download function to save a PDF file to AWS S3. ```javascript var toolItem1 = { @@ -52,7 +51,7 @@ var toolItem1 = { }; var pdfviewer = new ej.pdfviewer.PdfViewer({ - resourceUrl:'https://cdn.syncfusion.com/ej2/26.1.35/dist/ej2-pdfviewer-lib', + resourceUrl:'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', toolbarSettings : { toolbarItems: [ 'OpenOption', 'PageNavigationTool', 'MagnificationTool', 'PanTool', 'SelectionTool', 'SearchOption', 'PrintOption', toolItem1, 'UndoRedoTool', 'AnnotationEditTool', 'FormDesignerEditTool', 'CommentTool', 'SubmitForm'] } }); ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar,ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); @@ -64,7 +63,7 @@ pdfviewer.toolbarClick = function (args) { }; ``` -4. Retrieve the PDF viewer instance and save the current PDF as a Blob. Then, read the Blob using a FileReader to convert it into an ArrayBuffer, and upload the ArrayBuffer to AWS S3 using the putObject method of the S3 instance. +4. Retrieve the PDF Viewer instance, save the current PDF as a Blob, read it using FileReader to get an ArrayBuffer, and upload the ArrayBuffer to AWS S3 using the `putObject` method. N> Replace **Your Bucket Name** with the actual Bucket name of your AWS S3 account and **Your Key** with the actual File Key of your AWS S3 account. @@ -95,19 +94,21 @@ function saveDocument() { }; ``` +N> Install the aws-sdk package in the application to use the previous code example using this command: `npm install aws-sdk` + [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-aws-s3/tree/master/Open%20and%20Save%20PDF%20in%20AWS%20S3%20using%20Standalone). -## Using Server-Backed PDF Viewer +## Using server-backed PDF Viewer -To save a PDF file to AWS S3, you can follow the steps below +To save a PDF file to AWS S3, you can follow the steps below: **Step 1:** Create a PDF Viewer sample in JavaScript Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample in JavaScript. This will set up the basic structure of your PDF Viewer application. -**Step 2:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 2:** Modify the `PdfViewerController.cs` file in the web service project -1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. +1. Create a web service project in .NET Core 3.0 or later. For instructions, see this [article](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above). 2. Open the `PdfViewerController.cs` file in your web service project. @@ -139,7 +140,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache } ``` -5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF files to AWS S3 bucket +5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF file to the AWS S3 bucket. ```csharp @@ -176,7 +177,7 @@ public IActionResult Download([FromBody] Dictionary jsonObject) } ``` -6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration +6. Open the `appsettings.json` file in the web service project and add the following lines below the existing `"AllowedHosts"` configuration. ```json { @@ -193,11 +194,11 @@ public IActionResult Download([FromBody] Dictionary jsonObject) } ``` -N> Replace **Your Access Key from AWS S3**, **Your Secret Key from AWS S3**, and **Your Bucket name from AWS S3** with your actual AWS access key, secret key and bucket name +N> Replace the placeholders with the actual AWS access key, secret key, and bucket name. -**Step 3:** Set the PDF Viewer Properties in JavaScript PDF viewer component +**Step 3:** Set the PDF Viewer properties in the JavaScript PDF Viewer component -Modify the `serviceUrl` property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the [documentPath](https://ej2.syncfusion.com/documentation/api/pdfviewer/#documentpath) property of the PDF viewer component to the desired name of the PDF file you wish to load from AWS S3. Ensure that you correctly pass the document name from the files available in your AWS S3 bucket to the documentPath property. +Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF Viewer component with the accurate URL of the web service, replacing `https://localhost:44396/pdfviewer` with the actual server URL. Set the `documentPath` property to the desired PDF file name to load from AWS S3, and ensure that the document exists in the target bucket. ```javascript @@ -215,6 +216,6 @@ viewer.load('PDF_Succinctly.pdf', null); ``` -N> The **AWSSDK.S3** NuGet package must be installed in your application to use the previous code example. +N> Install the AWSSDK.S3 NuGet package in the web service application to use the previous code example. [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-aws-s3/tree/master/Open%20and%20Save%20PDF%20in%20AWS%20S3%20using%20Server-Backend) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-azure-active-directory.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-azure-active-directory.md index 3367217bb..062cbee84 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-azure-active-directory.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-azure-active-directory.md @@ -1,36 +1,35 @@ --- layout: post -title: Save PDF To AAD in Javascript Pdfviewer | Syncfusion -description: Learn how to Save PDF To AAD in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Save PDF files to Azure Active Directory (AAD) in JavaScript PDF Viewer | Syncfusion +description: Learn how to load and save PDF files with Azure Active Directory (AAD) using the Syncfusion JavaScript PDF Viewer component and a server-backed web service. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Save PDF To Azure Active Directory in Viewer +# Save PDF files to Azure Active Directory (AAD) -### **Overview** +### Overview -The Syncfusion PDF Viewer allows you to load and save PDF files directly from Azure Active Directory (AAD). Below are the steps to securely load and store PDF documents from and to AAD using the PDF Viewer. +The JavaScript PDF Viewer component supports loading and saving PDF files with Azure Active Directory (AAD). The following steps describe how to securely load and store PDF documents using a server-backed web service. -### **Steps to Open the PDF File from Azure Active Directory** +### Steps to open the PDF file from Azure Active Directory --- -### **Step 1: Register an Application in Azure Active Directory (AAD)** +### Step 1: Register an application in Azure Active Directory (AAD) -1. **Go to the Azure Portal**: +1. Go to the Azure portal: - Navigate to [Azure Portal](https://portal.azure.com). -2. **Register your Application**: +2. Register the application: - In the Azure portal, go to **Azure Active Directory** > **App registrations** > **New registration**. - Register your application and note down the **Application (client) ID** and **Directory (tenant) ID**. ![app-registration](../images/app-registration.png) -3. **Create a Client Secret**: +3. Create a client secret: - In the registered application, go to **Certificates & secrets**. - Click **New client secret**. - Provide a description and set an expiration period. @@ -41,9 +40,9 @@ The Syncfusion PDF Viewer allows you to load and save PDF files directly from Az --- -### **Step 2: Create the Azure Storage Account** +### Step 2: Create the Azure Storage account -1. **Create a Storage Account**: +1. Create a storage account: - In the Azure portal, use the search bar to search for **Storage accounts**. - Create a new storage account by filling in the required details (e.g., name, location, resource group, etc.). @@ -51,12 +50,12 @@ The Syncfusion PDF Viewer allows you to load and save PDF files directly from Az --- -### **Step 3: Assign Role to the Application** +### Step 3: Assign a role to the application -1. **Go to your Storage Account**: +1. Go to the storage account: - Navigate to **Access control (IAM)** > **Add role assignment** in your Azure Storage Account. -2. **Assign Role**: +2. Assign a role: - Assign the **Storage Blob Data Contributor** role to your registered application. - In the **Assign access to** dropdown, select **User, group, or service principal**. - Click on **Select members** and search for your registered application by name or client ID. @@ -66,20 +65,20 @@ The Syncfusion PDF Viewer allows you to load and save PDF files directly from Az ![add-role](../images/add-role.png) --- -### **Step 4: Upload the PDF Document to the Azure Storage Account** +### Step 4: Upload the PDF document to Azure Storage -1. **Navigate to Data Storage**: +1. Navigate to Data storage: - In the Azure portal, go to **Data storage** > **Containers**. -2. **Upload the PDF File**: +2. Upload the PDF file: - Create a new container and upload the PDF document you want to access in the PDF Viewer. ![upload-pdf](../images/upload-pdf.png) --- -### **Step 5: Server-Side Configuration** +### Step 5: Server-side configuration -1. **Configure Server-Side Code**: +1. Configure server-side code: - Open the server-side application (e.g., ASP.NET Core) and configure the following details in the `PdfViewerController` file: - `tenantId` (your Azure AD tenant ID), - `clientId` (your registered application client ID), @@ -87,34 +86,34 @@ The Syncfusion PDF Viewer allows you to load and save PDF files directly from Az - `blobServiceEndpoint` (your storage account blob service URL), - `containerName` (your container name in Azure Blob Storage). -2. **Run the Web Service**: +2. Run the web service: - After configuring the necessary details, run the web service to make it accessible. --- -### **Step 6: Client-Side Configuration** +### Step 6: Client-side configuration -1. **Run the JS Sample**: +1. Run the JavaScript sample: - Start the JS sample that includes the Syncfusion PDF Viewer. -2. **Load PDF from AAD**: +2. Load a PDF from AAD: - When the user clicks the **Load from AAD** button, the JS client will make an HTTP request to the server-side API to fetch the PDF from Azure Blob Storage. - The server will retrieve the PDF from Azure, convert it to a base64 string, and return it to the client. -3. **Display PDF in the PDF Viewer**: +3. Display the PDF in the PDF Viewer: - Once the base64 string is received, the PDF Viewer will load the PDF using the `viewer.load()` method. --- -### **Step 7: Save the PDF Document to Azure** +### Step 7: Save the PDF document to Azure -1. **Save PDF to AAD**: +1. Save PDF to AAD: - The user can click the **Save to AAD** button to upload any modifications to the PDF back to Azure Blob Storage. - This action sends the modified PDF to the server, where it is converted into a byte array and saved to the specified Azure Blob container. --- -### **Server-Side Code Snippets** +### Server-side code snippets ```cs string tenantId = "Provide the tenant id here"; string clientId = "Provide the clientid here"; @@ -170,7 +169,7 @@ public async Task SaveToAAD([FromBody] Dictionary -### **Client-side Code Snippets** +### Client-side code snippets ```js import { PdfViewer, Toolbar, TextSelection, TextSearch, Print, Navigation, Magnification, Annotation, FormDesigner, FormFields, CustomToolbarItemModel } from '@syncfusion/ej2-pdfviewer'; diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-azure-blob-storage.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-azure-blob-storage.md index 6d88c962c..7e3a09de9 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-azure-blob-storage.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-azure-blob-storage.md @@ -1,27 +1,26 @@ --- layout: post -title: Save PDF to Azure Blob Storage in Javascript Pdfviewer | Syncfusion -description: Learn about how to Save PDF files to Azure Blob Storage in Javascript Pdfviewer control of Syncfusion Essential JS 2 and more details. +title: Save PDF files to Azure Blob Storage in JavaScript PDF Viewer | Syncfusion +description: Learn how to save PDF files to Azure Blob Storage using the Syncfusion JavaScript PDF Viewer component in standalone and server-backed configurations. platform: document-processing -control: Save PDF files to Azure Blob Storage -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Save PDF file to Azure Blob Storage +# Save PDF files to Azure Blob Storage -PDF Viewer allows to save PDF file to Azure Blob Storage using either the Standalone or Server-backed PDF Viewer. Below are the steps and a sample to demonstrate how to save PDF to Azure Blob Storage. +The JavaScript PDF Viewer component supports saving PDF files to Azure Blob Storage using either the standalone or server-backed configuration. The following steps demonstrate both approaches. ## Using Standalone PDF Viewer -To save a PDF file to Azure Blob Storage, you can follow the steps below +To save a PDF file to Azure Blob Storage, follow these steps: **Step 1:** Create a PDF Viewer sample in JavaScript -Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample in JavaScript. This will set up the basic structure of your PDF Viewer application. +Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample in JavaScript. This sets up the basic structure of the PDF Viewer application. -**Step 2:** Modify the `src/app/app.ts` File in the Angular Project +**Step 2:** Modify the `src/app/app.ts` file in the JavaScript project 1. Import the required namespaces at the top of the file: @@ -29,15 +28,15 @@ Follow the instructions provided in this [link](https://help.syncfusion.com/docu import { BlockBlobClient } from "@azure/storage-blob"; ``` -2. Add the following private properties to the `app.ts`, and assign the values from the configuration to the corresponding properties +2. Add the following private property to `app.ts`, and assign the value from the configuration to the corresponding property. -N> Replace **Your SAS Url in Azure** with the actual SAS url for your Azure Blob Storage account. +N> Replace **Your SAS Url in Azure** with the actual SAS URL for the Azure Blob Storage account. ```typescript private SASUrl: string = "*Your SAS Url in Azure*"; ``` -3. Configure a custom toolbar item for the download function to save a PDF file in Azure Blob Storage. +3. Configure a custom toolbar item for the download function to save a PDF file to Azure Blob Storage. ```typescript let toolItem1: CustomToolbarItemModel = { @@ -56,7 +55,7 @@ pdfviewer.toolbarClick = function (args) { }; ``` -4. Retrieve the PDF viewer instance and save the current PDF as a Blob. Then, read the Blob as an ArrayBuffer and upload the ArrayBuffer to Azure Blob Storage using 'BlockBlobClient'. +4. Retrieve the PDF Viewer instance and save the current PDF as a Blob. Then, read the Blob as an ArrayBuffer and upload the ArrayBuffer to Azure Blob Storage using `BlockBlobClient`. ```typescript function saveDocument() { @@ -76,21 +75,21 @@ function saveDocument() { }; ``` -N> The **npm install @azure/storage-blob** package must be installed in your application to use the previous code example. +N> Install the @azure/storage-blob package in the application to use the previous code example: `npm install @azure/storage-blob` [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-azure-blob-storage/tree/master/Open%20and%20Save%20PDF%20in%20Azure%20Blob%20Storage%20using%20Standalone). -## Using Server-Backed PDF Viewer +## Using server-backed PDF Viewer To save a PDF file to Azure Blob Storage, you can follow the steps below **Step 1:** Create a PDF Viewer sample in JavaScript -Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample in JavaScript. This will set up the basic structure of your PDF Viewer application. +Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample in JavaScript. This sets up the basic structure of the PDF Viewer application. -**Step 2:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 2:** Modify the `PdfViewerController.cs` file in the web service project -1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. +1. Create a web service project in .NET Core 3.0 or later. For instructions, see this [article](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above). 2. Open the `PdfViewerController.cs` file in your web service project. @@ -117,7 +116,7 @@ public PdfViewerController(IConfiguration configuration, ILogger jsonObject) } ``` -6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration +6. Open the `appsettings.json` file in the web service project and add the following lines below the existing `"AllowedHosts"` configuration. ```json { @@ -169,11 +168,11 @@ public IActionResult Download([FromBody] Dictionary jsonObject) } ``` -N> Replace **Your Connection string from Azure** with the actual connection string for your Azure Blob Storage account and **Your container name in Azure** with the actual container name +N> Replace the placeholders with the actual Azure Storage connection string and container name. **Step 2:** Modify the web service project to save the downloaded document to Azure Blob Storage -Create a web service project in .NET Core (version 3.0 and above) by following the steps in this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above). In the controller.cs file of your web service project, add the following code to modify the `Download` method. This code saves the downloaded PDF document to Azure Blob Storage container. +Create a web service project in .NET Core (version 3.0 and above) by following the steps in this [article](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above). In the controller.cs file of the web service project, add the following code to modify the `Download` method. This code saves the downloaded PDF document to Azure Blob Storage container. ```c# @@ -209,9 +208,9 @@ public IActionResult Download([FromBody] Dictionary jsonObject) } ``` -**Step 3:** Set the PDF Viewer Properties in JavaScript PDF viewer component +**Step 3:** Set the PDF Viewer properties in the JavaScript PDF Viewer component -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from Azure Blob Storage. Ensure that you correctly pass the document name from the files available in your azure contanier to the documentPath property. +Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF Viewer component with the accurate URL of the web service, replacing `https://localhost:44396/pdfviewer` with the actual server URL. Set the `documentPath` property to the desired PDF file name to load from Azure Blob Storage, and ensure that the document exists in the target container. ```javascript @@ -229,6 +228,6 @@ viewer.load('PDF_Succinctly.pdf', null); ``` -N> The **Azure.Storage.Blobs** NuGet package must be installed in your application to use the previous code example. +N> Install the Azure.Storage.Blobs NuGet package in the web service application to use the previous code example. [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-azure-blob-storage/tree/master/Open%20and%20Save%20PDF%20in%20Azure%20Blob%20Storage%20using%20Server-Backend). \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-box-cloud-file-storage.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-box-cloud-file-storage.md index 5320f30b2..afdf78937 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-box-cloud-file-storage.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-box-cloud-file-storage.md @@ -1,27 +1,26 @@ --- layout: post -title: Save PDF files to Box cloud file storage in Javascript Pdfviewer control | Syncfusion -description: Learn about how to Save PDF files to Box cloud file storage in Javascript Pdfviewer control of Syncfusion Essential JS 2 and more details. +title: Save PDF files to Box cloud storage in JavaScript PDF Viewer | Syncfusion +description: Learn how to save PDF files to Box cloud storage using the Syncfusion JavaScript PDF Viewer component with a server-backed web service. platform: document-processing -control: Save PDF files to Box cloud file storage -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Save PDF file to Box cloud file storage +# Save PDF files to Box cloud storage -To save a PDF file to Box cloud file storage, you can follow the steps below +To save a PDF file to Box cloud file storage, you can follow the steps below: -**Step 1** Set up a Box developer account and create a Box application +**Step 1:** Set up a Box developer account and create a Box application To access Box storage programmatically, you'll need a developer account with Box. Go to the [Box Developer Console](https://developer.box.com/), sign in or create a new account, and then create a new Box application. This application will provide you with the necessary credentials Client ID and Client Secret to authenticate and access Box APIs. Before accessing files, you need to authenticate your application to access your Box account. Box API supports `OAuth 2.0 authentication` for this purpose. **Step 2:** Create a PDF Viewer sample in JavaScript -Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample in JavaScript. This will set up the basic structure of your PDF Viewer application. +Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample in JavaScript. This sets up the basic structure of the PDF Viewer application. -**Step 3:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 3:** Modify the `PdfViewerController.cs` file in the web service project 1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. @@ -36,7 +35,7 @@ using Box.V2.Config; using Box.V2.Models; ``` -4. Add the following private fields and constructor parameters to the `PdfViewerController` class, In the constructor, assign the values from the configuration to the corresponding fields +4. Add the following private fields and constructor parameters to the `PdfViewerController` class. In the constructor, assign configuration values to the corresponding fields. ```csharp private IConfiguration _configuration; @@ -57,7 +56,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache } ``` -5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF files to Box cloud file storage bucket +5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF file to the Box cloud storage folder. ```csharp [HttpPost("Download")] @@ -96,7 +95,7 @@ public async Task Download([FromBody] Dictionary } ``` -6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration +6. Open the `appsettings.json` file in the web service project and add the following lines below the existing `"AllowedHosts"` configuration. ```json { @@ -114,11 +113,11 @@ public async Task Download([FromBody] Dictionary } ``` -N> replace **Your_Box_Storage_Access_Token** with your actual box access token, and **Your_Folder_ID** with the ID of the folder in your box storage where you want to perform specific operations. Remember to use your valid box API credentials, as **Your_Box_Storage_ClientID** and **Your_Box_Storage_ClientSecret"** are placeholders for your application's API key and secret. +N> Replace the placeholders with the actual Box access token, folder ID, client ID, and client secret. -**Step 4:** Set the PDF Viewer Properties in JavaScript PDF viewer component +**Step 4:** Set the PDF Viewer properties in the JavaScript PDF Viewer component -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from Box cloud file storage. Ensure that you correctly pass the document name from the files available in your box folder to the documentPath property. +Modify the `serviceUrl` property of the PDF Viewer component with the accurate URL of the web service, replacing `https://localhost:44396/pdfviewer` with the actual server URL. Set the `documentPath` property to the desired PDF file name to load from Box cloud storage, and ensure that the document exists in the target folder. ```javascript @@ -136,8 +135,8 @@ viewer.load('PDF_Succinctly.pdf', null); ``` -N> The **Box.V2.Core** NuGet package must be installed in your application to use the previous code example. +N> Install the Box.V2.Core NuGet package in the web service application to use the previous code example. -N> Replace `PDF_Succinctly.pdf` with the actual document name that you want to load from Box cloud file storage. Make sure to pass the document name from the box folder to the [documentPath](https://ej2.syncfusion.com/documentation/api/pdfviewer/#documentpath) property of the PDF viewer component +N> Replace `PDF_Succinctly.pdf` with the actual document name to load from Box cloud storage. Pass the document name from the Box folder to the `documentPath` property of the PDF Viewer component. [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-box-cloud-file-storage) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-dropbox-cloud-file-storage.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-dropbox-cloud-file-storage.md index bbc00c3bc..7e5f9c61c 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-dropbox-cloud-file-storage.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-dropbox-cloud-file-storage.md @@ -1,31 +1,30 @@ --- layout: post -title: Save PDF to Dropbox cloud storage in Javascript Pdfviewer | Syncfusion -description: Learn about how to Save PDF files to Dropbox cloud file storage in Javascript Pdfviewer control of Syncfusion Essential JS 2 and more details. +title: Save PDF files to Dropbox in JavaScript PDF Viewer | Syncfusion +description: Learn how to save PDF files to Dropbox using the Syncfusion JavaScript PDF Viewer component in standalone and server-backed configurations. platform: document-processing -control: Save PDF files to Dropbox cloud file storage -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Save PDF file to Dropbox cloud file storage +# Save PDF files to Dropbox cloud storage -PDF Viewer allows to load PDF file from Drop Box using either the Standalone or Server-backed PDF Viewer. Below are the steps and a sample to demonstrate how to open a PDF from Drop Box. +The JavaScript PDF Viewer component supports saving PDF files to Dropbox using either the standalone or server-backed configuration. The following steps demonstrate both approaches. ## Using Standalone PDF Viewer -To save a PDF file to Dropbox cloud file storage, you can follow the steps below +To save a PDF file to Dropbox, follow these steps: -**Step 1** Create a Dropbox API +**Step 1:** Create a Dropbox API app To create a Dropbox API App, you should follow the official documentation provided by Dropbox [link](https://www.dropbox.com/developers/documentation/dotnet#tutorial). The process involves visiting the Dropbox Developer website and using their App Console to set up your API app. This app will allow you to interact with Dropbox programmatically, enabling secure access to files and data. -**Step 2:** Create a PDF Viewer sample in JavaScript +**Step 2:** Create a Simple PDF Viewer Sample in JavaScript -Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample in JavaScript. This will set up the basic structure of your PDF Viewer application. +Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample in JavaScript. This sets up the basic structure of the PDF Viewer application. -**Step 3:** Modify the `src/app/app.ts` File in the Angular Project +**Step 3:** Modify the `src/app/app.ts` file in the JavaScript project 1. Import the required namespaces at the top of the file: @@ -33,7 +32,7 @@ Follow the instructions provided in this [link](https://help.syncfusion.com/docu import { Dropbox } from 'dropbox'; ``` -2. Configure a custom toolbar item for the download function to save a PDF file in Azure Blob Storage. +2. Configure a custom toolbar item for the download function to save a PDF file to Dropbox. ```typescript let toolItem1: CustomToolbarItemModel = { @@ -52,7 +51,7 @@ pdfviewer.toolbarClick = function (args) { }; ``` -3. Retrieve the PDF viewer instance and save the current PDF as a Blob. Then, read the Blob using a FileReader to convert it into an ArrayBuffer, and upload the ArrayBuffer to Drop Box using the filesUpload method of the Drop Box instance. +3. Retrieve the PDF Viewer instance and save the current PDF as a Blob. Then, read the Blob using a FileReader to convert it into an ArrayBuffer, and upload the ArrayBuffer to Dropbox using the `filesUpload` method. N> Replace **Your Access Token** with the actual Access Token of your Drop Box account. @@ -80,23 +79,23 @@ function saveDocument() { } ``` -N> The **npm install dropbox** package must be installed in your application to use the previous code example. +N> Install the dropbox package in the application to use the previous code example: `npm install dropbox` [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-dropbox-cloud-file-storage/tree/master/Open%20and%20Save%20PDF%20in%20Drop%20Box%20using%20Standalone) -## Using Server-Backed PDF Viewer +## Using server-backed PDF Viewer -To save a PDF file to Dropbox cloud file storage, you can follow the steps below +To save a PDF file to Dropbox cloud file storage, you can follow the steps below: -**Step 1** Create a Dropbox API +**Step 1:** Create a Dropbox API app To create a Dropbox API App, you should follow the official documentation provided by Dropbox [link](https://www.dropbox.com/developers/documentation/dotnet#tutorial). The process involves visiting the Dropbox Developer website and using their App Console to set up your API app. This app will allow you to interact with Dropbox programmatically, enabling secure access to files and data. **Step 2:** Create a PDF Viewer sample in JavaScript -Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample in JavaScript. This will set up the basic structure of your PDF Viewer application. +Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample in JavaScript. This sets up the basic structure of the PDF Viewer application. -**Step 3:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 3:** Modify the `PdfViewerController.cs` file in the web service project 1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. @@ -110,7 +109,7 @@ using Dropbox.Api; using Dropbox.Api.Files; ``` -4. Add the following private fields and constructor parameters to the `PdfViewerController` class, In the constructor, assign the values from the configuration to the corresponding fields +4. Add the following private fields and constructor parameters to the `PdfViewerController` class. In the constructor, assign configuration values to the corresponding fields. ```csharp private IConfiguration _configuration; @@ -127,7 +126,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache } ``` -5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF files to Dropbox cloud file storage bucket +5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF file to the Dropbox folder. ```csharp @@ -164,7 +163,7 @@ public async Task Download([FromBody] Dictionary } ``` -6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration +6. Open the `appsettings.json` file in the web service project and add the following lines below the existing `"AllowedHosts"` configuration. ```json { @@ -180,11 +179,11 @@ public async Task Download([FromBody] Dictionary } ``` -N> Replace **Your_Dropbox_Access_Token** with your actual Dropbox access token and **Your_Folder_Name** with your folder name. +N> Replace the placeholders with the actual Dropbox access token and target folder name. -**Step 4:** Set the PDF Viewer Properties in JavaScript PDF viewer component +**Step 4:** Set the PDF Viewer properties in the JavaScript PDF Viewer component -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from Dropbox cloud file storage. Ensure that you correctly pass the document name from the files available in your dropbox folder to the documentPath property. +Modify the `serviceUrl` property of the PDF Viewer component with the accurate URL of the web service, replacing `https://localhost:44396/pdfviewer` with the actual server URL. Set the `documentPath` property to the desired PDF file name to load from Dropbox, and ensure that the document exists in the target folder. ```javascript @@ -202,6 +201,6 @@ viewer.load('PDF_Succinctly.pdf', null); ``` -N> The **Dropbox.Api** NuGet package must be installed in your application to use the previous code example. +N> Install the Dropbox.Api NuGet package in the web service application to use the previous code example. [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-dropbox-cloud-file-storage/tree/master/Open%20and%20Save%20PDF%20in%20Drop%20Box%20using%20Server-Backed) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-google-cloud-storage.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-google-cloud-storage.md index 91655cdf4..0c1d49a2b 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-google-cloud-storage.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-google-cloud-storage.md @@ -1,21 +1,20 @@ --- layout: post -title: Save PDF files to Google Cloud Storage in Javascript Pdfviewer control | Syncfusion -description: Learn about how to Save PDF files to Google Cloud Storage in Javascript Pdfviewer control of Syncfusion Essential JS 2 and more details. +title: Save PDF files to Google Cloud Storage in JavaScript PDF Viewer | Syncfusion +description: Learn how to save PDF files to Google Cloud Storage using the Syncfusion JavaScript PDF Viewer component with a server-backed web service. platform: document-processing -control: Save PDF files to Google Cloud Storage -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Save PDF file to Google Cloud Storage +# Save PDF files to Google Cloud Storage -To save a PDF file to Google Cloud Storage, you can follow the steps below +To save a PDF file to Google Cloud Storage, you can follow the steps below: **Step 1:** Create a PDF Viewer sample in JavaScript -Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample in JavaScript. This will set up the basic structure of your PDF Viewer application. +Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample in JavaScript. This sets up the basic structure of the PDF Viewer application. **Step 2:** Modify the `PdfViewerController.cs` File in the Web Service Project @@ -31,7 +30,7 @@ using Google.Cloud.Storage.V1; using Google.Apis.Auth.OAuth2; ``` -4. Add the following private fields and constructor parameters to the `PdfViewerController` class, In the constructor, assign the values from the configuration to the corresponding fields +4. Add the following private fields and constructor parameters to the `PdfViewerController` class. In the constructor, assign configuration values to the corresponding fields. ```csharp // Private readonly object _storageClient @@ -61,7 +60,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache } ``` -5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF files to Google Cloud Storage bucket +5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF file to the Google Cloud Storage bucket. ```csharp [HttpPost("Download")] @@ -89,7 +88,7 @@ public IActionResult Download([FromBody] Dictionary jsonObject) } ``` -6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration +6. Open the `appsettings.json` file in the web service project and add the following lines below the existing `"AllowedHosts"` configuration. ```json { @@ -104,13 +103,13 @@ public IActionResult Download([FromBody] Dictionary jsonObject) } ``` -N> Replace **Your Bucket name from Google Cloud Storage** with the actual name of your Google Cloud Storage bucket +N> Replace the placeholder with the actual Google Cloud Storage bucket name. -N> Replace **path/to/service-account-key.json** with the actual file path to your service account key JSON file. Make sure to provide the correct path and filename. +N> Replace `path/to/service-account-key.json` with the actual file path to the service account key JSON file. -**Step 3:** Set the PDF Viewer Properties in JavaScript PDF viewer component +**Step 3:** Set the PDF Viewer properties in the JavaScript PDF Viewer component -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from Google Cloud Storage. Ensure that you correctly pass the document name from the files available in your bucket to the documentPath property. +Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF Viewer component with the accurate URL of the web service, replacing `https://localhost:44396/pdfviewer` with the actual server URL. Set the `documentPath` property to the desired PDF file name to load from Google Cloud Storage, and ensure that the document exists in the target bucket. ```javascript @@ -128,6 +127,6 @@ viewer.load('PDF_Succinctly.pdf', null); ``` -N> The **Google.Cloud.Storage.V1** NuGet package must be installed in your application to use the previous code example. +N> Install the Google.Cloud.Storage.V1 NuGet package in the web service application to use the previous code example. -[View sample in GitHub]()[View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-google-cloud-storage) \ No newline at end of file +[View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-google-cloud-storage) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-google-drive.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-google-drive.md index 02ceb176a..8f0f2dd0f 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-google-drive.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-google-drive.md @@ -1,27 +1,26 @@ --- layout: post -title: Save PDF files to Google Drive in Javascript Pdfviewer control | Syncfusion -description: Learn about how to Save PDF files to Google Drive in Javascript Pdfviewer control of Syncfusion Essential JS 2 and more details. +title: Save PDF files to Google Drive in JavaScript PDF Viewer | Syncfusion +description: Learn how to save PDF files to Google Drive using the Syncfusion JavaScript PDF Viewer component with a server-backed web service. platform: document-processing -control: Save PDF files to Google Drive -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Save PDF file to Google Drive +# Save PDF files to Google Drive -To save a PDF file to Google Drive, you can follow the steps below +To save a PDF file to Google Drive, you can follow the steps below: -**Step 1** Set up Google Drive API +**Step 1:** Set up the Google Drive API You must set up a project in the Google Developers Console and enable the Google Drive API. Obtain the necessary credentials to access the API. For more information, view the official [link](https://developers.google.com/drive/api/guides/enable-sdk). **Step 2:** Create a PDF Viewer sample in JavaScript -Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample in JavaScript. This will set up the basic structure of your PDF Viewer application. +Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample in JavaScript. This sets up the basic structure of the PDF Viewer application. -**Step 3:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 3:** Modify the `PdfViewerController.cs` file in the web service project 1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. @@ -35,7 +34,7 @@ using Google.Apis.Drive.v3; using Google.Apis.Util.Store; ``` -4. Add the following private fields and constructor parameters to the `PdfViewerController` class, In the constructor, assign the values from the configuration to the corresponding fields +4. Add the following private fields and constructor parameters to the `PdfViewerController` class. In the constructor, assign configuration values to the corresponding fields. ```csharp private IConfiguration _configuration; @@ -55,7 +54,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache } ``` -5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF files to Google Drive bucket +5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF file to the Google Drive folder. ```csharp [HttpPost("Download")] @@ -114,7 +113,7 @@ public async Task Download([FromBody] Dictionary } ``` -6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration +6. Open the `appsettings.json` file in the web service project and add the following lines below the existing `"AllowedHosts"` configuration. ```json { @@ -131,15 +130,15 @@ public async Task Download([FromBody] Dictionary } ``` -N> Replace **Your Google Drive Folder ID**, **Your Application name**, and **Your Path to the OAuth 2.0 Client IDs json file** with your actual Google drive folder ID , Your name for your application and the path for the JSON file. +N> Replace the placeholders with the actual Google Drive folder ID, application name, and the path to the OAuth 2.0 Client IDs JSON file. -N> The **FolderId** part is the unique identifier for the folder. For example, if your folder URL is: `https://drive.google.com/drive/folders/abc123xyz456`, then the folder ID is `abc123xyz456`. +N> The folder ID is the unique identifier in the folder URL. For example, in `https://drive.google.com/drive/folders/abc123xyz456`, the ID is `abc123xyz456`. -N> You must use a unique `Client_ID` from json file to interface your application with the Google Drive API in order to save PDFs directly to Google Drive. This Client_ID will serve as the authentication key, allowing you to save files securely. +N> Use a valid `client_id` from the JSON file to authenticate with the Google Drive API and save files securely. -**Step 4:** Set the PDF Viewer Properties in JavaScript PDF viewer component +**Step 4:** Set the PDF Viewer properties in the JavaScript PDF Viewer component -Modify the `serviceUrl` property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from Google Drive. Ensure that you correctly pass the document name from the files available in your drive folder to the documentPath property. +Modify the `serviceUrl` property of the PDF Viewer component with the accurate URL of the web service, replacing `https://localhost:44396/pdfviewer` with the actual server URL. Set the `documentPath` property to the desired PDF file name to load from Google Drive, and ensure that the document exists in the target folder. ```javascript @@ -157,6 +156,6 @@ viewer.load('PDF_Succinctly.pdf', null); ``` -N> The **Google.Apis.Drive.v3** NuGet package must be installed in your application to use the previous code example. +N> Install the Google.Apis.Drive.v3 NuGet package in the web service application to use the previous code example. [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-google-drive). \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-one-drive.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-one-drive.md index 5f84db665..585c24dea 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-one-drive.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-file/to-one-drive.md @@ -1,27 +1,26 @@ --- layout: post -title: Save PDF files to One Drive in Javascript Pdfviewer control | Syncfusion -description: Learn about how to Save PDF files to One Drive in Javascript Pdfviewer control of Syncfusion Essential JS 2 and more details. +title: Save PDF files to OneDrive in JavaScript PDF Viewer | Syncfusion +description: Learn how to save PDF files to OneDrive using the Syncfusion JavaScript PDF Viewer component with a server-backed web service. platform: document-processing -control: Save PDF files to One Drive -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Save PDF file to One Drive +# Save PDF files to OneDrive -To save a PDF file to One Drive, you can follow the steps below +To save a PDF file to One Drive, you can follow the steps below: -**Step 1** Create the Microsoft graph API. +**Step 1:** Create a Microsoft Graph API application Need to create a Microsoft Graph API application and obtain the necessary credentials, namely the application ID and tenant ID. Follow the steps provided in the [link](https://learn.microsoft.com/en-us/training/modules/msgraph-access-file-data/3-exercise-access-files-onedrive) to create the application and obtain the required IDs. **Step 2:** Create a PDF Viewer sample in JavaScript -Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample in JavaScript. This will set up the basic structure of your PDF Viewer application. +Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF Viewer sample in JavaScript. This sets up the basic structure of the PDF Viewer application. -**Step 3:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 3:** Modify the `PdfViewerController.cs` file in the web service project 1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. @@ -36,7 +35,7 @@ using Microsoft.Identity.Client; using Helpers; ``` -4. Add the following private fields and constructor parameters to the `PdfViewerController` class, In the constructor, assign the values from the configuration to the corresponding fields +4. Add the following private fields and constructor parameters to the `PdfViewerController` class. In the constructor, assign configuration values to the corresponding fields. ```csharp private IConfiguration _configuration; @@ -55,7 +54,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache } ``` -5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF files to One Drive bucket +5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF file to the OneDrive folder. ```csharp [HttpPost("Download")] @@ -102,7 +101,7 @@ public async Task Download([FromBody] Dictionary } ``` -6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration +6. Open the `appsettings.json` file in the web service project and add the following lines below the existing `"AllowedHosts"` configuration. ```json { @@ -120,11 +119,11 @@ public async Task Download([FromBody] Dictionary ``` -N> Replace **Your_Tenent_ID**, **Your_Application_ID**, and **Your_Folder_Name_To_Access_The_Files_In_Onedrive** with your actual tenant ID, application ID, and folder name. +N> Replace the placeholders with the actual tenant ID, application ID, and OneDrive folder name. -**Step 4:** Set the PDF Viewer Properties in JavaScript PDF viewer component +**Step 4:** Set the PDF Viewer properties in the JavaScript PDF Viewer component -Modify the `serviceUrl` property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from One Drive. Ensure that you correctly pass the document name from the files available in your drive folder to the documentPath property. +Modify the `serviceUrl` property of the PDF Viewer component with the accurate URL of the web service, replacing `https://localhost:44396/pdfviewer` with the actual server URL. Set the `documentPath` property to the desired PDF file name to load from OneDrive, and ensure that the document exists in the target folder. ```javascript @@ -142,13 +141,11 @@ viewer.load('PDF_Succinctly.pdf', null); ``` -N> The following NuGet packages are required to use the previous code example -* **Microsoft.Identity.Client** -* **Microsoft.Graph** -* **Microsoft.Extensions.Configuration** -* **Microsoft.Extensions.Configuration.FileExtensions** -* **Microsoft.Extensions.Configuration.Json** - -You can install these packages using the NuGet Package Manager in Visual Studio or Visual Studio Code. +N> Install the following NuGet packages in the web service application: +- Microsoft.Identity.Client +- Microsoft.Graph +- Microsoft.Extensions.Configuration +- Microsoft.Extensions.Configuration.FileExtensions +- Microsoft.Extensions.Configuration.Json [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-one-drive) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-files.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-files.md index 87a0f97d6..dfeb95441 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-files.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/save-pdf-files.md @@ -1,33 +1,30 @@ --- layout: post -title: Saving PDF files Javascript Pdfviewer control | Syncfusion -description: This page helps you to learn here all about saving PDF files in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Save PDF files in JavaScript PDF Viewer | Syncfusion +description: Learn how to save updated documents from the Syncfusion JavaScript PDF Viewer component to a server, database, or local file system. platform: document-processing control: Saving PDF files -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Saving PDF file +# Saving PDF files -After editing the PDF file with various annotation tools, you will need to save the updated PDF to the server, database, or local file system. +After annotating or editing a document, use the JavaScript PDF Viewer component to persist the updated PDF to a server, local storage, or a database. -## Save PDF file to Server +## Save a PDF file to a server -Need to save the modified PDF back to a server. To achieve this, proceed with the following steps +Follow these steps to upload the modified document to a server-side location. -**Step 1:** Create a Simple PDF Viewer Sample in JavaScript +**Step 1:** Create a JavaScript PDF Viewer sample -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF viewer sample in JavaScript. This will give you a basic setup of the PDF viewer component. +Follow the [getting started guide](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to configure a JavaScript PDF Viewer project. This provides the viewer instance required to submit downloads to a web service. -**Step 2:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 2:** Modify the `PdfViewerController.cs` file in the web service project -1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. - -2. Open the `PdfViewerController.cs` file in your web service project. - -3. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to open it in the viewer using URL +1. Create a web service in .NET Core 3.0 or later. Refer to [How to create PDF Viewer web service in .NET Core 3.0 and above](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for detailed instructions. +2. Open the `PdfViewerController.cs` file in the service project. +3. Update the [`Download`](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) action to save the output file on the server. ```csharp public IActionResult Download([FromBody] Dictionary jsonObject) @@ -56,9 +53,11 @@ public IActionResult Download([FromBody] Dictionary jsonObject) } ``` -**Step 3:** Set the PDF Viewer Properties in React PDF viewer component +N> Ensure the application pool identity or service account has write access to the destination directory before saving files. + +**Step 3:** Set PDF Viewer service properties -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server.Modify the documentPath with the correct PDF Document URL want to load. +Specify the [`serviceUrl`](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) of your web service and the document to load. ```javascript @@ -76,11 +75,13 @@ viewer.appendTo('#pdfViewer'); ``` +N> Replace the placeholder service URL and document name with your deployment values. Configure CORS on the web service if the viewer runs on a different origin. + [View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/Save%20and%20Load/Save%20PDF%20file%20to%20server) -## Download PDF file as a copy +## Download a PDF file as a copy -In the built-in toolbar, you have an option to download the updated PDF to the local file system, you can use it to download the PDF file. +The built-in toolbar includes a **Download** button that saves the current PDF to the local file system. You can also trigger the same behavior from custom UI by calling [`download`](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download). ```html @@ -96,28 +97,28 @@ document.getElementById('download').addEventListener('click', function () { ``` -## Save PDF file to Database - -If you have plenty of PDF files stored in database and you want to save the updated PDF file back to the database, use the following code example. +N> The `download` method returns the document after applying annotations, form edits, and other runtime changes. -**Step 1:** Create a Simple PDF Viewer Sample in JavaScript +## Save a PDF file to a database -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to create a simple PDF viewer sample in JavaScript. This will give you a basic setup of the PDF viewer component. +Use the following steps to persist the generated PDF document to a SQL Server database. -**Step 2:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 1:** Create a JavaScript PDF Viewer sample -1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. +Follow the [getting started guide](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) to configure a JavaScript PDF Viewer project. -2. Open the `PdfViewerController.cs` file in your web service project. +**Step 2:** Modify the `PdfViewerController.cs` file in the web service project -3. Import the required namespaces at the top of the file: +1. Create a web service in .NET Core 3.0 or later. +2. Open the `PdfViewerController.cs` file. +3. Import the required namespaces at the top of the file. ```csharp using System.IO; using System.Data.SqlClient; ``` -4. Add the following private fields and constructor parameters to the `PdfViewerController` class, In the constructor, assign the values from the configuration to the corresponding fields +4. Add the following private fields and constructor parameters to the `PdfViewerController` class, and map configuration values in the constructor. ```csharp private IConfiguration _configuration; @@ -132,7 +133,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache } ``` -5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to open it in the viewer using URL +5. Update the [`Download`](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) action to insert the document into a database table. ```csharp @@ -172,7 +173,7 @@ public async Task Download([FromBody] Dictionary } ``` -6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration +6. Update the `appsettings.json` file to include the connection string setting. ```json { @@ -187,8 +188,8 @@ public async Task Download([FromBody] Dictionary } ``` -N> Replace **Your Connection string from SQL server** with the actual connection string for your SQL Server database +N> Replace **Your connection string for SQL server** with the actual value. Make sure the database table, columns, and permissions exist before inserting records. -N> The **System.Data.SqlClient** package must be installed in your application to use the previous code example. You need to modify the connectionString variable in the previous code example as per the connection string of your database. +N> Install the **System.Data.SqlClient** package in the application to execute SQL commands with the previous example. Update the connection string to match your environment. [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-database) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/server-deployment/how-to-deploy-docker-image-in-azure-app-service-for-container.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/server-deployment/how-to-deploy-docker-image-in-azure-app-service-for-container.md index 34afde86c..df0cf4103 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/server-deployment/how-to-deploy-docker-image-in-azure-app-service-for-container.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/server-deployment/how-to-deploy-docker-image-in-azure-app-service-for-container.md @@ -1,58 +1,48 @@ --- layout: post -title: How to deploy docker image in azure app service for container in Javascript Pdfviewer control | Syncfusion -description: Learn here all about How to deploy docker image in azure app service for container in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Deploy Docker image to Azure App Service for Containers in JavaScript PDF Viewer | Syncfusion +description: Step-by-step guide to deploy the Syncfusion PDF Viewer server Docker image to Azure App Service for Containers and connect it to a JavaScript client. platform: document-processing -control: How to deploy docker image in azure app service for container -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# How to deploy docker image in azure app service for container in Javascript Pdfviewer control +# Deploy Docker image to Azure App Service for Containers ## Prerequisites -* Have [`Azure account`](https://azure.microsoft.com/en-gb/) and [`Azure CLI`](https://docs.microsoft.com/en-us/cli/azure/?view=azure-cli-latest) setup in your environment. +- [Azure account](https://azure.microsoft.com/) and [Azure CLI](https://docs.microsoft.com/cli/azure/?view=azure-cli-latest) installed. +- Sign in to [Azure](https://azure.microsoft.com/) -* Run the following command to open the Azure login page. Sign into your [`Microsoft Azure account`](https://azure.microsoft.com/en-gb/). - -``` +```console az login ``` **Step 1:** Create a resource group. -Create a resource group using the [`az group create`](https://docs.microsoft.com/en-us/cli/azure/group#az-group-create) command. - -The following example creates a resource group named pdfviewerresourcegroup in the eastus location. - -``` +```console az group create --name pdfviewerresourcegroup --location "East US" ``` **Step 2:** Create an Azure App Service plan. -Create an App Service plan in the resource group with the [`az appservice plan create`](https://docs.microsoft.com/en-us/cli/azure/appservice/plan?view=azure-cli-latest#az-appservice-plan-create) command. - -The following example creates an App Service plan named pdfviewerappservice in the Standard pricing tier (--sku S1) and in a Linux container (--is-linux). - -``` +```console az appservice plan create --name pdfviewerappservice --resource-group pdfviewerresourcegroup --sku S1 --is-linux ``` **Step 3:** Create a Docker Compose app. -Create a multi-container [`web app`](https://docs.microsoft.com/en-us/azure/app-service/containers/app-service-linux-intro) in the pdfviewerappservice App Service plan with the [`az webapp create`](https://docs.microsoft.com/en-us/cli/azure/webapp?view=azure-cli-latest#az-webapp-create) command. The following command creates the web app using the provided Docker compose file. Please look into the section for getting started with Docker compose to create the Docker compose file for the PDF Viewer server and use the created Docker compose file here. +Create a multi-container web app in the plan using your docker-compose file (ensure it references syncfusion/pdfviewer-server:latest and sets SYNCFUSION_LICENSE_KEY). -``` -az webapp create --resource-group pdfviewerappservice --plan pdfviewerappservice --name pdfviewer-server --multicontainer-config-type compose --multicontainer-config-file pdfviewer-server-compose.yml +```console +az webapp create --resource-group pdfviewerresourcegroup --plan pdfviewerappservice --name pdfviewer-server --multicontainer-config-type compose --multicontainer-config-file pdfviewer-server-compose.yml ``` **Step 4:** Browse to the app. -Browse to the deployed app at `http://.azurewebsites.net`,. i.e. `http://pdfviewerappservice.azurewebsites.net`. Open this link in a browser and navigate to the PDF Viewer Web API control `http://pdfviewerappservice.azurewebsites.net/api/pdfviewer`. It returns the default get method response. +Open the app at http://.azurewebsites.net (for example, http://pdfviewerappservice.azurewebsites.net). Verify the API at http://pdfviewerappservice.azurewebsites.net/api/pdfviewer to confirm a default GET response. -Append the app service running the URL `http://pdfviewerappservice.azurewebsites.net/api/pdfviewer` to the service URL in the client-side PDF Viewer control. For more information about how to get started with the PDF Viewer control, refer to this [`getting started page`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/?). +Append the service endpoint (for example, http://pdfviewerappservice.azurewebsites.net/api/pdfviewer) to the PDF Viewer client’s serviceUrl. Refer this [Getting started guide](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) -For more information about the app container service, please look deeper into the [`Microsoft Azure Container Service`](https://docs.microsoft.com/en-us/azure/app-service/containers/quickstart-multi-container) for a production-ready setup. \ No newline at end of file +For production guidance, see [Microsoft Azure App Service for containers](https://docs.microsoft.com/azure/app-service/containers/quickstart-multi-container) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/server-deployment/how-to-deploy-docker-image-in-azure-kubernetes-service.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/server-deployment/how-to-deploy-docker-image-in-azure-kubernetes-service.md index 1ea772e75..a179acfeb 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/server-deployment/how-to-deploy-docker-image-in-azure-kubernetes-service.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/server-deployment/how-to-deploy-docker-image-in-azure-kubernetes-service.md @@ -1,61 +1,48 @@ --- layout: post -title: How to deploy docker image in azure kubernetes service in Javascript Pdfviewer control | Syncfusion -description: Learn here all about How to deploy docker image in azure kubernetes service in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Deploy Docker image to Azure Kubernetes Service (AKS) in JavaScript PDF Viewer | Syncfusion +description: Deploy the Syncfusion PDF Viewer server Docker image to Azure Kubernetes Service (AKS), expose it with a LoadBalancer, and connect it to a JavaScript client. platform: document-processing -control: How to deploy docker image in azure kubernetes service -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# How to deploy docker image in azure kubernetes service in Javascript Pdfviewer control +# Deploy Docker image to Azure Kubernetes Service (AKS) ## Prerequisites -* Have [`Azure account`](https://azure.microsoft.com/en-gb/) and [`Azure CLI`](https://docs.microsoft.com/en-us/cli/azure/?view=azure-cli-latest) setup in your environment. +- [Azure account](https://azure.microsoft.com/) and [Azure CLI](https://docs.microsoft.com/cli/azure/?view=azure-cli-latest) installed. +- Sign in to [Azure](https://azure.microsoft.com/) -* Run the following command to open the Azure login page. Sign into your [`Microsoft Azure account`](https://azure.microsoft.com/en-gb/). - -``` +```console az login ``` **Step 1:** Create a resource group. -Create a resource group using the [`az group create`](https://docs.microsoft.com/en-us/cli/azure/group#az-group-create) command. - -The following example creates a resource group named pdfviewerresourcegroup in the eastus location. - -``` +```console az group create --name pdfviewerresourcegroup --location "East US" ``` -**Step 2:** Create AKS cluster. - -Use the [`az aks create`](https://docs.microsoft.com/en-us/cli/azure/aks?view=azure-cli-latest#az-aks-create) command to create an AKS cluster. The following example creates a cluster named pdfviewercluster with one node. +**Step 2:** Create an AKS cluster. -``` +```console az aks create --resource-group pdfviewerresourcegroup --name pdfviewercluster --node-count 1 ``` **Step 3:** Connect to the cluster. -Install the [`kubectl`](https://kubernetes.io/docs/reference/kubectl/kubectl/) into the workspace using the following command. +Install [kubectl](https://kubernetes.io/docs/reference/kubectl/kubectl/) and configure access. -``` +```console az aks install-cli -``` - -To configure kubectl to connect to your Kubernetes cluster, use the [`az aks get-credentials`](https://docs.microsoft.com/en-us/cli/azure/aks?view=azure-cli-latest#az-aks-get-credentials) command. This command downloads credentials and configures the Kubernetes CLI to use them. - -``` az aks get-credentials --resource-group pdfviewerresourcegroup --name pdfviewercluster ``` **Step 4:** Create services and deployments. -[`Kubernetes Services`](https://kubernetes.io/docs/concepts/services-networking/service/) and [`Deployments`](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) can be configured in a file. To run the PDF Viewer server, you have to define a Service and a Deployment pdfviewerserver. To do this, create the pdfviewer-server.yaml file in the current directory using the following code. +Create a pdfviewer-server.yaml file with a [Deployment](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) and a [Service](https://kubernetes.io/docs/concepts/services-networking/service/). ```yaml apiVersion: apps/v1 @@ -99,20 +86,15 @@ spec: type: LoadBalancer ``` -**Step 5:** To create all Services and Deployments needed to run the PDF Viewer server, execute the following. +**Step 5:** Apply the configuration and get the external IP. ```console kubectl create -f ./pdfviewer-server.yaml -``` - -Run the following command to get the Kubernetes cluster deployed with service details and copy the external IP address of the PDF Viewer service. - -```console kubectl get all ``` -Browse the copied external IP address and navigate to the PDF Viewer Web API control `http:///api/pdfviewer`. It returns the default get method response. +Browse to http:///api/pdfviewer to verify the default GET response. -**Step 6:** Append the Kubernetes service running the URL `http:///api/pdfviewer` to the service URL in the client-side PDF Viewer control. For more information about how to get started with the PDF Viewer control, refer to this [`getting started page`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/?). +**Step 6:** Use the service endpoint (for example, http:///api/pdfviewer) as the client’s serviceUrl. Getting started guide: https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/ -For more details about the Azure Kubernetes service, please look deeper into [`Microsoft Azure Kubernetes Service`](https://docs.microsoft.com/en-us/azure/aks/kubernetes-walkthrough) for a production-ready setup. \ No newline at end of file +For production guidance, see Azure Kubernetes Service [documentation](https://docs.microsoft.com/azure/aks/kubernetes-walkthrough). \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/server-deployment/how-to-deploy-pdfviewer-server-app-in-azure-app-service-from-visual-studio.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/server-deployment/how-to-deploy-pdfviewer-server-app-in-azure-app-service-from-visual-studio.md index 6374bc35e..9025bf2b6 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/server-deployment/how-to-deploy-pdfviewer-server-app-in-azure-app-service-from-visual-studio.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/server-deployment/how-to-deploy-pdfviewer-server-app-in-azure-app-service-from-visual-studio.md @@ -1,43 +1,42 @@ --- layout: post -title: How to deploy pdfviewer server app in azure app service from visual studio in Javascript Pdfviewer control | Syncfusion -description: Learn here all about How to deploy pdfviewer server app in azure app service from visual studio in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Deploy PDF Viewer server app to Azure App Service from Visual Studio in JavaScript PDF Viewer | Syncfusion +description: Publish the Syncfusion PDF Viewer Web API application from Visual Studio to Azure App Service and connect it to a JavaScript client. platform: document-processing -control: How to deploy pdfviewer server app in azure app service from visual studio -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# How to deploy pdfviewer server app in azure app service from visual studio in Javascript Pdfviewer control +# Deploy PDF Viewer server app to Azure App Service from Visual Studio ## Prerequisites -* Visual Studio 2017 or Visual Studio 2019. -* An [`Azure subscription`](https://azure.microsoft.com/en-gb/). -* Create the [`PDF Viewer Web API application`](https://www.syncfusion.com/kb/10346/how-to-create-pdf-viewer-web-service-application-in-asp-net-core). -* Make sure you’ve built the project using the Build > Build Solution menu command before following the deployment steps. +- Visual Studio 2017 or 2019 +- [Azure subscription](https://azure.microsoft.com/) +- A [PDF Viewer Web API application](https://www.syncfusion.com/kb/10346/how-to-create-pdf-viewer-web-service-application-in-asp-net-core) +- Build the project (Build > Build Solution) before publishing ## Publish to Azure App Service -**Step 1:** In Solution Explorer, right-click the project and choose Publish (or use the Build > Publish menu item). +**Step 1:** In Solution Explorer, right-click the project and choose Publish (or use Build > Publish). - ![azure publish ](../images/azure_publish.png) +![azure publish](../images/azure_publish.png) -**Step 2:** If you have previously configured any publishing profiles, the Publish pane appears, in which case, select Create new profile. +**Step 2:** If a profile exists, select Create new profile. -**Step 3:** In the Pick a publish target dialog box, choose App Service. +**Step 3:** In Pick a publish target, choose App Service. ![azure target](../images/azure_target.png) -**Step 4:** Select Publish. The Create App Service dialog box appears. Sign in with your Azure account, if necessary, then the default app service settings populate the fields. +**Step 4:** Select Publish. In Create App Service, sign in if prompted and review the default settings. -![azure pdfviewer ](../images/azure_pdfviewer.png) +![azure pdfviewer](../images/azure_pdfviewer.png) -**Step 5:** Select Create. Visual Studio deploys the app to your Azure App Service, and the web app loads in your browser at `http://.azurewebsites.net`. (i.e. `http:// ej2-pdfviewer-server20200513053326.azurewebsites.net`). +**Step 5:** Select Create. After deployment, the app loads at http://.azurewebsites.net (for example, http://ej2-pdfviewer-server20200513053326.azurewebsites.net). -**Step 6:** Navigate to the PDF Viewer Web API control `http://ej2-pdfviewer-server20200513053326.azurewebsites.net/api/pdfviewer`. It returns the default get method response. +**Step 6:** Verify the API at http://ej2-pdfviewer-server20200513053326.azurewebsites.net/api/pdfviewer. A default GET response indicates the server is running. -Append the app service running the URL `http://ej2-pdfviewer-server20200513053326.azurewebsites.net./api/pdfviewer` to the service URL in the client-side PDF Viewer control. For more information about how to get started with the PDF Viewer control, refer to this [`getting started page`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/?). +Use the service endpoint (for example, http://ej2-pdfviewer-server20200513053326.azurewebsites.net/api/pdfviewer) as the PDF Viewer client’s serviceUrl. Refer to the [getting started guide](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/) -For more information about the app container service, please look deeper into the [`Microsoft Azure App Service`](https://docs.microsoft.com/en-us/visualstudio/deployment/) for a production-ready setup. \ No newline at end of file +For production guidance, see Azure App Service deployment [documentation](https://docs.microsoft.com/visualstudio/deployment/). \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/server-deployment/pdfviewer-server-docker-image-overview.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/server-deployment/pdfviewer-server-docker-image-overview.md index d0d05cb1c..321984dc6 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/server-deployment/pdfviewer-server-docker-image-overview.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/server-deployment/pdfviewer-server-docker-image-overview.md @@ -1,30 +1,28 @@ --- layout: post -title: PDF Viewer Server Docker Image in Javascript | Syncfusion -description: Learn here all about Pdfviewer server docker image overview in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: PDF Viewer server Docker image overview in JavaScript | Syncfusion +description: Learn how to run and connect to the Syncfusion PDF Viewer server Docker image, set the license key, and configure Redis cache in a JavaScript application. platform: document-processing -control: Pdfviewer server docker image overview -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Pdfviewer server docker image overview in Javascript Pdfviewer control +# PDF Viewer server Docker image overview -The Syncfusion PDF Viewer control allows you to view, print, form-fill, and annotate PDF files in your web applications. This PDF Viewer control requires a server-side backend Web API service to render PDF contents. +The Syncfusion PDF Viewer component enables viewing, printing, form filling, and annotating PDF files in web applications. The client component requires a server-side Web API to process and render PDF content. -This Docker image is the predefined Docker container of Syncfusion’s PDF Viewer backend. You can deploy it quickly to your infrastructure. +This Docker image provides a preconfigured container for the PDF Viewer server backend and can be deployed quickly in most environments. -PDF Viewer is a commercial product, and it requires a valid license to use it in a production environment [`(request license or trial key).`](https://help.syncfusion.com/common/essential-studio/licensing/licensing-faq/where-can-i-get-a-license-key) +PDF Viewer is a commercial product and requires a valid license in production environments. [Request a license or trial key](https://help.syncfusion.com/common/essential-studio/licensing/licensing-faq/where-can-i-get-a-license-key) from the Syncfusion licensing portal -PDF Viewer control is supported in the JavaScript, Angular, React, Vue, ASP.NET Core, ASP.NET MVC, and Blazor platforms. +PDF Viewer is available for JavaScript, Angular, React, Vue, ASP.NET Core, ASP.NET MVC, and Blazor. ## Prerequisites -Have [`Docker`](https://www.docker.com/products/container-runtime/#/download) installed in your environment: +Install Docker in the target environment: -* On Windows, install [`Docker for Windows`](https://hub.docker.com/editions/community/docker-ce-desktop-windows). - -* On macOS, install [`Docker for Mac`](https://hub.docker.com/editions/community/docker-ce-desktop-windows). +- On Windows, install [Docker Desktop for Windows](https://hub.docker.com/editions/community/docker-ce-desktop-windows) +- On macOS, install [Docker Desktop for Mac](https://hub.docker.com/editions/community/docker-ce-desktop-mac) ## How to use this PDF Viewer Docker image @@ -34,7 +32,7 @@ Have [`Docker`](https://www.docker.com/products/container-runtime/#/download) in docker pull syncfusion/pdfviewer-server ``` -**Step 2:** Create the docker-compose.yml file with the following code in your file system. +**Step 2:** Create a docker-compose.yml file in the desired folder. ```yaml version: '3.4' @@ -49,21 +47,21 @@ services: - "6001:80" ``` -**Step 3:** In a terminal tab, navigate to the directory where you’ve placed the docker-compose.yml file and execute the following. +**Step 3:** In a terminal, navigate to the folder containing docker-compose.yml and run: ```console docker-compose up ``` -Also, you can run the Docker container along with the license key using this docker run command. +Alternatively, run the container directly with the license key: ```console docker run -d -p 6001:80 –e SYNCFUSION_LICENSE_KEY= YOUR_LICENSE_KEY syncfusion/pdfviewer-server:latest ``` -Now the PDF Viewer server Docker instance runs in the localhost with the provided port number `http://localhost:6001`. Open this link in the browser and navigate to the PDF Viewer Web API control `http://localhost:6001/api/pdfviewer`. It returns the default get method response. +When the container starts, the server is available at http://localhost:6001. Open the API endpoint at http://localhost:6001/api/pdfviewer to verify the default GET response. -**Step 4:** Append the Docker instance running the URL `(http://localhost:6001/api/pdfviewer)` to the service URL in the client-side PDF Viewer control. For more information about how to get started with PDF Viewer control, refer to this [`getting started page`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/?). +**Step 4:** Set the PDF Viewer client’s serviceUrl to the server endpoint (for example, http://localhost:6001/api/pdfviewer). For details on creating a client application, see the [getting started guide](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started/). ```html @@ -113,13 +111,13 @@ if(ele) { ``` -## How to configure the distributed Redis Cache in this Docker image +## How to configure the distributed Redis cache in this Docker image -The PDF Viewer server library internally caches the loaded document instance and you can extend the cache option to a distributed cache environment. Please follow these steps to configure the Azure Cache for a Redis instance to the PDF Viewer server library using a Docker compose file. +The PDF Viewer server caches loaded document instances. To use a distributed cache, configure Azure Cache for Redis with docker-compose as follows. -**Step 1:** Create the [`Azure Cache for the Redis instance`](https://docs.microsoft.com/en-us/azure/azure-cache-for-redis/cache-dotnet-core-quickstart) and copy the connection string. +**Step 1:** Create an [Azure Cache for Redis instance](https://docs.microsoft.com/azure/azure-cache-for-redis/cache-dotnet-core-quickstart) and copy the connection string. -**Step 2:** Provide the connection string to the `REDIS_CACHE_CONNECTION_STRING` environment variable in the pdfviewer-server docker-compose file. The default cache sliding expiration time is 10 minutes. You can also configure it by setting the value to the `DOCUMENT_SLIDING_EXPIRATION_TIME` environment variable. +**Step 2:** Provide the connection string with the REDIS_CACHE_CONNECTION_STRING variable in docker-compose. The default sliding expiration is 10 minutes. To change it, set DOCUMENT_SLIDING_EXPIRATION_TIME. ```yaml version: '3.4' @@ -135,4 +133,10 @@ services: - "6001:80" ``` -Refer to these getting started pages to create a PDF Viewer in [`Angular`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/angular/getting-started), [`React`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/react/getting-started), [`Vue`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/vue/getting-started), [`ASP.NET MVC`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/asp-net-mvc/getting-started), [`ASP.NET Core`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/asp-net-core/getting-started), and [`Blazor`](https://blazor.syncfusion.com/documentation/pdfviewer/getting-started/server-side-application). \ No newline at end of file +Refer to the getting started guide for each platform: +- [Angular](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/angular/getting-started) +- [React](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/react/getting-started) +- [Vue](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/vue/getting-started) +- [ASP.NET MVC](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/asp-net-mvc/getting-started) +- [ASP.NET Core](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/asp-net-core/getting-started) +- [Blazor](https://blazor.syncfusion.com/documentation/pdfviewer/getting-started/server-side-application) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/style-and-appearance/annotation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/style-and-appearance/annotation.md index 5e55b58f5..5c4802987 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/style-and-appearance/annotation.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/style-and-appearance/annotation.md @@ -1,19 +1,20 @@ --- layout: post -title: Style and appearance in Javascript Pdfviewer control | Syncfusion -description: Learn all about style and appearance in the Annotation module in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Customize annotation toolbar icons in JavaScript PDF Viewer | Syncfusion +description: Learn how to customize annotation toolbar icons in the Syncfusion JavaScript PDF Viewer by applying targeted CSS styles. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Style and Appearance in Annotation module Javascript Pdfviewer control +# Customize annotation toolbar icons in JavaScript PDF Viewer -## Customizing the Highlight icon +Apply custom CSS to modify the annotation toolbar icons in the JavaScript PDF Viewer. Add these snippets to the page or global stylesheet that hosts the component to adjust icon color, size, or visibility. -Use the following CSS to customize the Highlight icon. +## Customize the Highlight icon + +Use the following CSS to adjust the Highlight annotation toolbar icon. ``` /* To specify font size and color */ @@ -24,9 +25,9 @@ Use the following CSS to customize the Highlight icon. } ``` -## Customizing the Underline icon +## Customize the Underline icon -Use the following CSS to customize the Underline icon. +Use the following CSS to update the Underline annotation toolbar icon. ``` /* To specify font size and color */ @@ -37,9 +38,9 @@ Use the following CSS to customize the Underline icon. } ``` -## Customizing the Strikethrough icon +## Customize the Strikethrough icon -Use the following CSS to customize the Strikethrough icon. +Use the following CSS to update the Strikethrough annotation toolbar icon. ``` /* To specify font size and color */ @@ -50,9 +51,9 @@ Use the following CSS to customize the Strikethrough icon. } ``` -## Customizing the Shape Annotation icon +## Customize the shape annotation icon -Use the following CSS to customize the Shape Annotation icon. +Use the following CSS to update the Shape Annotation toolbar icon. ``` /* To specify font size and color */ @@ -63,9 +64,9 @@ Use the following CSS to customize the Shape Annotation icon. } ``` -## Customizing the Calibration icon +## Customize the calibration icon -Use the following CSS to customize the Calibration icon. +Use the following CSS to update the Calibration annotation toolbar icon. ``` /* To specify font size and color */ @@ -76,9 +77,9 @@ Use the following CSS to customize the Calibration icon. } ``` -## Customizing the FreeText icon +## Customize the Free Text icon -Use the following CSS to customize the Handwritten signature icon. +Use the following CSS to update the Free Text annotation toolbar icon. ``` /* To specify font size and color */ @@ -89,9 +90,9 @@ Use the following CSS to customize the Handwritten signature icon. } ``` -## Customizing the Handwritten signature icon +## Customize the handwritten signature icon -Use the following CSS to customize the Handwritten signature icon. +Use the following CSS to update the Handwritten signature annotation toolbar icon. ``` /* To specify font size and color */ @@ -102,9 +103,9 @@ Use the following CSS to customize the Handwritten signature icon. } ``` -## Customizing the Ink Annotation icon +## Customize the ink annotation icon -Use the following CSS to customize the Ink Annotation icon. +Use the following CSS to update the Ink annotation toolbar icon. ``` /* To specify font size and color */ @@ -114,9 +115,9 @@ Use the following CSS to customize the Ink Annotation icon. font-size: 20px; } ``` -## Customizing the Close icon +## Customize the Close icon -Use the following CSS to customize the Close icon. +Use the following CSS to hide the Close icon. ``` #pdfViewer_annotation_closeIcon{ diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/style-and-appearance/form-designer.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/style-and-appearance/form-designer.md index 478445e04..cf7d699ec 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/style-and-appearance/form-designer.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/style-and-appearance/form-designer.md @@ -1,19 +1,20 @@ --- layout: post -title: Form Field Javascript Pdfviewer control | Syncfusion -description: Learn all about style and appearance in the Form Field module in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Customize form designer icons in JavaScript PDF Viewer | Syncfusion +description: Learn how to customize form designer toolbar icons and property window styles in the Syncfusion JavaScript PDF Viewer by applying targeted CSS. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Style and Appearance in Form Field module Javascript Pdfviewer control +# Customize form designer icons in JavaScript PDF Viewer -## Customizing the Textbox field +Apply the following CSS rules to tailor the form designer toolbar icons and property dialog appearance in the JavaScript PDF Viewer. Add the styles to the page or global stylesheet that hosts the control to adjust color, size, or visibility. -Use the following CSS to customize the Textbox field icon. +## Customize the text box field icon + +Use the following CSS to adjust the text box form field icon. ``` /* To specify color of the textbox*/ @@ -25,9 +26,9 @@ Use the following CSS to customize the Textbox field icon. ``` -## Customizing the Password field +## Customize the password field icon -Use the following CSS to customize the Password field icon. +Because the password field shares the text box icon styling, apply the following CSS to update its appearance. ``` /* To specify color of the Password*/ @@ -39,9 +40,9 @@ Use the following CSS to customize the Password field icon. ``` -## Customizing the CheckBox field +## Customize the checkbox field icon -Use the following CSS to customize the CheckBox field icon. +Use the following CSS to update the checkbox form field icon. ``` /* To specify color of the CheckBox*/ @@ -53,9 +54,9 @@ Use the following CSS to customize the CheckBox field icon. ``` -## Customizing the RadioButton field +## Customize the radio button field icon -Use the following CSS to customize the RadioButton field icon. +Use the following CSS to update the radio button form field icon. ``` /* To specify color of the RadioButton*/ @@ -66,9 +67,9 @@ Use the following CSS to customize the RadioButton field icon. } ``` -## Customizing the ListBox field +## Customize the list box field icon -Use the following CSS to customize the ListBox field icon. +Use the following CSS to update the list box form field icon. ``` /* To specify color of the ListBox*/ @@ -80,9 +81,9 @@ Use the following CSS to customize the ListBox field icon. ``` -## Customizing the DropDown field +## Customize the drop-down field icon -Use the following CSS to customize the DropDown field icon. +Use the following CSS to update the drop-down form field icon. ``` /* To specify color of the DropDown*/ @@ -94,9 +95,9 @@ Use the following CSS to customize the DropDown field icon. ``` -## Customizing the Signature and initial field +## Customize the signature and initial field icon -Use the following CSS to customize the Signature and initial fields icon. +Use the following CSS to update the signature and initial field icon. ``` /* To specify color of the Signature and initial fields*/ @@ -108,9 +109,9 @@ Use the following CSS to customize the Signature and initial fields icon. ``` -## Customizing the Close icon +## Customize the Close icon -Use the following CSS to customize the Close icon. +Use the following CSS to hide the Close icon. ``` #pdfViewer_formdesigner_closeIcon{ @@ -118,13 +119,13 @@ Use the following CSS to customize the Close icon. } ``` -## Customizing the Property window +## Customize the property window -Use the following CSS to customize the property window +Use the following CSS rules to restyle the property window dialog elements. -### Customizing the dialog header +### Customize the dialog header -Use the following CSS to customize the dialog header properties. +Use the following CSS to adjust the dialog header text style. ``` .e-pv-form-field-property-header { @@ -146,9 +147,9 @@ Use the following CSS to customize the dialog header properties. ``` -### Customizing the dialog check box +### Customize the dialog checkbox -Use the following CSS to customize the checkbox in the dialog. +Use the following CSS to adjust the checkbox appearance in the dialog. ``` .e-pdfviewer .e-checkbox-wrapper .e-frame + .e-label, .e-pdfviewer .e-css.e-checkbox-wrapper .e-frame + .e-label{ @@ -159,9 +160,9 @@ Use the following CSS to customize the checkbox in the dialog. } ``` -### Customizing the dialog close button +### Customize the dialog close button -Use the following CSS to customize the dialog close button. +Use the following CSS to update the dialog close button style. ``` .e-dialog .e-btn .e-btn-icon.e-icon-dlg-close { @@ -170,9 +171,9 @@ Use the following CSS to customize the dialog close button. } ``` -### Customizing the dialog footer button +### Customize the dialog footer button -Use the following CSS to customize the dialog footer button. +Use the following CSS to adjust the dialog footer button style. ``` .e-dialog .e-footer-content .e-btn { diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/style-and-appearance/style-and-appearance.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/style-and-appearance/style-and-appearance.md index a96d6ba40..11a559279 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/style-and-appearance/style-and-appearance.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/style-and-appearance/style-and-appearance.md @@ -1,30 +1,29 @@ --- layout: post -title: Style and appearance in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Style and appearance in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Customize appearance in JavaScript PDF Viewer | Syncfusion +description: Learn how to override CSS in the Syncfusion JavaScript PDF Viewer to customize icons, containers, and overall appearance. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Style and Appearance in Javascript Pdfviewer control +# Customize appearance in JavaScript PDF Viewer -To modify the PDF Viewer appearance, you need to override the default CSS of PDF Viewer. Please find the CSS structure that can be used to modify the PDF Viewer appearance. Also, you have an option to create your own custom theme for all the JavaScript controls using our [`Theme Studio`](https://ej2.syncfusion.com/themestudio/?theme=material). +Override the default CSS classes to tailor the Syncfusion JavaScript PDF Viewer interface. Apply the following snippets to your page or global stylesheet to update borders, backgrounds, and toolbar icons. To create a full custom theme for all JavaScript controls, use the [Syncfusion Theme Studio](https://ej2.syncfusion.com/themestudio/?theme=material). -## Customizing the PDF Viewer root element +## Customize the PDF Viewer root element -Use the below CSS to customize the PDF Viewer root element. +Use the following CSS to adjust the border of the PDF Viewer root element. ``` .e-pdfviewer{ border: 3px solid rgb(119, 249, 238); } ``` -## Customizing the PDF Viewer container +## Customize the PDF Viewer container -Use the following CSS to customize the PDF Viewer container +Use the following CSS to update the background color of the PDF Viewer container. ``` /* To specify background color*/ @@ -32,9 +31,9 @@ Use the following CSS to customize the PDF Viewer container background-color: rgb(119, 249, 238); } ``` -## Customizing the PDF Viewer container +## Customize the PDF Viewer page container -Use the following CSS to customize the PDF Viewer container +Use the following CSS to update the page container background within the PDF Viewer. ``` /* To specify background color*/ @@ -43,9 +42,9 @@ Use the following CSS to customize the PDF Viewer container } ``` -## Customizing the bookmark of the PDF Viewer +## Customize the bookmark icon -Use the following CSS to customize the bookmark of the PDF Viewer +Use the following CSS to adjust the bookmark icon color in the PDF Viewer toolbar. ``` /* To specify color of the bookmark */ @@ -57,9 +56,9 @@ Use the following CSS to customize the bookmark of the PDF Viewer } ``` -## Customizing the Thumbnail of the PDF Viewer +## Customize the thumbnail icon -Use the following CSS to customize the Thumbnail of the PDF Viewer +Use the following CSS to adjust the thumbnail icon color in the PDF Viewer toolbar. ``` /* To specify color of the bookmark */ diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/text-search.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/text-search.md index d4d4e05a7..0fa5479f0 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/text-search.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/text-search.md @@ -1,16 +1,15 @@ --- layout: post -title: Text search in Javascript Pdfviewer control | Syncfusion -description: Learn here all about Text search in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Text search in JavaScript PDF Viewer control | Syncfusion +description: Learn how to configure text search, handle search events, and run programmatic searches in the Syncfusion JavaScript PDF Viewer. platform: document-processing -control: Text search -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Text search in Javascript Pdfviewer control +# Text search in JavaScript PDF Viewer control -The Text Search option in PDF Viewer is used to find and highlight the text content from the document. You can enable/disable the text search using the following code snippet. +The text search feature in the PDF Viewer locates and highlights matching content within a document. Enable or disable this capability with the following configuration. ```html {% raw %} @@ -60,45 +59,93 @@ pdfviewer.appendTo('#PdfViewer'); ## Text search features -### Real time search suggestion while typing -Entering text into the search input dynamically displays search suggestions based on the provided input. The suggestions are updated in real-time as text is typed, offering relevant matches from the available content. This feature enhances the search experience by allowing quick access to potential results while typing. +### Real-time search suggestions while typing +Typing in the search box immediately surfaces suggestions that match the entered text. The list refreshes on every keystroke so users can quickly jump to likely results without completing the entire term. -![Alt text](./images/SingleSearchPopup.png) +![Search suggestion popup](./images/SingleSearchPopup.png) -### Selecting Search Suggestions from the Popup -Entering text into the search input triggers a popup displaying relevant suggestions based on the input. Selecting a suggestion from the popup enables direct navigation to its occurrences in the document. +### Select search suggestions from the popup +After typing in the search box, the popup lists relevant matches. Selecting an item jumps directly to the corresponding occurrence in the PDF. -![Alt text](./images/SearchResultFromPopup.png) +![Search results from popup](./images/SearchResultFromPopup.png) -### Search Text with enabling 'Match Case' checkbox -By enabling the 'Match Case' option and entering text into the search input, only the exact case-sensitive matches in the document are highlighted. This feature allows navigation through each occurrence of the exact text match within the document. +### Search text with the Match Case option +Enable the Match Case checkbox to limit results to case-sensitive matches. Navigation commands then step through each exact match in sequence. -![Alt text](./images/SearchNavigationMatchCase.png) +![Match case navigation](./images/SearchNavigationMatchCase.png) -### Search Text without enabling 'Match Case' checkbox -When text is entered into the search input without enabling the 'Match Case' option, all instances of the text, regardless of case, are highlighted in the document. This allows easy navigation through every occurrence of the search term. +### Search text without Match Case +Leave the Match Case option cleared to highlight every occurrence of the query, regardless of capitalization, and navigate through each result. -![Alt text](./images/SearchNavigationNoMatchCase.png) +![Search navigation without match case](./images/SearchNavigationNoMatchCase.png) -### Search list of text by enabling 'Match Any Word' checkbox -When the 'Match Any Word' option is enabled, the entered text in the search input is split into individual words based on spaces. As the text is typed, the popup dynamically displays search suggestions for each word in real time, highlighting potential matches within the document. +### Search a list of words with Match Any Word +Enable Match Any Word to split the query into separate words. The popup proposes matches for each word and highlights them throughout the document. -![Alt text](./images/MultiSearchPopup.png) +![Match any word search results](./images/MultiSearchPopup.png) + +### Programmatic search with settings + +While the PDF Viewer toolbar offers an interactive search experience, you can also trigger and customize searches programmatically by calling the `searchText` method with tailored options. + +#### Using `searchText` + +Use the `searchText` method to start a search with optional filters that control case sensitivity and whole-word behavior. + +```javascript +// searchText(text: string, isMatchCase?: boolean, isMatchWholeWord?: boolean) +pdfviewer.textSearch.searchText('search text', false, false); +``` + +- `isMatchCase` (optional boolean): Determines whether the search should be case-sensitive. +- `isMatchWholeWord` (optional boolean): Ensures the entire string is matched as a standalone word. + +#### Match Case + +Set the `isMatchCase` parameter to `true` to perform a case-sensitive search that mirrors the Match Case option in the search panel. + +```javascript +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf' +}); +pdfviewer.appendTo('#PdfViewer'); + +// Later, to search programmatically: +// This will only find instances of "PDF" in uppercase. +pdfviewer.textSearch.searchText('PDF', true); +``` + +#### Match Whole Word + +Set the `isMatchWholeWord` parameter to `true` to restrict results to whole-word matches. For example, a search for "view" will not match "viewer". + +```javascript +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf' +}); +pdfviewer.appendTo('#PdfViewer'); + +// Later, to search programmatically: +// This will find "pdf" but not "pdf-succinctly" +pdfviewer.textSearch.searchText('pdf', false, true); +``` + +**Note on Match Any Word:** The Match Any Word checkbox in the toolbar splits the input into multiple words and searches for each term individually. This differs from the `isMatchWholeWord` parameter, which enforces a whole-word match on the entire query string. The following text search methods are available in the PDF Viewer, -* [**Search text**](https://ej2.syncfusion.com/documentation/api/pdfviewer/textSearch/#searchtext):- Searches the target text in the PDF document and highlights the occurrences in the pages. -* [**Search next**](https://ej2.syncfusion.com/documentation/api/pdfviewer/textSearch/#searchnext):- Searches the next occurrence of the searched text from the current occurrence of the PdfViewer. -* [**Search previous**](https://ej2.syncfusion.com/documentation/api/pdfviewer/textSearch/#searchprevious):- Searches the previous occurrence of the searched text from the current occurrence of the PdfViewer. -* [**Cancel text search**](https://ej2.syncfusion.com/documentation/api/pdfviewer/textSearch/#canceltextsearch):- The text search can be cancelled and the highlighted occurrences from the PDF Viewer can be removed . +* [**Search text**](https://ej2.syncfusion.com/documentation/api/pdfviewer/textSearch/#searchtext): Searches the target text in the PDF document and highlights each occurrence in the pages. +* [**Search next**](https://ej2.syncfusion.com/documentation/api/pdfviewer/textSearch/#searchnext): Searches the next occurrence of the current query from the active match. +* [**Search previous**](https://ej2.syncfusion.com/documentation/api/pdfviewer/textSearch/#searchprevious): Searches the previous occurrence of the current query from the active match. +* [**Cancel text search**](https://ej2.syncfusion.com/documentation/api/pdfviewer/textSearch/#canceltextsearch): Cancels the current text search and removes the highlighted occurrences from the PDF Viewer. ![Alt text](./images/search.png) ## Find text method -Searches for the specified text or an array of strings within the document and returns the bounding rectangles for each occurrence. The search can be case-sensitive based on the provided parameters. If a specific page index is provided, it returns the bounding rectangles for these search strings on that page; otherwise, it returns the bounding rectangles for all pages in the document where the strings were found. +Use the `findText` method to locate a string or an array of strings and return the bounding rectangles for each match. Optional parameters support case-sensitive comparisons and page scoping so you can retrieve coordinates for a single page or the entire document. ### Find and get the bounds of a text -Searches for the specified text within the document and returns the bounding rectangles of the matched text. The search can be case-sensitive based on the provided parameter. It returns the bounding rectangles for all pages in the document where the text was found. The below code snippet shows how to get the bounds of the given text: +Searches for the specified text within the document and returns the bounding rectangles of the matched text. The search can be case-sensitive based on the provided parameter. It returns the bounding rectangles for all pages in the document where the text was found. The following code snippet shows how to get the bounds of the specified text: ```html
    @@ -137,7 +184,7 @@ pdfviewer.appendTo('#PdfViewer'); {% endtabs %} ### Find and get the bounds of a text on the desired page -Searches for the specified text within the document and returns the bounding rectangles of the matched text. The search can be case-sensitive based on the provided parameter. It returns the bounding rectangles for that page in the document where the text was found. The below code snippet shows how to get the bounds of the given text from the desired page: +Searches for the specified text within the document and returns the bounding rectangles of the matched text. The search can be case-sensitive based on the provided parameter. It returns the bounding rectangles for that page in the document where the text was found. The following code snippet shows how to retrieve bounds for the specified text on a selected page: ```html
    @@ -255,7 +302,79 @@ pdfviewer.appendTo('#PdfViewer'); [View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/How%20to/TextSearch) +## Text Search Events + +The PDF Viewer triggers events during text search operations, allowing you to customize behavior and respond to different stages of the search process. + +### textSearchStart + +The [textSearchStart](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#textsearchstart) event fires as soon as a search begins from the toolbar interface or through the `textSearch.searchText` method. Use it to reset UI state, log analytics, or cancel the default search flow before results are processed. + +- Event arguments: [TextSearchStartEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/textSearchStartEventArgs/) exposes: + - `searchText`: the term being searched. + - `matchCase`: indicates whether case-sensitive search is enabled. + - `isMatchWholeWord`: indicates whether whole-word matching is enabled. + - `name`: event name. + - `cancel`: set to `true` to stop the default search. + +```javascript +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + textSearchStart: function(args) { + console.log('Text Search started for: ' + args.searchText); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +### textSearchHighlight + +The [textSearchHighlight](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#textsearchhighlight) event triggers whenever a search result is brought into view, including navigation between matches. Use it to draw custom overlays or synchronize adjacent UI elements when a match is highlighted. + +- Event arguments: [TextSearchHighlightEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/textSearchHighlightEventArgs/) exposes: + - `bounds`: `RectangleBoundsModel | RectangleBoundsModel[]` representing the highlighted match. + - `pageNumber`: page index where the match is highlighted. + - `searchText`: the active search term. + - `matchCase`: indicates whether case-sensitive search was used. + - `name`: event name. + +```typescript +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + textSearchHighlight: function(args) { + console.log('Highlighted match bounds:\nleft: ' + args.bounds.left + '\ntop: ' + args.bounds.top + '\nheight: ' + args.bounds.height + '\nwidth: ' + args.bounds.width); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +### textSearchComplete + +The [textSearchComplete](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#textsearchcompleteevent) event runs after the search engine finishes scanning the document for the current query. Use it to update match counts, toggle navigation controls, or notify users when no results were found. + +- Typical uses: + - Update UI with the total number of matches and enable navigation controls. + - Hide loading indicators or show a "no results" message if none were found. + - Record analytics for search effectiveness. +- Event arguments: [TextSearchCompleteEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/textSearchCompleteEventArgs/) exposes: + - `totalMatches`: total number of occurrences found. + - `isMatchFound`: indicates whether at least one match was found. + - `searchText`: the searched term. + - `matchCase`: indicates whether case-sensitive search was used. + - `name`: event name. + +```typescript +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + textSearchComplete: function(args) { + console.log('Text Search completed with ' + args.totalMatches + ' match(es)'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + ## See also * [Toolbar items](./toolbar) -* [Feature Modules](./feature-module) \ No newline at end of file +* [Feature modules](./feature-module) +* [Text selection](./textselection) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/textselection.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/textselection.md new file mode 100644 index 000000000..996337e07 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/textselection.md @@ -0,0 +1,119 @@ +--- +layout: post +title: Text selection in JavaScript PDF Viewer control | Syncfusion +description: Learn how to configure text selection, react to selection events, and manage copy workflows in the Syncfusion JavaScript PDF Viewer. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- +# Text selection in JavaScript PDF Viewer control + +The TextSelection module lets users highlight and copy text from the loaded PDF. Selection is enabled by default and can be configured or monitored programmatically to match application workflows. + +## Enable or disable text selection + +Use the `enableTextSelection` property to enable or disable choosing text in the PDF Viewer. + +```html + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + +``` + +{% tabs %} +{% highlight js tabtitle="Standalone" %} + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection +); + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + enableTextSelection: true // Defaults to true +}); +pdfviewer.appendTo('#PdfViewer'); + +// Disable text selection later if required +pdfviewer.enableTextSelection = false; + +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.LinkAnnotation, + ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection +); + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + enableTextSelection: true // Defaults to true +}); +pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; +pdfviewer.appendTo('#PdfViewer'); + +// Toggle on demand +pdfviewer.enableTextSelection = false; + +{% endhighlight %} +{% endtabs %} + +## Text selection events + +Monitor user interaction with selection events to coordinate downstream actions such as showing tooltips, enabling context menus, or storing analytics. + +### textSelectionStart + +The [textSelectionStart](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#textselectionstartevent) event fires when a user begins selecting text. Use it to reset temporary UI, pause conflicting shortcuts, or capture the starting context. + +- Event arguments: `TextSelectionStartEventArgs` supplies details such as `pageNumber`, `bounds`, and `selectionBehavior`. + +```js + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + textSelectionStart: function (args) { + // args.pageNumber, args.bounds provide the starting context + console.log('Selection started', args); + } +}); +viewer.appendTo('#PdfViewer'); +``` + +### textSelectionEnd + +The [textSelectionEnd](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#textselectionendevent) event triggers after the selection is finalized. Use it to access the selected text, toggle contextual commands, or store telemetry. + +- Event arguments: `TextSelectionEndEventArgs` includes `pageNumber`, `bounds`, `selectedText`, and `isSelectionCopied`. + +```js + +var viewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + textSelectionEnd: function (args) { + // For example, automatically copy or show a custom menu + console.log('Selection ended', args); + } +}); +viewer.appendTo('#PdfViewer'); +``` + + +## See also + +- [Text search](./text-search) +- [Interaction modes](./interaction-mode) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/annotation-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/annotation-toolbar-customization.md new file mode 100644 index 000000000..0aa957a83 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/annotation-toolbar-customization.md @@ -0,0 +1,139 @@ +--- +layout: post +title: Annotation Toolbar Customization in JavaScript PDF Viewer control | Syncfusion +description: Learn here all about annotation toolbar customization in Syncfusion JavaScript PDF Viewer control of Syncfusion Essential JS 2 and more. +platform: document-processing +control: Annotation Toolbar Customization +publishingplatform: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Annotation Toolbar Customization + +The annotation toolbar can be customized by showing or hiding default items and by controlling the order in which they appear. + +## Show or hide the annotation toolbar + +Show or hide the annotation toolbar programmatically during initialization or at runtime. + +Use the [EnableAnnotationToolbar](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/pdfViewerModel/#enableannotationtoolbar) property or the [showAnnotationToolbar](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbar/#showannotationtoolbar) method to toggle visibility. + +The following code snippet explains how to show or hide the annotation toolbar using the `showAnnotationToolbar` method. + +{% tabs %} +{% highlight js tabtitle="index.js" %} +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, + ej.pdfviewer.Annotation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, + ej.pdfviewer.FormFields, ej.pdfviewer.FormDesigner +); + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib' +}); +pdfviewer.appendTo('#PdfViewer'); + +document.getElementById('set').addEventListener('click', function () { + pdfviewer.toolbar.showAnnotationToolbar(false); +}); + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + + + + + Essential JS 2 + + + + + + + +
    +
    +
    +
    + + + +{% endhighlight %} +{% endtabs %} + +## How to customize the annotation toolbar + +Choose which tools appear and control their order in the annotation toolbar. + +Use [`PdfViewerToolbarSettings`](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbarSettings/) with the [`AnnotationToolbarItems`](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbarSettings/#annotationtoolbaritems) property to choose which tools are displayed in the annotation toolbar. The property accepts a list of [`AnnotationToolbarItem`](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotationToolbarItem/) values. Only the items included in this list are shown; any item not listed is hidden. The rendered order follows the sequence of items in the list. + +The annotation toolbar is presented when entering annotation mode in PDF Viewer and adapts responsively based on the available width. Include the Close tool to allow users to exit the annotation toolbar when needed. + +The following example demonstrates how to customize the annotation toolbar by specifying a selected set of tools using `AnnotationToolbarItem`. + +{% tabs %} +{% highlight js tabtitle="index.js" %} + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, + ej.pdfviewer.Annotation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, + ej.pdfviewer.FormFields, ej.pdfviewer.FormDesigner +); + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib', + toolbarSettings: { + annotationToolbarItems: [ + "HighlightTool", + "UnderlineTool", + "StrikethroughTool", + "SquigglyTool", + "ColorEditTool", + "OpacityEditTool", + "AnnotationDeleteTool", + "StampAnnotationTool", + "HandWrittenSignatureTool", + "InkAnnotationTool", + "ShapeTool", + "CalibrateTool", + "StrokeColorEditTool", + "ThicknessEditTool", + "FreeTextAnnotationTool", + "FontFamilyAnnotationTool", + "FontSizeAnnotationTool", + "FontStylesAnnotationTool", + "FontAlignAnnotationTool", + "FontColorAnnotationTool", + "CommentPanelTool" + ] + } +}); +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + + +{% endhighlight %} +{% endtabs %} diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/custom-toolbar.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/custom-toolbar.md new file mode 100644 index 000000000..dc16e058e --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/custom-toolbar.md @@ -0,0 +1,1018 @@ +--- +layout: post +title: Custom Toolbar in Javascript PDF Viewer | Syncfusion +description: Learn here all about Custom Toolbar in Syncfusion Javascript PDF Viewer of Syncfusion Essential JS 2 and more. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +## Custom Toolbar + +The PDF Viewer provides APIs for user interaction options available in its built-in toolbar. Using these, you can create your own custom user interface for toolbar actions at the application level by hiding the default toolbar. + +Follow these steps to create a custom toolbar for the PDF Viewer: + +**Step 1: Create a simple PDF Viewer sample.** + +Follow the steps provided in the [getting started](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) guide to create a basic PDF Viewer sample. + +**Step 2: Add HTML elements for the custom toolbar.** + +Add HTML `div` elements to act as containers for the custom toolbar actions: + +```html +{% raw %} + + + + Essential JS 2 + + + + + + + + +
    ...
    +
    +
    +
    +
    +
    + + +
    +
    + + + + + + +
    +
    + +
    +
    + + +{% endraw %} +``` + +**Step 3: Hide the default toolbar of the PDF Viewer.** + +Hide the default toolbar using `enableToolbar` and `enableNavigationToolbar` properties: + +{% tabs %} +{% highlight js tabtitle="Standalone" %} +```javascript +var pdfviewer = new ej.pdfviewer.PdfViewer({ + enableToolbar: false, + enableNavigationToolbar: false, + documentPath: "https://cdn.syncfusion.com/content/pdf/hive-succinctly.pdf" +}); +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Navigation,ej.pdfviewer.Print); +pdfviewer.appendTo('#PdfViewer'); +``` +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} +```javascript +var pdfviewer = new ej.pdfviewer.PdfViewer({ + enableToolbar: false, + enableNavigationToolbar: false, + documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", + serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer' +}); +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Navigation,ej.pdfviewer.Print); +pdfviewer.appendTo('#PdfViewer'); +``` +{% endhighlight %} +{% endtabs %} + +**Step 4: Add EJ2 Toolbar for primary actions.** + +Add Syncfusion EJ2 Toolbar components to perform primary actions like Open, Previous page, Next page, Go to page, Print, and Download: + +```javascript + +var toolbarObj = new ej.navigations.Toolbar({ + items: [ + { prefixIcon: 'e-pv-open-document', tooltipText: 'Open', id: 'openButton', click: openClicked }, + { prefixIcon: 'e-pv-bookmark-icon', tooltipText: 'Bookmark', id: 'bookmarkButton', click: bookmarkClicked }, + { prefixIcon: 'e-pv-previous-page-navigation-icon', id: 'previousPage', tooltipText: 'Previous Page', align: 'Center', click: previousClicked.bind(this) }, + { prefixIcon: 'e-pv-next-page-navigation-icon', id: 'nextPage', tooltipText: 'Next Page', align: 'Center', click: nextClicked.bind(this) }, + { template: inputTemplate, tooltipText: 'Page Number', align: 'Center' }, + { template: ele, tooltipText: 'Page Number', align: 'Center' }, + { prefixIcon: 'e-pv-search-icon', tooltipText: 'Text Search', align: 'Right', click: searchClicked.bind(this) }, + { prefixIcon: 'e-pv-print-document-icon', tooltipText: 'Print', align: 'Right', click: printClicked.bind(this) }, + { prefixIcon: 'e-pv-download-document-icon', tooltipText: 'Download', align: 'Right', click: downloadClicked.bind(this) } + ] +}); +toolbarObj.appendTo('#topToolbar'); + +``` + +**Step 5: Add EJ2 Toolbar for magnification actions.** + +Add Syncfusion EJ2 Toolbar components to perform magnification actions in the PDF Viewer: + +```javascript + +var magnificationToolbar = new ej.navigations.Toolbar({ + items: [ + { prefixIcon: 'e-pv-fit-page-icon', id: 'fitPage', tooltipText: 'Fit to page', click: pageFitClicked.bind(this) }, + { prefixIcon: 'e-pv-zoom-in-icon', id: 'zoomIn', tooltipText: 'Zoom in', click: zoomInClicked.bind(this) }, + { prefixIcon: 'e-pv-zoom-out-icon' , id: 'zoomOut', tooltipText: 'Zoom out', click: zoomOutClicked.bind(this) }, + ] +}); +magnificationToolbar.appendTo('#magnificationToolbar'); + +``` + +**Step 6:** Add the following style to achieve the custom toolbar styling, + +```css + +``` + +>The icons are embedded in the font file used in above code snippet. + +**Step 7: Add scripts for PDF Viewer user interaction.** + +Add the following scripts for handling user interactions with the custom toolbar: + +{% tabs %} +{% highlight js tabtitle="Standalone" %} + +```javascript + +var inputTemplate = '
    '; +var totalPageNum = '
    of 0
    '; +var isBookmarkOpen = false; +var isBookmarkClick = false; +var isTextSearchBoxOpen = false; +var bookmarkPopup; +var textSearchPopup; +var toolbarObj; +var viewer; +var currentPageBox; +var searchInput; +var searchButton; +var openDocument; +var matchCase = false; +var fileInputElement; +var filename; + +function previousClicked(args) { + hidePopups(); + viewer.navigation.goToPreviousPage(); +} +function hidePopups() { + isBookmarkOpen = false; + isTextSearchBoxOpen = false; + bookmarkPopup.hide(); + textSearchPopup.hide(); +} +function bookmarkClicked() { + textSearchPopup.hide(); + if (!isBookmarkOpen) { + var bookmarkDetails = viewer.bookmark.getBookmarks(); + if (bookmarkDetails.bookmarks) { + var bookmarks = bookmarkDetails.bookmarks.bookMark; + var treeObj = new ej.navigations.TreeView({ + fields: { + dataSource: bookmarks, + id: 'Id', + parentID: 'Pid', + text: 'Title', + hasChildren: 'HasChild', + }, nodeSelected: nodeClick + }); + treeObj.appendTo('#bookmarkview'); + bookmarkPopup.show(); + isBookmarkOpen = true; + isBookmarkClick = true; + } + else { + toolbarObj.enableItems(document.getElementById('bookmarkButton'), false); + isBookmarkOpen = false; + } + } + else { + if (!isBookmarkClick) { + bookmarkPopup.show(); + isBookmarkClick = true; + } else { + bookmarkPopup.hide(); + isBookmarkClick = false; + } + } +} +function nextClicked(args) { + hidePopups(); + viewer.navigation.goToNextPage(); +} +function searchClicked(args) { + bookmarkPopup.hide(); + if (!isTextSearchBoxOpen) { + textSearchPopup.show(); + } + else { + viewer.textSearch.cancelTextSearch(); + textSearchPopup.hide(); + } + isTextSearchBoxOpen = !isTextSearchBoxOpen; +} +function printClicked(args) { + hidePopups(); + viewer.print.print(); +} +function downloadClicked(args) { + hidePopups(); + viewer.download(); +} +function pageFitClicked(args) { + hidePopups(); + viewer.magnification.fitToPage(); + updateZoomButtons(); + toolbarObj.enableItems(document.getElementById('fitPage'), false); +} +function zoomInClicked(args) { + hidePopups(); + viewer.magnification.zoomIn(); + updateZoomButtons(); +} +function zoomOutClicked(args) { + hidePopups(); + viewer.magnification.zoomOut(); + updateZoomButtons(); +} + +function readFile(args) { + // tslint:disable-next-line + var upoadedFiles = args.target.files; + if (args.target.files[0] !== null) { + var uploadedFile = upoadedFiles[0]; + filename = upoadedFiles[0].name; + if (uploadedFile) { + var reader = new FileReader(); + reader.readAsDataURL(uploadedFile); + // tslint:disable-next-line + reader.onload = function (e) { + var uploadedFileUrl = e.currentTarget.result; + viewer.load(uploadedFileUrl, null); + currentPageBox.value = '1'; + document.getElementById("bookmarkview").innerHTML = ""; + isBookmarkOpen = false; + viewer.fileName = filename; + }; + } + } +} + +function openClicked() { + document.getElementById('fileUpload').click(); +} +function onCurrentPageBoxKeypress(event) { + if ((event.which < 48 || event.which > 57) && event.which !== 8 && event.which !== 13) { + event.preventDefault(); + return false; + } + else { + var currentPageNumber = parseInt(currentPageBox.value); + if (event.which === 13) { + if (currentPageNumber > 0 && currentPageNumber <= viewer.pageCount) { + viewer.navigation.goToPage(currentPageNumber); + } + else { + currentPageBox.value = viewer.currentPageNumber.toString(); + } + } + return true; + } +} +function onCurrentPageBoxClicked() { + currentPageBox.select(); + currentPageBox.focus(); +} +function updatePageNavigation() { + if (viewer.currentPageNumber === 1) { + toolbarObj.enableItems(document.getElementById('previousPage'), false); + toolbarObj.enableItems(document.getElementById('nextPage'), true); + } + else if (viewer.currentPageNumber === viewer.pageCount) { + toolbarObj.enableItems(document.getElementById('previousPage'), true); + toolbarObj.enableItems(document.getElementById('nextPage'), false); + } + else { + toolbarObj.enableItems(document.getElementById('previousPage'), true); + toolbarObj.enableItems(document.getElementById('nextPage'), true); + } +} +function updateZoomButtons() { + if (viewer.zoomPercentage <= 50) { + toolbarObj.enableItems(document.getElementById('zoomIn'), true); + toolbarObj.enableItems(document.getElementById('zoomOut'), false); + toolbarObj.enableItems(document.getElementById('fitPage'), true); + } + else if (viewer.zoomPercentage >= 400) { + toolbarObj.enableItems(document.getElementById('zoomIn'), false); + toolbarObj.enableItems(document.getElementById('zoomOut'), true); + toolbarObj.enableItems(document.getElementById('fitPage'), true); + } + else { + toolbarObj.enableItems(document.getElementById('zoomIn'), true); + toolbarObj.enableItems(document.getElementById('zoomOut'), true); + toolbarObj.enableItems(document.getElementById('fitPage'), true); + } +} +function nodeClick(args) { + var bookmarksDetails = viewer.bookmark.getBookmarks(); + var bookmarksDestination = bookmarksDetails.bookmarksDestination; + var bookid = Number(args.nodeData.id); + var pageIndex = bookmarksDestination.bookMarkDestination[bookid].PageIndex; + var Y = bookmarksDestination.bookMarkDestination[bookid].Y; + viewer.bookmark.goToBookmark(pageIndex, Y); + return false; +} +function searchInputKeypressed(event) { + enablePrevButton(true); + enableNextButton(true); + if (event.which === 13) { + initiateTextSearch(); + updateSearchInputIcon(false); + } +} +function searchClickHandler() { + if (searchButton.classList.contains('e-pv-search-icon')) { + viewer.textSearch.cancelTextSearch(); + initiateTextSearch(); + } + else if (searchButton.classList.contains('e-pv-search-close')) { + searchInput.value = ''; + searchInput.focus(); + viewer.textSearch.cancelTextSearch(); + } +} +function initiateTextSearch() { + var searchString = searchInput.value; + viewer.textSearch.searchText(searchString, matchCase); +} +function previousSearchClicked() { + var searchString = searchInput.value; + if (searchString) { + viewer.textSearch.searchPrevious(); + } +} +function nextSearchClicked() { + var searchString = searchInput.value; + if (searchString) { + viewer.textSearch.searchNext(); + } +} +function checkBoxChanged(args) { + if (args.checked) { + matchCase = true; + } + else { + matchCase = false; + } + initiateTextSearch(); +} +function enablePrevButton(isEnable) { + var previousSearchButton = document.getElementById('previousSearch'); + if (isEnable) { + previousSearchButton.removeAttribute('disabled'); + } + else { + previousSearchButton.disabled = true; + } +} +function enableNextButton(isEnable) { + var nextSearchButton = document.getElementById('nextSearch'); + if (isEnable) { + nextSearchButton.removeAttribute('disabled'); + } + else { + nextSearchButton.disabled = true; + } +} +function updateSearchInputIcon(isEnable) { + if (isEnable) { + searchButton.classList.remove('e-pv-search-close'); + searchButton.classList.add('e-pv-search-icon'); + } + else { + searchButton.classList.remove('e-pv-search-icon'); + searchButton.classList.add('e-pv-search-close'); + } +} +toolbarObj = new ej.navigations.Toolbar({ + items: [ + { prefixIcon: 'e-pv-open-document', tooltipText: 'Open', id: 'openButton', click: openClicked }, + { prefixIcon: 'e-pv-bookmark-icon', tooltipText: 'Bookmark', id: 'bookmarkButton', click: bookmarkClicked }, + { prefixIcon: 'e-pv-previous-page-navigation-icon', id: 'previousPage', tooltipText: 'Previous Page', align: 'Center', click: previousClicked.bind(this) }, + { prefixIcon: 'e-pv-next-page-navigation-icon', id: 'nextPage', tooltipText: 'Next Page', align: 'Center', click: nextClicked.bind(this) }, + { template: inputTemplate, tooltipText: 'Page Number', align: 'Center' }, + { template: totalPageNum, tooltipText: 'Page Number', align: 'Center' }, + { prefixIcon: 'e-pv-search-icon', tooltipText: 'Text Search', align: 'Right', click: searchClicked.bind(this) }, + { prefixIcon: 'e-pv-print-document-icon', tooltipText: 'Print', align: 'Right', click: printClicked.bind(this) }, + { prefixIcon: 'e-pv-download-document-icon', tooltipText: 'Download', align: 'Right', click: downloadClicked.bind(this) } + ] +}); +toolbarObj.appendTo('#topToolbar'); +var magnificationToolbar = new ej.navigations.Toolbar({ + items: [ + { prefixIcon: 'e-pv-fit-page-icon', id: 'fitPage', tooltipText: 'Fit to page', click: pageFitClicked.bind(this) }, + { prefixIcon: 'e-pv-zoom-in-icon', id: 'zoomIn', tooltipText: 'Zoom in', click: zoomInClicked.bind(this) }, + { prefixIcon: 'e-pv-zoom-out-icon' , id: 'zoomOut', tooltipText: 'Zoom out', click: zoomOutClicked.bind(this) }, + ] +}); +magnificationToolbar.appendTo('#magnificationToolbar'); +viewer = new ej.pdfviewer.PdfViewer({ + enableToolbar: false, + enableNavigationToolbar: false, + documentPath: 'https://cdn.syncfusion.com/content/pdf/hive-succinctly.pdf' +}); +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.LinkAnnotation,ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Navigation, ej.pdfviewer.Print +); +viewer.appendTo('#pdfViewer'); +document.getElementById('fileUpload').addEventListener('change', readFile, false); +currentPageBox = document.getElementById('currentPage'); +currentPageBox.value = '1'; +searchInput = document.getElementById('searchInput'); +openDocument = document.getElementById('fileupload'); +bookmarkPopup = new ej.popups.Dialog({ + showCloseIcon: true, header: "Bookmarks", closeOnEscape: false, isModal: false, target: document.getElementById('pdfViewer'), + content: '
    ', + buttons: [{ + buttonModel: {}, + }], position: { X: 'left', Y: 'top' }, cssClass: 'e-bookmark-popup', beforeClose: function () { + isBookmarkOpen = false; + } +}); +bookmarkPopup.appendTo('#popup'); +textSearchPopup = new ej.popups.Dialog({ + showCloseIcon: false, closeOnEscape: false, isModal: false, target: document.getElementById('pdfViewer'), + buttons: [{ + buttonModel: {}, + }], position: { X: 'right', Y: 'top' }, cssClass: 'e-text-search-popup', +}); +textSearchPopup.appendTo('#textSearchBox'); +var previousSearch = new ej.buttons.Button({ iconCss: 'e-pv-previous-search' }); +previousSearch.appendTo('#previousSearch'); +var nextSearch = new ej.buttons.Button({ iconCss: 'e-pv-next-search-btn' }); +nextSearch.appendTo('#nextSearch'); +var matchCaseCheck = new ej.buttons.CheckBox({ label: 'Match case', change: checkBoxChanged }); +matchCaseCheck.appendTo('#matchCase'); +viewer.pageChange = function (args) { + currentPageBox.value = viewer.currentPageNumber.toString(); + updatePageNavigation(); +}; +viewer.documentLoad = function (args) { + document.getElementById('totalPage').textContent = 'of ' + viewer.pageCount; + updatePageNavigation(); +}; +searchButton = document.getElementById('searchBtn'); +searchInput.addEventListener('focus', function () { searchInput.parentElement.classList.add('e-input-focus'); }); +searchInput.addEventListener('blur', function () { searchInput.parentElement.classList.remove('e-input-focus'); }); +searchInput.addEventListener('keypress', searchInputKeypressed); +document.getElementById('previousSearch').addEventListener('click', previousSearchClicked); +document.getElementById('nextSearch').addEventListener('click', nextSearchClicked); +searchButton.addEventListener('click', searchClickHandler); +currentPageBox.addEventListener('keypress', onCurrentPageBoxKeypress); +currentPageBox.addEventListener('click', onCurrentPageBoxClicked); +bookmarkPopup.hide(); +textSearchPopup.hide(); +enableNextButton(false); +enablePrevButton(false); + +``` +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} + +```javascript + +var inputTemplate = '
    '; +var totalPageNum = '
    of 0
    '; +var isBookmarkOpen = false; +var isBookmarkClick = false; +var isTextSearchBoxOpen = false; +var bookmarkPopup; +var textSearchPopup; +var toolbarObj; +var viewer; +var currentPageBox; +var searchInput; +var searchButton; +var openDocument; +var matchCase = false; +var fileInputElement; +var filename; + +function previousClicked(args) { + hidePopups(); + viewer.navigation.goToPreviousPage(); +} +function hidePopups() { + isBookmarkOpen = false; + isTextSearchBoxOpen = false; + bookmarkPopup.hide(); + textSearchPopup.hide(); +} +function bookmarkClicked() { + textSearchPopup.hide(); + if (!isBookmarkOpen) { + var bookmarkDetails = viewer.bookmark.getBookmarks(); + if (bookmarkDetails.bookmarks) { + var bookmarks = bookmarkDetails.bookmarks.bookMark; + var treeObj = new ej.navigations.TreeView({ + fields: { + dataSource: bookmarks, + id: 'Id', + parentID: 'Pid', + text: 'Title', + hasChildren: 'HasChild', + }, nodeSelected: nodeClick + }); + treeObj.appendTo('#bookmarkview'); + bookmarkPopup.show(); + isBookmarkOpen = true; + isBookmarkClick = true; + } + else { + toolbarObj.enableItems(document.getElementById('bookmarkButton'), false); + isBookmarkOpen = false; + } + } + else { + if (!isBookmarkClick) { + bookmarkPopup.show(); + isBookmarkClick = true; + } else { + bookmarkPopup.hide(); + isBookmarkClick = false; + } + } +} +function nextClicked(args) { + hidePopups(); + viewer.navigation.goToNextPage(); +} +function searchClicked(args) { + bookmarkPopup.hide(); + if (!isTextSearchBoxOpen) { + textSearchPopup.show(); + } + else { + viewer.textSearch.cancelTextSearch(); + textSearchPopup.hide(); + } + isTextSearchBoxOpen = !isTextSearchBoxOpen; +} +function printClicked(args) { + hidePopups(); + viewer.print.print(); +} +function downloadClicked(args) { + hidePopups(); + viewer.download(); +} +function pageFitClicked(args) { + hidePopups(); + viewer.magnification.fitToPage(); + updateZoomButtons(); + toolbarObj.enableItems(document.getElementById('fitPage'), false); +} +function zoomInClicked(args) { + hidePopups(); + viewer.magnification.zoomIn(); + updateZoomButtons(); +} +function zoomOutClicked(args) { + hidePopups(); + viewer.magnification.zoomOut(); + updateZoomButtons(); +} + +function readFile(args) { + // tslint:disable-next-line + var upoadedFiles = args.target.files; + if (args.target.files[0] !== null) { + var uploadedFile = upoadedFiles[0]; + filename = upoadedFiles[0].name; + if (uploadedFile) { + var reader = new FileReader(); + reader.readAsDataURL(uploadedFile); + // tslint:disable-next-line + reader.onload = function (e) { + var uploadedFileUrl = e.currentTarget.result; + viewer.load(uploadedFileUrl, null); + currentPageBox.value = '1'; + document.getElementById("bookmarkview").innerHTML = ""; + isBookmarkOpen = false; + viewer.fileName = filename; + }; + } + } +} + +function openClicked() { + document.getElementById('fileUpload').click(); +} +function onCurrentPageBoxKeypress(event) { + if ((event.which < 48 || event.which > 57) && event.which !== 8 && event.which !== 13) { + event.preventDefault(); + return false; + } + else { + var currentPageNumber = parseInt(currentPageBox.value); + if (event.which === 13) { + if (currentPageNumber > 0 && currentPageNumber <= viewer.pageCount) { + viewer.navigation.goToPage(currentPageNumber); + } + else { + currentPageBox.value = viewer.currentPageNumber.toString(); + } + } + return true; + } +} +function onCurrentPageBoxClicked() { + currentPageBox.select(); + currentPageBox.focus(); +} +function updatePageNavigation() { + if (viewer.currentPageNumber === 1) { + toolbarObj.enableItems(document.getElementById('previousPage'), false); + toolbarObj.enableItems(document.getElementById('nextPage'), true); + } + else if (viewer.currentPageNumber === viewer.pageCount) { + toolbarObj.enableItems(document.getElementById('previousPage'), true); + toolbarObj.enableItems(document.getElementById('nextPage'), false); + } + else { + toolbarObj.enableItems(document.getElementById('previousPage'), true); + toolbarObj.enableItems(document.getElementById('nextPage'), true); + } +} +function updateZoomButtons() { + if (viewer.zoomPercentage <= 50) { + toolbarObj.enableItems(document.getElementById('zoomIn'), true); + toolbarObj.enableItems(document.getElementById('zoomOut'), false); + toolbarObj.enableItems(document.getElementById('fitPage'), true); + } + else if (viewer.zoomPercentage >= 400) { + toolbarObj.enableItems(document.getElementById('zoomIn'), false); + toolbarObj.enableItems(document.getElementById('zoomOut'), true); + toolbarObj.enableItems(document.getElementById('fitPage'), true); + } + else { + toolbarObj.enableItems(document.getElementById('zoomIn'), true); + toolbarObj.enableItems(document.getElementById('zoomOut'), true); + toolbarObj.enableItems(document.getElementById('fitPage'), true); + } +} +function nodeClick(args) { + var bookmarksDetails = viewer.bookmark.getBookmarks(); + var bookmarksDestination = bookmarksDetails.bookmarksDestination; + var bookid = Number(args.nodeData.id); + var pageIndex = bookmarksDestination.bookMarkDestination[bookid].PageIndex; + var Y = bookmarksDestination.bookMarkDestination[bookid].Y; + viewer.bookmark.goToBookmark(pageIndex, Y); + return false; +} +function searchInputKeypressed(event) { + enablePrevButton(true); + enableNextButton(true); + if (event.which === 13) { + initiateTextSearch(); + updateSearchInputIcon(false); + } +} +function searchClickHandler() { + if (searchButton.classList.contains('e-pv-search-icon')) { + viewer.textSearch.cancelTextSearch(); + initiateTextSearch(); + } + else if (searchButton.classList.contains('e-pv-search-close')) { + searchInput.value = ''; + searchInput.focus(); + viewer.textSearch.cancelTextSearch(); + } +} +function initiateTextSearch() { + var searchString = searchInput.value; + viewer.textSearch.searchText(searchString, matchCase); +} +function previousSearchClicked() { + var searchString = searchInput.value; + if (searchString) { + viewer.textSearch.searchPrevious(); + } +} +function nextSearchClicked() { + var searchString = searchInput.value; + if (searchString) { + viewer.textSearch.searchNext(); + } +} +function checkBoxChanged(args) { + if (args.checked) { + matchCase = true; + } + else { + matchCase = false; + } + initiateTextSearch(); +} +function enablePrevButton(isEnable) { + var previousSearchButton = document.getElementById('previousSearch'); + if (isEnable) { + previousSearchButton.removeAttribute('disabled'); + } + else { + previousSearchButton.disabled = true; + } +} +function enableNextButton(isEnable) { + var nextSearchButton = document.getElementById('nextSearch'); + if (isEnable) { + nextSearchButton.removeAttribute('disabled'); + } + else { + nextSearchButton.disabled = true; + } +} +function updateSearchInputIcon(isEnable) { + if (isEnable) { + searchButton.classList.remove('e-pv-search-close'); + searchButton.classList.add('e-pv-search-icon'); + } + else { + searchButton.classList.remove('e-pv-search-icon'); + searchButton.classList.add('e-pv-search-close'); + } +} +toolbarObj = new ej.navigations.Toolbar({ + items: [ + { prefixIcon: 'e-pv-open-document', tooltipText: 'Open', id: 'openButton', click: openClicked }, + { prefixIcon: 'e-pv-bookmark-icon', tooltipText: 'Bookmark', id: 'bookmarkButton', click: bookmarkClicked }, + { prefixIcon: 'e-pv-previous-page-navigation-icon', id: 'previousPage', tooltipText: 'Previous Page', align: 'Center', click: previousClicked.bind(this) }, + { prefixIcon: 'e-pv-next-page-navigation-icon', id: 'nextPage', tooltipText: 'Next Page', align: 'Center', click: nextClicked.bind(this) }, + { template: inputTemplate, tooltipText: 'Page Number', align: 'Center' }, + { template: totalPageNum, tooltipText: 'Page Number', align: 'Center' }, + { prefixIcon: 'e-pv-search-icon', tooltipText: 'Text Search', align: 'Right', click: searchClicked.bind(this) }, + { prefixIcon: 'e-pv-print-document-icon', tooltipText: 'Print', align: 'Right', click: printClicked.bind(this) }, + { prefixIcon: 'e-pv-download-document-icon', tooltipText: 'Download', align: 'Right', click: downloadClicked.bind(this) } + ] +}); +toolbarObj.appendTo('#topToolbar'); +var magnificationToolbar = new ej.navigations.Toolbar({ + items: [ + { prefixIcon: 'e-pv-fit-page-icon', id: 'fitPage', tooltipText: 'Fit to page', click: pageFitClicked.bind(this) }, + { prefixIcon: 'e-pv-zoom-in-icon', id: 'zoomIn', tooltipText: 'Zoom in', click: zoomInClicked.bind(this) }, + { prefixIcon: 'e-pv-zoom-out-icon' , id: 'zoomOut', tooltipText: 'Zoom out', click: zoomOutClicked.bind(this) }, + ] +}); +magnificationToolbar.appendTo('#magnificationToolbar'); +viewer = new ej.pdfviewer.PdfViewer({ + enableToolbar: false, + enableNavigationToolbar: false, + documentPath: 'https://cdn.syncfusion.com/content/pdf/hive-succinctly.pdf', + serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/' +}); +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.LinkAnnotation,ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Navigation, + ej.pdfviewer.Print +); +viewer.appendTo('#pdfViewer'); +document.getElementById('fileUpload').addEventListener('change', readFile, false); +currentPageBox = document.getElementById('currentPage'); +currentPageBox.value = '1'; +searchInput = document.getElementById('searchInput'); +openDocument = document.getElementById('fileupload'); +bookmarkPopup = new ej.popups.Dialog({ + showCloseIcon: true, header: "Bookmarks", closeOnEscape: false, isModal: false, target: document.getElementById('pdfViewer'), + content: '
    ', + buttons: [{ + buttonModel: {}, + }], position: { X: 'left', Y: 'top' }, cssClass: 'e-bookmark-popup', beforeClose: function () { + isBookmarkOpen = false; + } +}); +bookmarkPopup.appendTo('#popup'); +textSearchPopup = new ej.popups.Dialog({ + showCloseIcon: false, closeOnEscape: false, isModal: false, target: document.getElementById('pdfViewer'), + buttons: [{ + buttonModel: {}, + }], position: { X: 'right', Y: 'top' }, cssClass: 'e-text-search-popup', +}); +textSearchPopup.appendTo('#textSearchBox'); +var previousSearch = new ej.buttons.Button({ iconCss: 'e-pv-previous-search' }); +previousSearch.appendTo('#previousSearch'); +var nextSearch = new ej.buttons.Button({ iconCss: 'e-pv-next-search-btn' }); +nextSearch.appendTo('#nextSearch'); +var matchCaseCheck = new ej.buttons.CheckBox({ label: 'Match case', change: checkBoxChanged }); +matchCaseCheck.appendTo('#matchCase'); +viewer.pageChange = function (args) { + currentPageBox.value = viewer.currentPageNumber.toString(); + updatePageNavigation(); +}; +viewer.documentLoad = function (args) { + + document.getElementById('totalPage').textContent = 'of ' + viewer.pageCount; + updatePageNavigation(); +}; +searchButton = document.getElementById('searchBtn'); +searchInput.addEventListener('focus', function () { searchInput.parentElement.classList.add('e-input-focus'); }); +searchInput.addEventListener('blur', function () { searchInput.parentElement.classList.remove('e-input-focus'); }); +searchInput.addEventListener('keypress', searchInputKeypressed); +document.getElementById('previousSearch').addEventListener('click', previousSearchClicked); +document.getElementById('nextSearch').addEventListener('click', nextSearchClicked); +searchButton.addEventListener('click', searchClickHandler); +currentPageBox.addEventListener('keypress', onCurrentPageBoxKeypress); +currentPageBox.addEventListener('click', onCurrentPageBoxClicked); +bookmarkPopup.hide(); +textSearchPopup.hide(); +enableNextButton(false); +enablePrevButton(false); + +``` +{% endhighlight %} +{% endtabs %} + +Sample : +[https://document.syncfusion.com/demos/pdf-viewer/javascript-es5/#/tailwind3/pdfviewer/custom-toolbar.html](https://document.syncfusion.com/demos/pdf-viewer/javascript-es5/#/tailwind3/pdfviewer/custom-toolbar.html) + +## See also + +* [Feature Modules](../feature-module) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/form-designer-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/form-designer-toolbar-customization.md new file mode 100644 index 000000000..fb07b7ded --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/form-designer-toolbar-customization.md @@ -0,0 +1,119 @@ +--- +layout: post +title: Form Designer Toolbar Customization in JavaScript PDF Viewer Component | Syncfusion +description: Learn here all about form designer toolbar customization in Syncfusion JavaScript PDF Viewer component of Syncfusion Essential JS 2 and more. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Form Designer Toolbar Customization + +The form designer toolbar can be customized by showing or hiding default items and by controlling the order in which the items appear. + +## Show or hide the form designer toolbar + +Show or hide the form designer toolbar programmatically during initialization or at runtime. + +Use the [EnableFormDesigner](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/pdfViewerModel/#enableformdesigner) property or the [showFormDesignerToolbar](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbar/#showformdesignertoolbar) method to toggle visibility. + +The following code snippet explains how to show or hide the toolbar using the `EnableFormDesigner` property. + +{% tabs %} +{% highlight js tabtitle="index.js" %} + +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, + ej.pdfviewer.Annotation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, + ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.FormFields, ej.pdfviewer.FormDesigner +); + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + enableFormDesigner: false, + documentPath: 'https://cdn.syncfusion.com/content/pdf/formdesigner.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib' +}); + +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + + +{% endhighlight %} +{% endtabs %} + +## How to customize the form designer toolbar + +Choose which tools appear and control their order in the form designer toolbar. + +Use [`PdfViewerToolbarSettings`](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbarSettings/) with the [`FormDesignerToolbarItems`](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbarSettings/#formdesignertoolbaritems) property to choose which form design tools are available. The property accepts a list of [`FormDesignerToolbarItem`](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/formDesignerToolbarItem/) values. The items you include are both displayed and rendered in the order listed; any items you omit are hidden. This provides a streamlined, user-friendly form design experience across devices. + +The following example demonstrates how to customize the form designer toolbar by configuring specific tools using `FormDesignerToolbarItem`. + +{% tabs %} +{% highlight js tabtitle="index.js" %} + +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, + ej.pdfviewer.Annotation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, + ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, + ej.pdfviewer.FormFields, ej.pdfviewer.FormDesigner); + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/formdesigner.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib' +}); + +pdfviewer.toolbarSettings = { + formDesignerToolbarItems: [ + "TextboxTool", + "PasswordTool", + "CheckBoxTool", + "RadioButtonTool", + "DropdownTool", + "ListboxTool", + "DrawSignatureTool", + "DeleteTool" + ] +}; + +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + + +{% endhighlight %} +{% endtabs %} diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/mobile-toolbar.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/mobile-toolbar.md similarity index 53% rename from Document-Processing/PDF/PDF-Viewer/javascript-es5/mobile-toolbar.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/mobile-toolbar.md index 8fe1e99b3..a7ca21741 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/mobile-toolbar.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/mobile-toolbar.md @@ -1,21 +1,21 @@ --- layout: post -title: Mobile Toolbar Interface in Javascript Pdfviewer control | Syncfusion -description: Learn All About the Mobile Toolbar Interface in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Mobile Toolbar Interface in Javascript PDF Viewer control | Syncfusion +description: Learn All About the Mobile Toolbar Interface in Syncfusion Javascript PDF Viewer control of Syncfusion Essential JS 2 and more. platform: document-processing control: Mobile Toolbar Interface publishingplatform: Javascript documentation: ug domainurl: ##DomainURL## --- -# Mobile Toolbar Interface in Javascript Pdfviewer control +# Mobile Toolbar Interface in Javascript PDF Viewer control The Mobile PDF Viewer offers a variety of features for viewing, searching, annotating, and managing PDF documents on mobile devices. It includes essential tools like search, download, bookmarking, annotation, and page organization. Users also have the option to enable desktop toolbar features in mobile mode, providing a more extensive set of actions. ## Mobile Mode Toolbar Configuration In mobile mode, the toolbar is optimized for ease of use on small screens, presenting users with the most common actions for interacting with a PDF document. Below are the key features available in mobile mode: -![Mobile toolbar with primary PDF interaction options](./images/mobileToolbar.png) +![Mobile toolbar with primary PDF interaction options](../images/mobileToolbar.png) ### Main Toolbar Options: @@ -23,17 +23,17 @@ In mobile mode, the toolbar is optimized for ease of use on small screens, prese **SearchOption:** Access the search bar to find text within the document. -![Search bar displayed for finding text within a PDF](./images/searchOption.png) +![Search bar displayed for finding text within a PDF](../images/searchOption.png) **UndoRedoTool:** Quickly undo or redo any annotations made. **OrganizePagesTool:** Enable or disable page organization features to modify document pages. -![Page organization interface for modifying PDF pages](./images/organizePages.png) +![Page organization interface for modifying PDF pages](../images/organizePages.png) **AnnotationEditTool:** Activate or deactivate annotation editing to add or modify annotations. -![Annotation editing toolbar allowing users to add, edit, or delete annotations on a PDF](./images/editAnnotation.png) +![Annotation editing toolbar allowing users to add, edit, or delete annotations on a PDF](../images/editAnnotation.png) N> In mobile mode, the annotation toolbar is conveniently displayed at the bottom of the viewer. @@ -45,7 +45,7 @@ When you open the "more options" menu, you will see additional actions such as: **BookmarkOption:** Allows you to view bookmarks within the document. -![More options menu showing additional actions like download and bookmark](./images/more-options.png) +![More options menu showing additional actions like download and bookmark](../images/more-options.png) ## Enabling Desktop Mode in Mobile @@ -58,27 +58,37 @@ The desktop version of the toolbar can be enabled on mobile devices by using the **Step 2:** This will replace the mobile toolbar with the desktop toolbar layout, allowing access to more actions and controls. {% tabs %} -{% highlight ts tabtitle="Standalone" %} +{% highlight js tabtitle="Standalone" %} var pdfviewer = new ej.pdfviewer.PdfViewer({ - documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", - enableDesktopMode : true - }); -ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, - ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); + documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", + enableDesktopMode : true +}); + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, + ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} -{% highlight ts tabtitle="Server-Backed" %} +{% highlight js tabtitle="Server-Backed" %} var pdfviewer = new ej.pdfviewer.PdfViewer({ - documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer', - enableDesktopMode : true - }); -ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, - ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); + documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", + serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer', + enableDesktopMode : true +}); + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, + ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} @@ -89,29 +99,38 @@ pdfviewer.appendTo('#PdfViewer'); To ensure smooth scrolling of PDF documents on a mobile device in desktop mode, it is important to enable touch gesture scrolling. You can achieve this by setting the `enableTextSelection` option to **false**. {% tabs %} -{% highlight ts tabtitle="Standalone" %} +{% highlight js tabtitle="Standalone" %} var pdfviewer = new ej.pdfviewer.PdfViewer({ - documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - resourceUrl : "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib", - enableDesktopMode : true, - enableTextSelection : false - }); -ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, - ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); + documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", + resourceUrl : "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib", + enableDesktopMode : true, + enableTextSelection : false +}); +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, + ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} -{% highlight ts tabtitle="Server-Backed" %} +{% highlight js tabtitle="Server-Backed" %} var pdfviewer = new ej.pdfviewer.PdfViewer({ - documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", - serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer', - enableDesktopMode : true, - enableTextSelection : false - }); -ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar, - ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer); + documentPath: "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf", + serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer', + enableDesktopMode : true, + enableTextSelection : false +}); + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, + ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer +); + pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/primary-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/primary-toolbar-customization.md new file mode 100644 index 000000000..f6134c8cf --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/primary-toolbar-customization.md @@ -0,0 +1,101 @@ +--- +layout: post +title: Primary Toolbar Customization in JavaScript PDF Viewer Component | Syncfusion +description: Learn here all about primary toolbar customization in Syncfusion JavaScript PDF Viewer component of Syncfusion Essential JS 2 and more. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Primary Toolbar Customization in PDF Viewer Control + +The primary toolbar of the PDF Viewer can be customized by rearranging existing items, disabling default items, and adding custom items. New items can be placed at specific index positions among the existing items. + +## Show or hide the primary toolbar + +Toggle the built-in primary toolbar to create custom toolbar experiences or simplify the UI. In scenarios where a custom toolbar is required, the built-in toolbar can be hidden. Use the [enableToolbar](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/pdfViewerModel/#enabletoolbar) property or the [showToolbar](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbar/#showtoolbar) method to show or hide the primary toolbar. + +Show or hide the toolbar using the `enableToolbar` property: + +{% tabs %} +{% highlight js tabtitle="index.js" %} + +ej.pdfviewer.PdfViewer.Inject( + ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.Annotation, + ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, ej.pdfviewer.TextSelection, + ej.pdfviewer.TextSearch, ej.pdfviewer.FormFields, ej.pdfviewer.FormDesigner +); + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + enableToolbar: false, + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib' +}); +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + + + + + Essential JS 2 + + + + + + +
    +
    +
    +
    + + + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to show or hide the toolbar using the `showToolbar` method. + +{% tabs %} +{% highlight js tabtitle="index.js" %} + +ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, + ej.pdfviewer.Annotation, ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView, + ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.FormFields, ej.pdfviewer.FormDesigner +); + +var pdfviewer = new ej.pdfviewer.PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib' +}); +pdfviewer.appendTo('#PdfViewer'); +document.getElementById('set').addEventListener('click', function () { + pdfviewer.toolbar.showToolbar(false); +}); + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + + + + + Essential JS 2 + + + + + + + +
    +
    +
    +
    + + + +{% endhighlight %} +{% endtabs %} diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar.md index 424585783..b534d4eca 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar.md @@ -3,8 +3,7 @@ layout: post title: Toolbar in Javascript Pdfviewer control | Syncfusion description: Learn here all about Toolbar in Syncfusion Javascript Pdfviewer control of Syncfusion Essential JS 2 and more. platform: document-processing -control: Toolbar -publishingplatform: Javascript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/troubleshooting/content-security-policy.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/troubleshooting/content-security-policy.md index 431523400..7ffb02cbc 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/troubleshooting/content-security-policy.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/troubleshooting/content-security-policy.md @@ -1,20 +1,19 @@ --- layout: post -title: Content Security Policy in Javascript Common control | Syncfusion -description: Learn here all about Content Security Policy in Syncfusion Javascript Common control of Syncfusion Essential JS 2 and more. +title: Content Security Policy in JavaScript PDF Viewer control | Syncfusion +description: Learn how to configure Content Security Policy directives for the Syncfusion JavaScript PDF Viewer control to allow required resources. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug --- -# Content Security Policy +# Content Security Policy in JavaScript PDF Viewer -Content Security Policy (CSP) is a security feature implemented by web browsers that helps to protect against attacks such as cross-site scripting (XSS) and data injection. It limits the sources from which content can be loaded on a web page. +Content Security Policy (CSP) is a browser security feature that helps mitigate attacks such as cross-site scripting (XSS) and data injection by restricting the sources from which content can load. -To enable strict [Content Security Policy (CSP)](https://csp.withgoogle.com/docs/strict-csp.html), certain browser features are disabled by default. In order to use Syncfusion PDF Viewer control with strict CSP mode, it is essential to include following directives in the CSP meta tag. +When strict [Content Security Policy (CSP)](https://csp.withgoogle.com/docs/strict-csp.html) is enabled, several browser capabilities are disabled by default. To run the Syncfusion PDF Viewer control under strict CSP, include the following directives in the CSP meta tag. -* Syncfusion PDF Viewer control are rendered with calculated **inline styles** and **base64** font icons, which are blocked on a strict CSP-enabled site. To allow them, add the [`style-src 'self' 'unsafe-inline';`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/style-src) and [`font-src 'self' data:;`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/font-src) directives in the meta tag as follows. +* The Syncfusion PDF Viewer control renders calculated **inline styles** and **base64** font icons, which strict CSP blocks. Allow these assets by adding the [`style-src 'self' 'unsafe-inline';`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/style-src) and [`font-src 'self' data:;`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/font-src) directives, as shown below. {% tabs %} {% highlight razor tabtitle="HTML" %} @@ -26,9 +25,9 @@ To enable strict [Content Security Policy (CSP)](https://csp.withgoogle.com/docs {% endhighlight %} {% endtabs %} -* Syncfusion **material** and **tailwind** built-in themes contain a reference to the [`Roboto’s external font`](https://fonts.googleapis.com/css?family=Roboto:400,500), which is also blocked. To allow them, add the [`external font`](https://fonts.googleapis.com/css?family=Roboto:400,500) reference to the [`style-src`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/style-src) and [`font-src`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/font-src) directives in the above meta tag. +* The Syncfusion **material** and **tailwind** built-in themes reference the [`Roboto external font`](https://fonts.googleapis.com/css?family=Roboto:400,500), which strict CSP also blocks. Permit these resources by adding the font URLs to the [`style-src`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/style-src) and [`font-src`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/font-src) directives in the meta tag. -The resultant meta tag is included within the `` tag and resolves the CSP violation on the application's side when utilizing Syncfusion PDF Viewer control with material and tailwind themes. +The resulting meta tag must be placed within the `` element to resolve CSP violations when using the Syncfusion PDF Viewer control with the material and tailwind themes. {% tabs %} {% highlight razor tabtitle="HTML" %} @@ -43,7 +42,7 @@ The resultant meta tag is included within the `` tag and resolves the CSP {% endhighlight %} {% endtabs %} -* Syncfusion PDF Viewer control when images are added as **blob** and **base64**, which are blocked on a strict CSP-enabled site.To overcome this restriction, it is necessary to add the img-src data: directive in the meta tag. To allow them, add the [`style-src 'self' 'unsafe-inline';`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/style-src) and [`img-src 'self' data:;`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/img-src) directives as follows. +* The Syncfusion PDF Viewer control can render images as **blob** and **base64** sources, which strict CSP blocks. To permit these formats, include the [`style-src 'self' 'unsafe-inline';`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/style-src) and [`img-src 'self' data:;`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/img-src) directives in the meta tag, as illustrated below. {% tabs %} {% highlight razor tabtitle="HTML" %} @@ -57,6 +56,6 @@ The resultant meta tag is included within the `` tag and resolves the CSP {% endhighlight %} {% endtabs %} -N> From the release 2023 Vol2 - 22.1 version, the Content Security Policy for Syncfusion PDF Viewer control has been enhanced by implementing a [function template](../template#function-template) approach for template properties to eliminate the usage of the `unsafe-eval` directive in the CSP meta tag. +N> Starting with the 2023 Vol 2 (v22.1) release, the Content Security Policy for the Syncfusion PDF Viewer control has been improved by using a [function template](../template#function-template) approach for template properties, eliminating the need for the `unsafe-eval` directive in the CSP meta tag. -[View sample in GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/Troubleshooting/Content%20Security%20Policy) \ No newline at end of file +[View the sample on GitHub](https://github.com/SyncfusionExamples/javascript-pdf-viewer-examples/tree/master/Troubleshooting/Content%20Security%20Policy) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/troubleshooting/document-loading-issues.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/troubleshooting/document-loading-issues.md index c6fe9c2e5..dae31e31e 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/troubleshooting/document-loading-issues.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/troubleshooting/document-loading-issues.md @@ -1,18 +1,17 @@ --- layout: post -title: Document Loading Issues in Version 23.1 or Newer Javascript Pdfviewer Component -description: Learn here all about troubleshooting Document Loading Issues in Version 23.1 or newer in Javascript Pdfviewer of Syncfusion Essential JS 2 and more. +title: Fix document loading issues in v23.1+ for the JavaScript PDF Viewer component +description: Resolve document rendering failures in v23.1 or newer by calling dataBind before load, verifying source URLs, checking CORS and CSP, and confirming network connectivity in the JavaScript PDF Viewer. platform: document-processing control: PDF Viewer -publishingplatform: Javascript documentation: ug --- # Document Loading Issues in Version 23.1 or Newer -If you're experiencing problems with your document not rendering in the viewer, especially when using version 23.1 or a newer version, follow these troubleshooting steps to resolve the issue: +If the document does not render in the viewer when using version 23.1 or newer, follow these steps: -1. **Check for `viewer.dataBind()` Requirement**: Ensure that you have called `viewer.dataBind()` as required in version 23.1 or newer. This explicit call is essential for initializing data binding and document rendering correctly. It is must to call the dataBind() method before load. +1. Call `pdfviewer.dataBind()` before `load()`. Starting with v23.1, an explicit dataBind call is required to initialize data binding and render correctly. ```javascript var viewer = new ej.pdfviewer.PdfViewer ({ @@ -25,18 +24,12 @@ viewer.dataBind(); viewer.load('https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', null); ``` -2. **Verify Document Source**: Confirm that the document source or URL you're trying to display is valid and accessible. Incorrect URLs or document paths can lead to loading issues. +2. Verify the document source. Ensure the URL or path is valid and accessible. +3. Check network connectivity. The viewer cannot fetch the document without a stable connection. +4. Inspect console errors. Use browser developer tools to identify issues. +5. Validate the initialization order. Initialize the viewer, call `dataBind()`, then call `load()`. +6. Update to the latest viewer version. Issues may be resolved in newer releases. +7. Configure CORS correctly for cross-domain documents. +8. Review Content Security Policy (CSP) settings. Ensure external resources are permitted. See the Content Security Policy troubleshooting guide in the Syncfusion documentation for details. -3. **Network Connectivity**: Ensure that your application has a stable network connection. Document rendering may fail if the viewer can't fetch the document due to network issues. - -4. **Console Errors**: Use your browser's developer tools to check for any error messages or warnings in the console. These messages can provide insights into what's causing the document not to load. - -5. **Loading Sequence**: Make sure that you're calling `viewer.dataBind()` and initiating document loading in the correct sequence. The viewer should be properly initialized before attempting to load a document. - -7. **Update Viewer**: Ensure that you're using the latest version of the viewer library or framework. Sometimes, issues related to document loading are resolved in newer releases. - -8. **Cross-Origin Resource Sharing (CORS)**: If you're loading documents from a different domain, ensure that CORS headers are correctly configured to allow cross-origin requests. - -9. **Content Security Policies (CSP)**: Check if your application's Content Security Policy allows the loading of external resources, as this can affect document loading. Refer [here](https://ej2.syncfusion.com/javascript/documentation/common/troubleshoot/content-security-policy) to troubleshoot. - -By following these troubleshooting steps, you should be able to address issues related to document loading in version 23.1 or newer, ensuring that your documents render correctly in the viewer. \ No newline at end of file +Following this checklist typically resolves document loading issues in v23.1 or newer.

    H{oM3{;5)bqRYs# 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