From 4b2f597e126a9a3d73947d40a78cc2fa17b63a0d Mon Sep 17 00:00:00 2001 From: Hemaprasanth-Hari Date: Thu, 9 Jul 2026 10:32:27 +0530 Subject: [PATCH 1/2] 1039164: Resolve Documentation Issues for Blazor PDF Viewer - Document Handling --- .../document-handling/load-large-pdf.md | 46 +++-- .../document-handling/load-password-pdf.md | 73 ++++--- .../document-handling/preprocess-pdf.md | 34 ++-- .../retrieve-viewer-instance.md | 179 ++++++++++++------ .../document-security/password-protected.md | 64 +++++-- .../blazor/document-security/permission.md | 104 ++++++++-- .../PDF/PDF-Viewer/blazor/images/open-pdf.png | Bin 0 -> 48984 bytes .../blazor/images/password-popup.png | Bin 0 -> 44540 bytes 8 files changed, 346 insertions(+), 154 deletions(-) create mode 100644 Document-Processing/PDF/PDF-Viewer/blazor/images/open-pdf.png create mode 100644 Document-Processing/PDF/PDF-Viewer/blazor/images/password-popup.png diff --git a/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/load-large-pdf.md b/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/load-large-pdf.md index aaa24a3bfb..69eeb74356 100644 --- a/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/load-large-pdf.md +++ b/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/load-large-pdf.md @@ -10,7 +10,7 @@ domainurl: ##DomainURL## # Load Large PDF Files in Blazor PDF Viewer -This section explains how to load and render **large PDF files (up to approximately 1 GB)** efficiently using the Syncfusion Blazor PDF Viewer. It also covers the recommended configurations required to achieve stable and responsive performance while working with large documents. +This section explains how to load and render **large PDF files (up to approximately 1 GB)** efficiently using the Blazor PDF Viewer. It also covers the recommended configurations required to achieve stable and responsive performance while working with large documents. ## Why Large PDFs Require Special Handling @@ -35,8 +35,6 @@ With proper configuration, the Blazor PDF Viewer can: N> Large PDF support depends on enabling chunk-based processing (refer [EnableChunkMessages](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerBase.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerBase_EnableChunkMessages)) and proper server configuration. The actual supported size may vary based on browser memory limits, server settings, and system resources. ---- - ## Best Practices for Loading Large PDFs ### 1. Enable Chunk‑Based Processing @@ -45,7 +43,7 @@ Chunk-based processing is **mandatory** for loading large PDF files in the Blazo Refer to the following FAQ to configure chunk-based processing: -- [How to process Larges files using EnableChunkMessages](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/faqs/how-to-processing-large-files-without-increasing-maximum-message-size) +- [How to process Large files using EnableChunkMessages](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/faqs/how-to-process-large-files-without-increasing-maximum-message-size) Ensure that: @@ -53,29 +51,38 @@ Ensure that: - Chunk processing is enabled as documented - Connection buffer limits are configured correctly -### 2. Load Large PDFs Using `DocumentPath` +### 2. Load Large PDFs Using DocumentPath -For large documents, it is recommended to load the PDF using the [DocumentPath](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerBase.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerBase_DocumentPath) property. +For large documents, it is recommended to load the PDF using the [DocumentPath](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerBase.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerBase_DocumentPath) property. The `DocumentPath` approach is preferred over base64 or byte-array inputs because the latter require the entire file to be held in client memory, which is impractical for files approaching 1 GB. Using `DocumentPath` helps: - Initiate chunk-based requests immediately -- Avoid loading the entire document into memory +- Avoid buffering the entire file in client memory - Improve stability and loading behavior for large files This approach is suitable for PDFs hosted on servers, secured APIs, or cloud storage endpoints. ---- +Example usage: + +```razor +@using Syncfusion.Blazor.SfPdfViewer + + +``` ### 3. Optimize Network and Performance Configuration -Proper network configuration plays a critical role in rendering large PDFs. +Proper network configuration plays a critical role in rendering large PDFs. The two most impactful settings are connection buffer size and CDN-hosted assets. #### Increase Connection Buffer Size Configuring a sufficient connection buffer size helps prevent interruptions while loading large documents: -- [How to increase connection Buffer size](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/faqs/how-to-increase-connection-buffer-size) +- [How to increase connection buffer size](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/faqs/how-to-increase-connection-buffer-size) #### Use CDN for Improved Performance @@ -83,21 +90,22 @@ Using CDN resources reduces script download time and improves viewer initializat - [How to improve performance using CDN](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/faqs/how-to-improve-performance-using-cdn) ---- - ### 4. Reduce System Resource Load Rendering large PDF files also depends on available system resources. -For the best experience: +For the best experience, follow these steps: + +1. Close unused applications. +2. Minimize open browser tabs. +3. Avoid running multiple heavy tasks in parallel. +4. Avoid opening multiple large PDFs at the same time. +5. Verify that adequate system memory and CPU are available before loading the file. -- Close unused applications -- Minimize open browser tabs -- Avoid running multiple heavy tasks in parallel -- Do not open multiple large PDFs at the same time +N> Explore the sample projects available on [Load and View large PDF files](https://github.com/SyncfusionExamples/blazor-pdf-viewer-examples/tree/master/Load%20and%20View%20Large%20Files) -Ensuring adequate system memory and CPU availability helps maintain smooth rendering and interaction. ## See Also -- [Load and Save Sample](https://github.com/SyncfusionExamples/blazor-pdf-viewer-examples/tree/master/Load%20and%20Save) \ No newline at end of file +- [Load a Password-Protected PDF](./load-password-pdf) +- [Getting started with SfPdfViewer in a Blazor Web App](../getting-started/web-app) diff --git a/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/load-password-pdf.md b/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/load-password-pdf.md index e3eb1ac5ed..7d27f5ae2d 100644 --- a/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/load-password-pdf.md +++ b/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/load-password-pdf.md @@ -10,63 +10,73 @@ domainurl: ##DomainURL## # Load a Password-Protected PDF in Blazor -This article explains how to open password-protected PDF files in the Syncfusion Blazor PDF Viewer. The viewer supports both user‑interactive loading (Open File dialog) and programmatic loading using APIs. +This article explains how to open password-protected PDF files in the Blazor PDF Viewer. The viewer supports both user-interactive loading (the built-in **Open File** dialog) and programmatic loading using APIs. + ## 1. Opening a Password-Protected PDF Using the **Open File** Dialog -When the user selects a password-protected PDF using the built‑in **Open File** option: +When the user clicks the built-in **Open File** button in the PDF Viewer toolbar and selects a password-protected PDF: -- The viewer detects that the document is encrypted +- The viewer detects that the document is encrypted on the server side -![Open PDF Document](../../react/images/open-pdf.png) +![Open PDF Document](../images/open-pdf.png) - A **password input popup** is automatically displayed -![Password Protected Pop-up](../../react/images/password-popup.png) +![Password Protected Pop-up](../images/password-popup.png) - The user enters the password - - The document is decrypted and loaded -No additional configuration or code is required. - -This approach works for all password-protected PDFs opened locally by the user. +No additional configuration or code is required. This approach works for all password-protected PDFs opened locally by the user. ## 2. Opening a Password-Protected PDF Programmatically -If you load a password-protected PDF from a URL or through custom logic, the viewer provides two behaviors depending on how the file is loaded. +Use the programmatic APIs when the password is known in advance or when the document is hosted on a server. The viewer supports both the `LoadAsync` overloads and the `DocumentPath` property. + +### 2.1 Load the Document Using `LoadAsync` -### 2.1 Load the Document Using `LoadAsync(byte[] bytes, string password = null)` +The [`LoadAsync`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerBase.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerBase_LoadAsync_System_Byte___System_String_) method accepts a password parameter. The two supported overloads are: -You can directly pass the password in the [`load`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerBase.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerBase_LoadAsync_System_Byte___System_String_) method: +- `LoadAsync(byte[] bytes, string password = null)` — pass the PDF as a byte array +- `LoadAsync(string document, string password = null)` — pass a URL or server-relative path + +**Example (byte array):** ```cs -@using Syncfusion.Blazor.SfPdfViewer +@using Syncfusion.Blazor @using Syncfusion.Blazor.Buttons +@using Syncfusion.Blazor.SfPdfViewer -Load Document +Load Document -@code{ +@code { SfPdfViewer2 Viewer; - public async void clicked() + private async Task Clicked() { await Viewer.LoadAsync("wwwroot/pdf-succinctly-password-protected.pdf", "password"); } } ``` -- If the password is correct → the PDF loads immediately -- If the password is incorrect → the viewer displays the incorrect password popup -- If no password is provided → the password popup is shown automatically +N> The password parameter is consumed for the current load operation only and is not cached across re-renders. If the document is reloaded, supply the password again. + +**Outcomes** + +| Password state | Result | +|---|---| +| Correct | The PDF loads immediately | +| Incorrect | The viewer displays the incorrect password popup | +| Null or empty | The password popup is shown automatically | -This is useful when the password is known beforehand. +N> Handle incorrect-password events through the [`DocumentLoadFailed`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.DocumentLoadFailedEventArgs.html) event to surface custom error messages. -### 2.2 Loading a Password-Protected Document's URL Using `documentPath` +### 2.2 Loading a Password-Protected Document via `DocumentPath` -If the [`documentPath`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerBase.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerBase_DocumentPath) points to a password-protected PDF: +When the [`DocumentPath`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerBase.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerBase_DocumentPath) property points to a password-protected PDF, the viewer detects the encryption and prompts the user for the password automatically. ```cs @using Syncfusion.Blazor @@ -78,18 +88,25 @@ If the [`documentPath`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor. @code { - //Load URL for Passwrod-Protected Document in DocumentPath - public string DocumentPath { get; set; } = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; + // URL for the password-protected sample document + public string DocumentPath { get; set; } = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly-password-protected.pdf"; } ``` +N> Do not pass the password as a query string inside `DocumentPath`. + The viewer will: -- Detect encryption +- Detect encryption on the server - Show the **password popup automatically** - Allow the user to enter the correct password -- Then load the PDF +- Decrypt and load the PDF + +![Password Protected Pop-up](../images/password-popup.png) + +N> Explore the sample projects available on [Load and View Password-Protected PDFs](https://github.com/SyncfusionExamples/blazor-pdf-viewer-examples/tree/master/Load%20and%20View%20Password-Protected%20Files) -![Password Protected Pop-up](../../react/images/password-popup.png) +## See Also -N> No password should be passed inside `documentPath`. \ No newline at end of file +- [Load Large PDF Files](./load-large-pdf) +- [Getting started with SfPdfViewer in a Blazor Web App](../getting-started/web-app) diff --git a/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/preprocess-pdf.md b/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/preprocess-pdf.md index 3f6a2106e4..907d1db116 100644 --- a/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/preprocess-pdf.md +++ b/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/preprocess-pdf.md @@ -10,17 +10,17 @@ domainurl: ##DomainURL## # Pre-process PDF Document Before Displaying in Blazor PDF Viewer -This section explains why preprocessing is useful, what operations you can perform using the Syncfusion PDF Library and Blazor PDF Viewer, and how to load the processed document in the Blazor PDF Viewer. +This section explains why preprocessing is useful, what operations you can perform using the Syncfusion® PDF Library and Blazor PDF Viewer, and how to load the processed document in the Blazor PDF Viewer. ## Why Preprocessing Is Needed Preprocessing a PDF before sending it to the viewer helps you: -- Reduce file size and improve load time -- Merge multiple documents into one -- Extract only required pages for faster loading -- Flatten form fields and annotations for performance & security -- Apply branding elements such as watermarks or stamps +- **Reduce file size** — Compresses content to improve load time. +- **Merge multiple documents** — Combine several PDFs into a single file. +- **Extract only required pages** — Drop unused pages for faster loading. +- **Flatten form fields and annotations** — Improves rendering performance and prevents further editing. +- **Apply branding elements** — Such as watermarks or stamps. -These enhancements ensure a better, faster, and more controlled viewing experience. +Each enhancement maps directly to a measurable improvement in load time, rendering speed, or document control. ## Merge PDF Documents ### UI-Level Merging @@ -31,11 +31,11 @@ You can visually merge pages in the **Organize Pages** UI inside the Blazor PDF For more details, refer to [UI Interactions - Import Pages](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/organize-pages/ui-interactions#import-pages). ### Programmatically Merge PDFs -Using the Syncfusion PDF Viewer, you can merge documents before loading them into the viewer. +Using the Blazor PDF Viewer, you can merge documents before loading them into the viewer. For more details, refer to [Programmatic Support - Import Pages](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/organize-pages/programmatic-support#import-pages). -N> You can then load the merged PDF into the viewer using a file path or stream. +N> You can then load the merged PDF into the viewer using a file path, stream, or byte array. ## Extract Pages ### UI-Level Extraction @@ -60,7 +60,7 @@ For more details, refer to [Programmatic Support - Export Pages](https://help.sy Use the following code-snippet when you want uploaded PDFs to be flattened before they are loaded into the viewer. -```cs +```csharp @page "/" @using Syncfusion.Blazor @using Syncfusion.Blazor.SfPdfViewer @@ -68,7 +68,7 @@ Use the following code-snippet when you want uploaded PDFs to be flattened befor @using Syncfusion.Pdf.Parsing -@code{ +@code { private SfPdfViewer2? Viewer; async Task OnCreated() { @@ -111,6 +111,8 @@ The Blazor PDF Viewer toolbar allows users to: ### Programmatically Add a Watermark +The following example loads an existing PDF, draws a watermark image on every page using `PdfGraphics`, and then reloads the result into the viewer. The image is loaded from a file in `wwwroot` and converted to a `byte[]` — the recommended approach over hard-coding base64. + ```csharp @page "/" @using Syncfusion.Blazor @@ -171,21 +173,25 @@ You can load the processed PDF using a remote URL, stream, or byte array and bas ### Load From Remote URL -Refer to the Syncfusion Blazor PDF Viewer documentation for loading PDF from Remote URL. For more details, visit [Load PDF Document from Remote URL](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/opening-pdf-file#opening-a-pdf-from-remote-url). +Refer to the Blazor PDF Viewer documentation for loading PDF from Remote URL. For more details, visit [Load PDF Document from Remote URL](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/opening-pdf-file#opening-a-pdf-from-remote-url). https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/opening-pdf-file#opening-a-pdf-from-remote-url ### Load Using Stream or Byte Array -Refer to the Syncfusion Blazor PDF Viewer documentation for loading PDF from stream or byte array. For more details, visit [Load PDF Document from Stream](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/opening-pdf-file#opening-a-pdf-from-stream). +Refer to the Blazor PDF Viewer documentation for loading PDF from stream or byte array. For more details, visit [Load PDF Document from Stream](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/opening-pdf-file#opening-a-pdf-from-stream). ### Load Using base64 Data -Refer to the Syncfusion Blazor PDF Viewer documentation for loading PDF from base64 data. For more details, visit [Load PDF Document from base64 Data](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/opening-pdf-file#opening-a-pdf-from-base64-data). +Refer to the Blazor PDF Viewer documentation for loading PDF from base64 data. For more details, visit [Load PDF Document from base64 Data](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/opening-pdf-file#opening-a-pdf-from-base64-data). ## Additional Performance Tips - **Render Multiple Pages While Scrolling:** Improve performance by rendering multiple pages during scrolling. For more details, refer to [How to render N pages while scrolling](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/faqs/how-to-render-n-pages-scrolling). - **Improve Performance Using CDN:** Enhance viewer performance using a Content Delivery Network. For more details, refer to [How to improve performance using CDN](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/faqs/how-to-improve-performance-using-cdn). +## See Also +- [Load Large PDF Files](./load-large-pdf) +- [Load a Password-Protected PDF](./load-password-pdf) +- [Getting started with SfPdfViewer in a Blazor Web App](../getting-started/web-app) diff --git a/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/retrieve-viewer-instance.md b/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/retrieve-viewer-instance.md index 454bc29fd6..5ca16cbe58 100644 --- a/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/retrieve-viewer-instance.md +++ b/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/retrieve-viewer-instance.md @@ -11,41 +11,39 @@ domainurl: ##DomainURL## This page explains how to access the PDF Viewer instance in the Blazor PDF Viewer using Blazor component references, listen for the [DocumentLoaded](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerEvents.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerEvents_DocumentLoaded) event, and retrieve document information, page details, and metadata—so you can safely invoke viewer APIs after the PDF document is loaded. -## Explanation: Why access the PDF Viewer instance? +## Why Access the PDF Viewer Instance -- The viewer instance (via **Blazor component reference**) gives you a stable handle to call APIs such as [`Zoom`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/magnification), [`Print`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/print), [`Download`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/saving-pdf-file#download), and [`Navigation`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/navigation). +- The viewer instance (via **Blazor component reference**) gives you a stable handle to call APIs such as [`ZoomAsync`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/magnification), [`PrintAsync`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/print), [`DownloadAsync`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/saving-pdf-file#download), and [`GoToPageAsync`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/navigation). - The **Created event** fires when the PDF Viewer component is rendered and initialized in the DOM. -- The **DocumentLoaded event** (fires after the PDF document is fully loaded and parsed) is the correct moment to read **document information** (Document Name, page count) and **page metrics**, and to trigger post‑load UI logic. Use [DocumentLoaded](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerEvents.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerEvents_DocumentLoaded) event to access document details after successful load, and [DocumentLoadFailed](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerEvents.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerEvents_DocumentLoadFailed) to handle load failures. -- Accessing the instance too early (before load completes) may cause null/undefined errors or incomplete information. +- The **DocumentLoaded event** (fires after the PDF document is fully loaded and parsed) is the correct moment to read **document information** (Document Name, page count) and **page metrics**, and to trigger post-load UI logic. Use the [DocumentLoaded](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerEvents.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerEvents_DocumentLoaded) event to access document details after a successful load, and the [DocumentLoadFailed](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerEvents.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerEvents_DocumentLoadFailed) event to handle load failures. +- Accessing the instance too early (before load completes) may cause null-reference errors or incomplete information. -## Reference: What you can access/call after load +## What You Can Access and Call After Load -After the PDF is loaded you can: +After the PDF is loaded, you can: -- **Read document information**: title, author, subject, keywords (metadata), page count. -- **Read page details**: total pages, current page, page size(s). -- **Call Viewer APIs** (typical examples): - - **[Zoom](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/magnification) / Fit**: `ZoomTo(125)`; fit to page/width - - **[Navigation](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/navigation)**: go to a specific page - - **[Interactions](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/interaction)**: Enable selection mode and panning - - **Export**: [Download()](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/saving-pdf-file#download), [Print()](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/print). +- **Read document information**: title, author, subject, keywords, and page count. +- **Read page details**: total pages, current page, and page size. +- **Call Viewer APIs**, for example: + - **[Zoom](../magnification)**: `ZoomAsync(zoomPercentage)`. Valid range: 50–400. + - **[Navigation](../interactive-pdf-navigation-overview)**: `GoToPageAsync(pageIndex)` where `pageIndex` is 1-based. + - **[Interactions](../interaction)**: enable selection mode, panning, and other interaction modes. + - **Export**: [DownloadAsync()](../saving-pdf-file#download) and [PrintAsync()](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/print). Both methods take no parameters and return `Task`. -N> The **[Created event](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerEvents.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerEvents_Created)** triggers when the PDF Viewer component is rendered in the DOM. The **[DocumentLoaded event](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerEvents.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerEvents_DocumentLoaded)** triggers when the document is successfully loaded and parsed. Always invoke viewer APIs after the `DocumentLoaded` event fires to ensure document information is available, or from user actions that occur after load. Guard calls with null checks or readiness flags. +N> The [Created](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerEvents.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerEvents_Created) event triggers when the PDF Viewer component is rendered in the DOM. The [DocumentLoaded](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerEvents.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerEvents_DocumentLoaded) event triggers when the document is successfully loaded and parsed. -## How‑to: Get the instance with a ref and read details on load +## Get the Instance with a Ref and Read Details on Load -Below is a focused snippet showing: +The following example shows: 1) Creating a **component reference** for the viewer, -2) Wiring the **[Created](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerEvents.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerEvents_Created)** event for viewer initialization and the **[DocumentLoaded](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerEvents.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerEvents_DocumentLoaded)** event for document details, and -3) Reading basic **document info** (name and page count) from the **DocumentLoaded** event, then calling viewer APIs safely. +2) Wiring the [Created](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerEvents.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerEvents_Created) event for viewer initialization and the [DocumentLoaded](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerEvents.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerEvents_DocumentLoaded) event for document details, and +3) Reading basic **document info** (name and page count) from the `DocumentLoaded` event, then calling viewer APIs safely. -```cs +```csharp @page "/" @using Syncfusion.Blazor @using Syncfusion.Blazor.SfPdfViewer -@using Syncfusion.Pdf -@using Syncfusion.Pdf.Parsing
Document Info
@@ -55,7 +53,9 @@ Below is a focused snippet showing:
- +
@@ -63,24 +63,34 @@ Below is a focused snippet showing: private SfPdfViewer2? Viewer; + // DocumentInfo is a sample placeholder model. In a real project, + // place this class in a separate Models folder. private DocumentInfo Info = new(); private async Task OnCreated() { // Created event: Fires when the PDF Viewer component is rendered - await Viewer!.LoadAsync("wwwroot/pdf-succinctly.pdf"); + if (Viewer is null) return; + await Viewer.LoadAsync("wwwroot/pdf-succinctly.pdf"); } - private async Task OnDocumentLoaded(LoadEventArgs args) + private void OnDocumentLoaded(LoadEventArgs args) { // DocumentLoaded event: Fires when the document is successfully loaded Info = new DocumentInfo { Name = args.DocumentName, - PageCount = args.PageData.PageCount, + PageCount = args.PageCount, }; } + private void OnDocumentLoadFailed(FailureEventArgs args) + { + // DocumentLoadFailed event: Fires when document loading fails + Console.Error.WriteLine($"Failed to load document: {args.ErrorMessage}"); + // Handle the failure (for example, show a user-facing message) + } + class DocumentInfo { public string Name { get; set; } = ""; @@ -89,72 +99,117 @@ Below is a focused snippet showing: } ``` -**Notes** -- Use `SfPdfViewer2` component with `@ref` to get direct access to the viewer instance. -- **Created event** triggers when the PDF Viewer component is rendered. -- **DocumentLoaded event** triggers when the document is successfully loaded. Use this event to access document name, page count, and other document-specific details. -- Call methods directly on the viewer reference like `Viewer.ZoomAsync()`, `Viewer.GoToPageAsync()`, etc. +**Note:** Always null-check the `Viewer` reference before calling any viewer API. Methods such as `Viewer.ZoomAsync()`, `Viewer.GoToPageAsync()`, `Viewer.PrintAsync()`, and `Viewer.DownloadAsync()` are safe to invoke only after the `DocumentLoaded` event has fired or from a user action that occurs after load. -## Tutorial: End‑to‑End — Call Viewer APIs with TextBox Input +## End-to-End Example: Call Viewer APIs with TextBox Input -This example demonstrates how to use text input with buttons to interact with the loaded PDF viewer: +This example shows how to use text inputs with buttons to interact with the loaded PDF viewer, including reading document info, zooming, navigating, printing, and downloading. The viewer loads via the `DocumentPath` property, which is the recommended approach when the document URL is known at render time. (Use `LoadAsync` inside the `Created` event instead when the path is determined at runtime.) -```cs +```csharp @page "/" @using Syncfusion.Blazor.Buttons @using Syncfusion.Blazor.Inputs @using Syncfusion.Blazor.SfPdfViewer -
- +
+ Document Info
+ Name: @Info.Name
+ Pages: @Info.PageCount
-Zoom -
- +
+
+ +
+ Zoom + +
+ +
+ Go To Page + Print + Download
-Go To Page -Download -Print + @ref="@Viewer"> + + @code { - SfPdfViewer2 Viewer; - SfTextBox TextBox1; - SfTextBox TextBox2; + private SfPdfViewer2? Viewer; + private SfTextBox? TextBox1; + private SfTextBox? TextBox2; public string DocumentPath { get; set; } = "wwwroot/pdf-succinctly.pdf"; - // Access the loaded PDF Viewer instance - Zoom functionality - public async void OnZoomClick(MouseEventArgs args) + private DocumentInfo Info = new(); + + // Read document information on load + private void OnDocumentLoaded(LoadEventArgs args) { - int zoomValue = int.Parse(TextBox1.Value.ToString()); - await Viewer.ZoomAsync(zoomValue); + Info = new DocumentInfo + { + Name = args.DocumentName, + PageCount = args.PageCount, + }; } - // Navigate to a specific page - public async void OnPageClick(MouseEventArgs args) + + // Handle document load failures + private void OnDocumentLoadFailed(FailureEventArgs args) + { + Console.Error.WriteLine($"Failed to load document: {args.ErrorMessage}"); + } + + // Zoom functionality (valid range: 50-400) + private async Task OnZoomClick(MouseEventArgs args) + { + try + { + await Viewer.ZoomAsync(zoomValue); + } + catch (Exception ex) + { + Console.Error.WriteLine($"Zoom failed: {ex.Message}"); + } + } + + // Navigate to a specific 1-based page + private async Task OnPageClick(MouseEventArgs args) { - int pageIndex = int.Parse(TextBox2.Value.ToString()); - await Viewer.GoToPageAsync(pageIndex); + try + { + await Viewer.GoToPageAsync(pageIndex); + } + catch (Exception ex) + { + Console.Error.WriteLine($"Navigation failed: {ex.Message}"); + } } - + // Print the PDF document - public async void OnClick(MouseEventArgs args) + private async Task OnPrintClick(MouseEventArgs args) { - await Viewer.PrintAsync(); + if (Viewer is null) return; + await Viewer.PrintAsync(); } - + // Download the PDF document - public async void OnClickDownload(MouseEventArgs args) + private async Task OnClickDownload(MouseEventArgs args) { - await Viewer.DownloadAsync(); + if (Viewer is null) return; + await Viewer.DownloadAsync(); } } ``` -## See also -- [Blazor PDF Viewer –API Reference](https://help.syncfusion.com/cr/blazor/syncfusion.blazor.sfpdfviewer.sfpdfviewer2.html) -- [Blazor FAQ](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/faq) (e.g., Magnification, Navigation, Print) — ensure the features you need are available \ No newline at end of file +## See Also + +- [Blazor PDF Viewer – API Reference](https://help.syncfusion.com/cr/blazor/syncfusion.blazor.sfpdfviewer.sfpdfviewer2.html) +- [Magnification (Zoom) in Blazor PDF Viewer](../magnification) +- [Navigation in Blazor PDF Viewer](../interactive-pdf-navigation-overview) +- [Print PDF in Blazor PDF Viewer](../print/overview) +- [Download PDF in Blazor PDF Viewer](../saving-pdf-file#download) +- [Blazor PDF Viewer FAQ](../faq) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/blazor/document-security/password-protected.md b/Document-Processing/PDF/PDF-Viewer/blazor/document-security/password-protected.md index a677ad178f..a073eb4866 100644 --- a/Document-Processing/PDF/PDF-Viewer/blazor/document-security/password-protected.md +++ b/Document-Processing/PDF/PDF-Viewer/blazor/document-security/password-protected.md @@ -9,11 +9,7 @@ documentation: ug # Password-protected documents -Some PDFs require a password to open. When such a document is loaded in the viewer, the following behavior applies: - -- A password prompt appears if the document requires an password. - -The viewer displays a password prompt UI when a protected document is opened. +Some PDFs require a password to open. When a protected document is loaded, the viewer displays a password prompt automatically. **Desktop password prompt:** @@ -23,45 +19,83 @@ The viewer displays a password prompt UI when a protected document is opened. ![Blazor PDF Viewer mobile password prompt](../images/password-ui-mobile.png) -- If the correct password is provided, the document loads and becomes viewable per the document’s permissions. +The viewer handles the prompt as follows: + +- If the correct password is provided, the document loads and becomes viewable according to the document's permissions. - If the password is incorrect, the viewer shows an error and continues to prompt until a valid password is entered or the operation is canceled. **Invalid password error in desktop:** ![Blazor PDF Viewer desktop password error](../images/password-incorrect-desktop.png) -**Invalid password error in Mobile:** +**Invalid password error in mobile:** ![Blazor PDF Viewer mobile password error](../images/password-incorrect-mobile.png) - If the operation is canceled, the document is not loaded. +## Detect load errors + +Handle incorrect-password events through the [`DocumentLoadFailed`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.DocumentLoadFailedEventArgs.html) event to surface custom error messages. + +## Supported permissions + +When the document loads successfully, the viewer respects the permissions embedded in the PDF. Common restrictions include: + +- Printing allowed or disallowed +- Content copying +- Page editing +- Commenting and annotations + +The viewer cannot bypass or elevate document permissions. For the full list of owner-controlled permissions, see [Permission-protected documents](./permission). + ## Load the password-protected document programmatically -Use the [LoadAsync method](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerBase.html) to load a PDF from a file path, URL, or base64 data at runtime. Pass the password as the second parameter. +Use the [`LoadAsync`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerBase.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerBase_LoadAsync_System_Byte___System_String_) method to load a PDF from a file path, URL, or base64 data at runtime. The two supported overloads are: + +- `LoadAsync(byte[] bytes, string password = null)` — pass the PDF as a byte array +- `LoadAsync(string document, string password = null)` — pass a URL or server-relative path -```cshtml +The password parameter is consumed for the current load operation only and is not cached across re-renders. If the document is reloaded, supply the password again. +```csharp +@page "/password-protected" @using Syncfusion.Blazor.SfPdfViewer @using Syncfusion.Blazor.Buttons -Load Document +Load Document -@code{ - SfPdfViewer2 Viewer; +@code { + private SfPdfViewer2? Viewer; - public async void clicked() + private async Task Clicked() { + if (Viewer is null) + { + return; + } + await Viewer.LoadAsync("wwwroot/pdf-succinctly-password-protected.pdf", "password"); } } - ``` +N> The sample uses a `wwwroot/` path, which is appropriate for Blazor WebAssembly. For Blazor Server, load the file from a server-accessible location (for example, pass a byte array returned from an API) and use the `byte[]` overload. + +**Outcomes** + +| Password state | Result | +|---|---| +| Correct | The PDF loads immediately | +| Incorrect | The viewer displays the incorrect password popup | +| Null or empty | The password popup is shown automatically | + [View sample in GitHub](https://github.com/SyncfusionExamples/blazor-pdf-viewer-examples/tree/master/Load%20and%20Save/Load%20the%20Security%20Document). ## See Also -* [Permission-protected documents](./permission) \ No newline at end of file +* [Permission-protected documents](./permission) +* [Load a Password-Protected PDF in Blazor](../document-handling/load-password-pdf) +* [SfPdfViewer2 API reference](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerBase.html) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/blazor/document-security/permission.md b/Document-Processing/PDF/PDF-Viewer/blazor/document-security/permission.md index 19bb1dcd35..8ed68006a5 100644 --- a/Document-Processing/PDF/PDF-Viewer/blazor/document-security/permission.md +++ b/Document-Processing/PDF/PDF-Viewer/blazor/document-security/permission.md @@ -9,45 +9,117 @@ documentation: ug # Permission-restricted documents (Owner password and permissions) -PDFs can be secured with an owner password and a set of permissions that restrict operations even after opening the file. Examples include: +PDFs can be secured with an owner password and a set of permissions that restrict operations after the file is opened. Common restrictions include: -- Printing: allowed or disallowed -- Content copying -- Page editing +- Printing (allowed or disallowed) +- Copying content +- Editing pages - Commenting and annotations -The viewer respects these permission flags and disables restricted actions in its UI. It cannot bypass or elevate document permissions. For example, when printing is disallowed, the print action is not available; when copying is restricted, text selection may be limited or copy commands disabled. +The viewer respects these permission flags and disables restricted actions in its UI. It cannot bypass or elevate document permissions. For example, when printing is disallowed, the print action is disabled; when copying is restricted, text selection is limited or copy commands are disabled. **UI when a permission-restricted document is loaded:** -![Blazor PDF Viewer permission-restricted UI](../images/document-security.png) +![Blazor PDF Viewer permission-restricted UI showing disabled print and copy actions when document permissions are restricted](../images/document-security.png) + +## Prerequisites + +Before proceeding, make sure the following are in place: + +- Install the `Syncfusion.Blazor.SfPdfViewer` NuGet package (version 19.2.0.49 or later) in your Blazor application. +- Register Syncfusion Blazor services in `Program.cs`: + + ```csharp + builder.Services.AddSyncfusionBlazor(); + ``` + +- Add the Syncfusion theme and script references in `wwwroot/index.html` (Blazor WebAssembly) or `Pages/_Host.cshtml` (Blazor Server). See [Getting started with SfPdfViewer2](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/getting-started) for the full setup. +- Create or obtain a permission-restricted PDF and place it under `wwwroot` so it can be served at runtime. To create one, you can use Syncfusion's PDF Library (`PdfDocument`) or any third-party tool to set the owner password and permission flags. See [Create a permission-protected PDF](https://help.syncfusion.com/document-processing/pdf/pdf-library/net/working-with-security) for details. +- Compatibility: Blazor WebAssembly 3.2+ and Blazor Server .NET 5+ are supported by `SfPdfViewer2`. ## Load the permission-protected document programmatically -Use the [LoadAsync method](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerBase.html) to load a PDF from a file path, URL, or base64 data at runtime. Provide the password parameter only if the PDF also has an open/user password. +Use the [`LoadAsync`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerBase.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerBase_LoadAsync_System_Byte___System_String_) method to load a PDF from a file path, URL, or base64 data at runtime. The supported overloads are: + +- `LoadAsync(byte[] bytes, string password = null)` — load the PDF as a byte array +- `LoadAsync(string document, string password = null)` — load a URL or server-relative path -```cshtml +The `password` parameter is the **user (open) password** of the PDF, not the owner password. A permission-restricted PDF that does not require a user password can be loaded with no password argument; the permission flags are still enforced from the owner password configured on the document. +```csharp +@page "/permission-protected" @using Syncfusion.Blazor.SfPdfViewer @using Syncfusion.Blazor.Buttons -Load Document - - +
+ Load Document + + +
-@code{ - SfPdfViewer2 Viewer; +@code { + private SfPdfViewer2? Viewer; - public async void clicked() + private async Task Clicked() { - await Viewer.LoadAsync("wwwroot/permission-protected.pdf", "password"); + if (Viewer is null) + { + return; + } + + await Viewer.LoadAsync("wwwroot/permission-protected.pdf"); } } +``` + +```csharp +// Load from a URL +await Viewer.LoadAsync("https://example.com/permission-protected.pdf"); + +// Load from a base64-encoded byte array +byte[] pdfBytes = Convert.FromBase64String(base64Pdf); +await Viewer.LoadAsync(pdfBytes); +``` + +N> When loading from a `wwwroot/` path, this approach is appropriate for Blazor WebAssembly. For Blazor Server, load the file from a server-accessible location (for example, pass a byte array returned from an API) and use the `byte[]` overload. +## Permission to UI mapping + +When the document loads, `SfPdfViewer2` reads the embedded permission flags and applies the following UI restrictions: + +- `PrintAllowed = false` — the print toolbar button is hidden and the keyboard shortcut for print is disabled. +- `CopyAllowed = false` — text selection is restricted and the copy command is disabled. +- `EditAllowed = false` — page edit operations (insert, delete, rotate, rearrange) are disabled in the toolbar. +- `AnnotationsAllowed = false` — the annotation and form tools are disabled. + +There is no public API to read the permission flags at runtime. To inspect the active flags, use Syncfusion's PDF Library (`PdfDocument.Security`) on the server before passing the file to the viewer. + +## Error handling and troubleshooting + +| Symptom | Likely cause | Suggested fix | +|---|---|---| +| `LoadAsync` throws an exception | The PDF is corrupted or the path is unreachable | Verify the file path; for Blazor Server, ensure the file is in a server-accessible location | +| Permissions are not enforced | The document was saved without an owner password | Re-create the PDF with an owner password and the desired permission flags | +| Wrong user password is supplied | The PDF has both an owner and a user password | Prompt the user for the password or use the [`DocumentLoadFailed`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.DocumentLoadFailedEventArgs.html) event to surface a custom error | +| Document loads but toolbar actions still appear | An outdated version of `Syncfusion.Blazor.SfPdfViewer` is in use | Upgrade to the latest `Syncfusion.Blazor.SfPdfViewer` NuGet package | + +Subscribe to the [`DocumentLoadFailed`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.DocumentLoadFailedEventArgs.html) event to detect load errors and present a custom message: + +```csharp + + +@code { + private void OnDocumentLoadFailed(DocumentLoadFailedEventArgs args) + { + // args.Error contains the failure reason (for example, "Incorrect password") + } +} ``` [View sample in GitHub](https://github.com/SyncfusionExamples/blazor-pdf-viewer-examples/tree/master/Load%20and%20Save/Load%20the%20Security%20Document). ## See Also -* [Password-protected documents](./password-protected) \ No newline at end of file +* [Password-protected documents](./password-protected) +* [Getting started with SfPdfViewer2](../getting-started/web-app) +* [SfPdfViewer2 API reference](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerBase.html) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/blazor/images/open-pdf.png b/Document-Processing/PDF/PDF-Viewer/blazor/images/open-pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..f82d0440f32ec2af0d4e58dfc95805cf0a9334fb GIT binary patch literal 48984 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 literal 0 HcmV?d00001 diff --git a/Document-Processing/PDF/PDF-Viewer/blazor/images/password-popup.png b/Document-Processing/PDF/PDF-Viewer/blazor/images/password-popup.png new file mode 100644 index 0000000000000000000000000000000000000000..2a3a3263c937c6732d658086a025bf442e28b72d GIT binary patch literal 44540 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 vrj4ct#u@_-3{+ijC9;8iXtj2 Date: Thu, 9 Jul 2026 15:53:36 +0530 Subject: [PATCH 2/2] 1039164: Commit the review changes --- .../document-handling/load-large-pdf.md | 11 ++-- .../document-handling/load-password-pdf.md | 13 ++-- .../retrieve-viewer-instance.md | 13 ++-- .../document-security/password-protected.md | 3 +- .../blazor/document-security/permission.md | 64 +------------------ 5 files changed, 21 insertions(+), 83 deletions(-) diff --git a/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/load-large-pdf.md b/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/load-large-pdf.md index 69eeb74356..bcc4c9ae0a 100644 --- a/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/load-large-pdf.md +++ b/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/load-large-pdf.md @@ -43,7 +43,7 @@ Chunk-based processing is **mandatory** for loading large PDF files in the Blazo Refer to the following FAQ to configure chunk-based processing: -- [How to process Large files using EnableChunkMessages](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/faqs/how-to-process-large-files-without-increasing-maximum-message-size) +- [How to process Large files using EnableChunkMessages](../faqs/how-to-processing-large-files-without-increasing-maximum-message-size) Ensure that: @@ -53,7 +53,7 @@ Ensure that: ### 2. Load Large PDFs Using DocumentPath -For large documents, it is recommended to load the PDF using the [DocumentPath](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerBase.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerBase_DocumentPath) property. The `DocumentPath` approach is preferred over base64 or byte-array inputs because the latter require the entire file to be held in client memory, which is impractical for files approaching 1 GB. +For large documents, it is recommended to load the PDF using the [DocumentPath](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerBase.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerBase_DocumentPath) property. Using `DocumentPath` helps: @@ -65,7 +65,7 @@ This approach is suitable for PDFs hosted on servers, secured APIs, or cloud sto Example usage: -```razor +```cshtml @using Syncfusion.Blazor.SfPdfViewer Explore the sample projects available on [Load and View large PDF files](https://github.com/SyncfusionExamples/blazor-pdf-viewer-examples/tree/master/Load%20and%20View%20Large%20Files) - ## See Also - [Load a Password-Protected PDF](./load-password-pdf) - [Getting started with SfPdfViewer in a Blazor Web App](../getting-started/web-app) +- [Load and Save Sample](https://github.com/SyncfusionExamples/blazor-pdf-viewer-examples/tree/master/Load%20and%20Save) diff --git a/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/load-password-pdf.md b/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/load-password-pdf.md index 7d27f5ae2d..01070bd7df 100644 --- a/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/load-password-pdf.md +++ b/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/load-password-pdf.md @@ -12,8 +12,7 @@ domainurl: ##DomainURL## This article explains how to open password-protected PDF files in the Blazor PDF Viewer. The viewer supports both user-interactive loading (the built-in **Open File** dialog) and programmatic loading using APIs. - -## 1. Opening a Password-Protected PDF Using the **Open File** Dialog +## Opening a Password-Protected PDF Using the **Open File** Dialog When the user clicks the built-in **Open File** button in the PDF Viewer toolbar and selects a password-protected PDF: @@ -30,11 +29,11 @@ When the user clicks the built-in **Open File** button in the PDF Viewer toolbar No additional configuration or code is required. This approach works for all password-protected PDFs opened locally by the user. -## 2. Opening a Password-Protected PDF Programmatically +## Opening a Password-Protected PDF Programmatically Use the programmatic APIs when the password is known in advance or when the document is hosted on a server. The viewer supports both the `LoadAsync` overloads and the `DocumentPath` property. -### 2.1 Load the Document Using `LoadAsync` +### Load the Document Using `LoadAsync` The [`LoadAsync`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerBase.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerBase_LoadAsync_System_Byte___System_String_) method accepts a password parameter. The two supported overloads are: @@ -72,9 +71,9 @@ N> The password parameter is consumed for the current load operation only and is | Incorrect | The viewer displays the incorrect password popup | | Null or empty | The password popup is shown automatically | -N> Handle incorrect-password events through the [`DocumentLoadFailed`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.DocumentLoadFailedEventArgs.html) event to surface custom error messages. +N> Handle incorrect-password events through the [`DocumentLoadFailed`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerEvents.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerEvents_DocumentLoadFailed) event to surface custom error messages. -### 2.2 Loading a Password-Protected Document via `DocumentPath` +### Loading a Password-Protected Document via `DocumentPath` When the [`DocumentPath`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerBase.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerBase_DocumentPath) property points to a password-protected PDF, the viewer detects the encryption and prompts the user for the password automatically. @@ -104,8 +103,6 @@ The viewer will: ![Password Protected Pop-up](../images/password-popup.png) -N> Explore the sample projects available on [Load and View Password-Protected PDFs](https://github.com/SyncfusionExamples/blazor-pdf-viewer-examples/tree/master/Load%20and%20View%20Password-Protected%20Files) - ## See Also - [Load Large PDF Files](./load-large-pdf) diff --git a/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/retrieve-viewer-instance.md b/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/retrieve-viewer-instance.md index 5ca16cbe58..09d51f19b8 100644 --- a/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/retrieve-viewer-instance.md +++ b/Document-Processing/PDF/PDF-Viewer/blazor/document-handling/retrieve-viewer-instance.md @@ -35,9 +35,9 @@ N> The [Created](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfVi ## Get the Instance with a Ref and Read Details on Load The following example shows: -1) Creating a **component reference** for the viewer, -2) Wiring the [Created](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerEvents.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerEvents_Created) event for viewer initialization and the [DocumentLoaded](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerEvents.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerEvents_DocumentLoaded) event for document details, and -3) Reading basic **document info** (name and page count) from the `DocumentLoaded` event, then calling viewer APIs safely. +1. Creating a **component reference** for the viewer, +2. Wiring the [Created](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerEvents.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerEvents_Created) event for viewer initialization and the [DocumentLoaded](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerEvents.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerEvents_DocumentLoaded) event for document details, and +3. Reading basic **document info** (name and page count) from the `DocumentLoaded` event, then calling viewer APIs safely. ```csharp @page "/" @@ -99,11 +99,14 @@ The following example shows: } ``` -**Note:** Always null-check the `Viewer` reference before calling any viewer API. Methods such as `Viewer.ZoomAsync()`, `Viewer.GoToPageAsync()`, `Viewer.PrintAsync()`, and `Viewer.DownloadAsync()` are safe to invoke only after the `DocumentLoaded` event has fired or from a user action that occurs after load. +N> Use `SfPdfViewer2` component with `@ref` to get direct access to the viewer instance. +N> `Created` event triggers when the PDF Viewer component is rendered. +N> `DocumentLoaded` event triggers when the document is successfully loaded. Use this event to access document name, page count, and other document-specific details. +N> Always null-check the `Viewer` reference before calling any viewer API. Methods such as `Viewer.ZoomAsync()`, `Viewer.GoToPageAsync()`, `Viewer.PrintAsync()`, and `Viewer.DownloadAsync()` are safe to invoke only after the `DocumentLoaded` event has fired or from a user action that occurs after load. ## End-to-End Example: Call Viewer APIs with TextBox Input -This example shows how to use text inputs with buttons to interact with the loaded PDF viewer, including reading document info, zooming, navigating, printing, and downloading. The viewer loads via the `DocumentPath` property, which is the recommended approach when the document URL is known at render time. (Use `LoadAsync` inside the `Created` event instead when the path is determined at runtime.) +This example shows how to use text inputs with buttons to interact with the loaded PDF viewer, including reading document info, zooming, navigating, printing, and downloading. ```csharp @page "/" diff --git a/Document-Processing/PDF/PDF-Viewer/blazor/document-security/password-protected.md b/Document-Processing/PDF/PDF-Viewer/blazor/document-security/password-protected.md index a073eb4866..d6b5014fcb 100644 --- a/Document-Processing/PDF/PDF-Viewer/blazor/document-security/password-protected.md +++ b/Document-Processing/PDF/PDF-Viewer/blazor/document-security/password-protected.md @@ -36,7 +36,7 @@ The viewer handles the prompt as follows: ## Detect load errors -Handle incorrect-password events through the [`DocumentLoadFailed`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.DocumentLoadFailedEventArgs.html) event to surface custom error messages. +Handle incorrect-password events through the [`DocumentLoadFailed`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerEvents.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerEvents_DocumentLoadFailed) event to surface custom error messages. ## Supported permissions @@ -98,4 +98,3 @@ N> The sample uses a `wwwroot/` path, which is appropriate for Blazor WebAssembl * [Permission-protected documents](./permission) * [Load a Password-Protected PDF in Blazor](../document-handling/load-password-pdf) -* [SfPdfViewer2 API reference](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerBase.html) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/blazor/document-security/permission.md b/Document-Processing/PDF/PDF-Viewer/blazor/document-security/permission.md index 8ed68006a5..cb457b69e5 100644 --- a/Document-Processing/PDF/PDF-Viewer/blazor/document-security/permission.md +++ b/Document-Processing/PDF/PDF-Viewer/blazor/document-security/permission.md @@ -22,29 +22,13 @@ The viewer respects these permission flags and disables restricted actions in it ![Blazor PDF Viewer permission-restricted UI showing disabled print and copy actions when document permissions are restricted](../images/document-security.png) -## Prerequisites - -Before proceeding, make sure the following are in place: - -- Install the `Syncfusion.Blazor.SfPdfViewer` NuGet package (version 19.2.0.49 or later) in your Blazor application. -- Register Syncfusion Blazor services in `Program.cs`: - - ```csharp - builder.Services.AddSyncfusionBlazor(); - ``` - -- Add the Syncfusion theme and script references in `wwwroot/index.html` (Blazor WebAssembly) or `Pages/_Host.cshtml` (Blazor Server). See [Getting started with SfPdfViewer2](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/getting-started) for the full setup. -- Create or obtain a permission-restricted PDF and place it under `wwwroot` so it can be served at runtime. To create one, you can use Syncfusion's PDF Library (`PdfDocument`) or any third-party tool to set the owner password and permission flags. See [Create a permission-protected PDF](https://help.syncfusion.com/document-processing/pdf/pdf-library/net/working-with-security) for details. -- Compatibility: Blazor WebAssembly 3.2+ and Blazor Server .NET 5+ are supported by `SfPdfViewer2`. - ## Load the permission-protected document programmatically Use the [`LoadAsync`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.PdfViewerBase.html#Syncfusion_Blazor_SfPdfViewer_PdfViewerBase_LoadAsync_System_Byte___System_String_) method to load a PDF from a file path, URL, or base64 data at runtime. The supported overloads are: - `LoadAsync(byte[] bytes, string password = null)` — load the PDF as a byte array - `LoadAsync(string document, string password = null)` — load a URL or server-relative path - -The `password` parameter is the **user (open) password** of the PDF, not the owner password. A permission-restricted PDF that does not require a user password can be loaded with no password argument; the permission flags are still enforced from the owner password configured on the document. +- `LoadAsync(Stream stream, string password = null)` — load a PDF Document from the stream. ```csharp @page "/permission-protected" @@ -72,51 +56,7 @@ The `password` parameter is the **user (open) password** of the PDF, not the own } ``` -```csharp -// Load from a URL -await Viewer.LoadAsync("https://example.com/permission-protected.pdf"); - -// Load from a base64-encoded byte array -byte[] pdfBytes = Convert.FromBase64String(base64Pdf); -await Viewer.LoadAsync(pdfBytes); -``` - -N> When loading from a `wwwroot/` path, this approach is appropriate for Blazor WebAssembly. For Blazor Server, load the file from a server-accessible location (for example, pass a byte array returned from an API) and use the `byte[]` overload. - -## Permission to UI mapping - -When the document loads, `SfPdfViewer2` reads the embedded permission flags and applies the following UI restrictions: - -- `PrintAllowed = false` — the print toolbar button is hidden and the keyboard shortcut for print is disabled. -- `CopyAllowed = false` — text selection is restricted and the copy command is disabled. -- `EditAllowed = false` — page edit operations (insert, delete, rotate, rearrange) are disabled in the toolbar. -- `AnnotationsAllowed = false` — the annotation and form tools are disabled. - -There is no public API to read the permission flags at runtime. To inspect the active flags, use Syncfusion's PDF Library (`PdfDocument.Security`) on the server before passing the file to the viewer. - -## Error handling and troubleshooting - -| Symptom | Likely cause | Suggested fix | -|---|---|---| -| `LoadAsync` throws an exception | The PDF is corrupted or the path is unreachable | Verify the file path; for Blazor Server, ensure the file is in a server-accessible location | -| Permissions are not enforced | The document was saved without an owner password | Re-create the PDF with an owner password and the desired permission flags | -| Wrong user password is supplied | The PDF has both an owner and a user password | Prompt the user for the password or use the [`DocumentLoadFailed`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.DocumentLoadFailedEventArgs.html) event to surface a custom error | -| Document loads but toolbar actions still appear | An outdated version of `Syncfusion.Blazor.SfPdfViewer` is in use | Upgrade to the latest `Syncfusion.Blazor.SfPdfViewer` NuGet package | - -Subscribe to the [`DocumentLoadFailed`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.SfPdfViewer.DocumentLoadFailedEventArgs.html) event to detect load errors and present a custom message: - -```csharp - - -@code { - private void OnDocumentLoadFailed(DocumentLoadFailedEventArgs args) - { - // args.Error contains the failure reason (for example, "Incorrect password") - } -} -``` - -[View sample in GitHub](https://github.com/SyncfusionExamples/blazor-pdf-viewer-examples/tree/master/Load%20and%20Save/Load%20the%20Security%20Document). +N> [View sample in GitHub](https://github.com/SyncfusionExamples/blazor-pdf-viewer-examples/tree/master/Load%20and%20Save/Load%20the%20Security%20Document). ## See Also