From 5c535123a28b9b9e4d8a55f1d4fb8bf923987676 Mon Sep 17 00:00:00 2001
From: SF4524LogeshKumar <logeshkumar.dhamodharan@syncfusion.com>
Date: Thu, 3 Apr 2025 16:26:22 +0530
Subject: [PATCH] 905903: Updated sample for Customize existing toolbar both
 standalone and Server-Backed

---
 .../PDFViewerSample.csproj                    |  14 -
 .../Pages/Shared/_Layout.cshtml               |  51 ---
 How to/Customize existing toolbar/README.md   |  26 --
 .../ToolbarCustomization.sln}                 |  14 +-
 .../ToolbarCustomization}/Pages/Error.cshtml  |   0
 .../Pages/Error.cshtml.cs                     |   3 +-
 .../ToolbarCustomization/Pages/Index.cshtml   |  42 +++
 .../Pages/Index.cshtml.cs                     | 338 ++++++++++++++++++
 .../Pages/Privacy.cshtml                      |   0
 .../Pages/Privacy.cshtml.cs                   |   3 +-
 .../Pages/Shared/_Layout.cshtml               |  30 ++
 .../Pages/Shared/_Layout.cshtml.css           |   2 +-
 .../Shared/_ValidationScriptsPartial.cshtml   |   0
 .../Pages/_ViewImports.cshtml                 |   0
 .../Pages/_ViewStart.cshtml                   |   0
 .../ToolbarCustomization}/Program.cs          |   0
 .../Properties/launchSettings.json            |  20 +-
 .../ToolbarCustomization.csproj               |  14 +
 .../ToolbarCustomization.csproj.user          |   6 +
 .../appsettings.Development.json              |   0
 .../ToolbarCustomization}/appsettings.json    |   0
 .../ToolbarCustomization}/wwwroot/favicon.ico | Bin
 .../Standalone/ToolbarCustomization.sln       |  25 ++
 .../ToolbarCustomization/Pages/Error.cshtml   |  26 ++
 .../Pages/Error.cshtml.cs                     |  28 ++
 .../ToolbarCustomization}/Pages/Index.cshtml  |   5 +-
 .../Pages/Index.cshtml.cs                     |   4 +-
 .../ToolbarCustomization/Pages/Privacy.cshtml |   8 +
 .../Pages/Privacy.cshtml.cs                   |  20 ++
 .../Pages/Shared/_Layout.cshtml               |  30 ++
 .../Pages/Shared/_Layout.cshtml.css           |  48 +++
 .../Shared/_ValidationScriptsPartial.cshtml   |   2 +
 .../Pages/_ViewImports.cshtml                 |   4 +
 .../Pages/_ViewStart.cshtml                   |   3 +
 .../ToolbarCustomization/Program.cs           |  25 ++
 .../Properties/launchSettings.json            |  38 ++
 .../ToolbarCustomization.csproj               |  14 +
 .../ToolbarCustomization.csproj.user          |   6 +
 .../appsettings.Development.json              |   9 +
 .../ToolbarCustomization/appsettings.json     |   9 +
 .../ToolbarCustomization/wwwroot/favicon.ico  | Bin 0 -> 5430 bytes
 41 files changed, 757 insertions(+), 110 deletions(-)
 delete mode 100644 How to/Customize existing toolbar/PDFViewerSample.csproj
 delete mode 100644 How to/Customize existing toolbar/Pages/Shared/_Layout.cshtml
 delete mode 100644 How to/Customize existing toolbar/README.md
 rename How to/Customize existing toolbar/{PDFViewerSample.sln => Server-Backed/ToolbarCustomization.sln} (54%)
 rename How to/Customize existing toolbar/{ => Server-Backed/ToolbarCustomization}/Pages/Error.cshtml (100%)
 rename How to/Customize existing toolbar/{ => Server-Backed/ToolbarCustomization}/Pages/Error.cshtml.cs (99%)
 create mode 100644 How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Index.cshtml
 create mode 100644 How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Index.cshtml.cs
 rename How to/Customize existing toolbar/{ => Server-Backed/ToolbarCustomization}/Pages/Privacy.cshtml (100%)
 rename How to/Customize existing toolbar/{ => Server-Backed/ToolbarCustomization}/Pages/Privacy.cshtml.cs (99%)
 create mode 100644 How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Shared/_Layout.cshtml
 rename How to/Customize existing toolbar/{ => Server-Backed/ToolbarCustomization}/Pages/Shared/_Layout.cshtml.css (87%)
 rename How to/Customize existing toolbar/{ => Server-Backed/ToolbarCustomization}/Pages/Shared/_ValidationScriptsPartial.cshtml (100%)
 rename How to/Customize existing toolbar/{ => Server-Backed/ToolbarCustomization}/Pages/_ViewImports.cshtml (100%)
 rename How to/Customize existing toolbar/{ => Server-Backed/ToolbarCustomization}/Pages/_ViewStart.cshtml (100%)
 rename How to/Customize existing toolbar/{ => Server-Backed/ToolbarCustomization}/Program.cs (100%)
 rename How to/Customize existing toolbar/{ => Server-Backed/ToolbarCustomization}/Properties/launchSettings.json (51%)
 create mode 100644 How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/ToolbarCustomization.csproj
 create mode 100644 How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/ToolbarCustomization.csproj.user
 rename How to/Customize existing toolbar/{ => Server-Backed/ToolbarCustomization}/appsettings.Development.json (100%)
 rename How to/Customize existing toolbar/{ => Server-Backed/ToolbarCustomization}/appsettings.json (100%)
 rename How to/Customize existing toolbar/{ => Server-Backed/ToolbarCustomization}/wwwroot/favicon.ico (100%)
 create mode 100644 How to/Customize existing toolbar/Standalone/ToolbarCustomization.sln
 create mode 100644 How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Error.cshtml
 create mode 100644 How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Error.cshtml.cs
 rename How to/Customize existing toolbar/{ => Standalone/ToolbarCustomization}/Pages/Index.cshtml (98%)
 rename How to/Customize existing toolbar/{ => Standalone/ToolbarCustomization}/Pages/Index.cshtml.cs (99%)
 create mode 100644 How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Privacy.cshtml
 create mode 100644 How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Privacy.cshtml.cs
 create mode 100644 How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Shared/_Layout.cshtml
 create mode 100644 How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Shared/_Layout.cshtml.css
 create mode 100644 How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Shared/_ValidationScriptsPartial.cshtml
 create mode 100644 How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/_ViewImports.cshtml
 create mode 100644 How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/_ViewStart.cshtml
 create mode 100644 How to/Customize existing toolbar/Standalone/ToolbarCustomization/Program.cs
 create mode 100644 How to/Customize existing toolbar/Standalone/ToolbarCustomization/Properties/launchSettings.json
 create mode 100644 How to/Customize existing toolbar/Standalone/ToolbarCustomization/ToolbarCustomization.csproj
 create mode 100644 How to/Customize existing toolbar/Standalone/ToolbarCustomization/ToolbarCustomization.csproj.user
 create mode 100644 How to/Customize existing toolbar/Standalone/ToolbarCustomization/appsettings.Development.json
 create mode 100644 How to/Customize existing toolbar/Standalone/ToolbarCustomization/appsettings.json
 create mode 100644 How to/Customize existing toolbar/Standalone/ToolbarCustomization/wwwroot/favicon.ico

diff --git a/How to/Customize existing toolbar/PDFViewerSample.csproj b/How to/Customize existing toolbar/PDFViewerSample.csproj
deleted file mode 100644
index dcbd110..0000000
--- a/How to/Customize existing toolbar/PDFViewerSample.csproj	
+++ /dev/null
@@ -1,14 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
-
-  <PropertyGroup>
-    <TargetFramework>net6.0</TargetFramework>
-    <Nullable>enable</Nullable>
-    <ImplicitUsings>enable</ImplicitUsings>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <PackageReference Include="Syncfusion.EJ2.AspNet.Core" Version="*" />
-    <PackageReference Include="Syncfusion.EJ2.PdfViewer.AspNet.Core" Version="*" />
-  </ItemGroup>
-
-</Project>
diff --git a/How to/Customize existing toolbar/Pages/Shared/_Layout.cshtml b/How to/Customize existing toolbar/Pages/Shared/_Layout.cshtml
deleted file mode 100644
index b1019e5..0000000
--- a/How to/Customize existing toolbar/Pages/Shared/_Layout.cshtml	
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="utf-8" />
-    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <title>@ViewData["Title"] - PDFViewerSample</title>
-    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.4.1/dist/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
-    <!-- Syncfusion ASP.NET Core controls styles -->
-    <link rel="stylesheet" href="https://cdn.syncfusion.com/ej2/24.1.41/fluent.css" />
-    <!-- Syncfusion ASP.NET Core controls scripts -->
-    <script src="https://cdn.syncfusion.com/ej2/24.1.41/dist/ej2.min.js"></script>
-</head>
-<body>
-    <header>
-        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
-            <div class="container">
-                <a class="navbar-brand" asp-area="" asp-page="/Index">PDFViewerSample</a>
-                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
-                        aria-expanded="false" aria-label="Toggle navigation">
-                    <span class="navbar-toggler-icon"></span>
-                </button>
-                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
-                    <ul class="navbar-nav flex-grow-1">
-                        <li class="nav-item">
-                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
-                        </li>
-                        <li class="nav-item">
-                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
-                        </li>
-                    </ul>
-                </div>
-            </div>
-        </nav>
-    </header>
-    <div class="container">
-        <main role="main" class="pb-3">
-            @RenderBody()
-        </main>
-    </div>
-
-    <footer class="border-top footer text-muted">
-        <div class="container">
-            &copy; 2022 - PDFViewerSample - <a asp-area="" asp-page="/Privacy">Privacy</a>
-        </div>
-    </footer>
-
-    @await RenderSectionAsync("Scripts", required: false)
-    <!-- Syncfusion ASP.NET Core Script Manager -->
-    <ejs-scripts></ejs-scripts>
-</body>
-</html>
\ No newline at end of file
diff --git a/How to/Customize existing toolbar/README.md b/How to/Customize existing toolbar/README.md
deleted file mode 100644
index 30d532e..0000000
--- a/How to/Customize existing toolbar/README.md	
+++ /dev/null
@@ -1,26 +0,0 @@
-# Create a simple PDF Viewer
-This example shows how to create a simple PDF Viewer application.
-
-## Project pre-requisites
-One of the the following .NET SDK is required to develop and run the Syncfusion&reg; UI controls for ASP.NET Core application.
-
-* NET 6.0 SDK
-* NET 5.0 SDK
-* NET Core SDK 3.1
-* NET Core SDK 2.0
-* NET 4.5 Framework
-
-If you are planning to use Visual Studio to develop ASP.NET Core Applications.
-
-.NET 6.0 requires Visual Studio 2022 17.0 or later.
-.NET 5.0 requires Visual Studio 2019 16.8 or later.
-.NET Core SDK 3.1 requires Visual Studio 2019 16.4 or later.
-.NET Core SDK 2.0 requires Visual Studio 2017 15.7 or later.
-.NET 4.5 Framework requires Visual Studio 2015 20.1 or later
-
-## Running the sample
-Execute the following commands to run the sample via command prompt window.
-
-* dotnet restore
-* dotnet run
-
diff --git a/How to/Customize existing toolbar/PDFViewerSample.sln b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization.sln
similarity index 54%
rename from How to/Customize existing toolbar/PDFViewerSample.sln
rename to How to/Customize existing toolbar/Server-Backed/ToolbarCustomization.sln
index 67ddc5d..8732bc7 100644
--- a/How to/Customize existing toolbar/PDFViewerSample.sln	
+++ b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization.sln	
@@ -1,9 +1,9 @@
 
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio Version 17
-VisualStudioVersion = 17.0.32112.339
+VisualStudioVersion = 17.10.34607.79
 MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PDFViewerSample", "PDFViewerSample.csproj", "{39AA1883-BB43-4C46-9892-6033EA59C990}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToolbarCustomization", "ToolbarCustomization\ToolbarCustomization.csproj", "{A03771AD-04BE-4843-8FF8-BCBC1FA49EDD}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -11,15 +11,15 @@ Global
 		Release|Any CPU = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{39AA1883-BB43-4C46-9892-6033EA59C990}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{39AA1883-BB43-4C46-9892-6033EA59C990}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{39AA1883-BB43-4C46-9892-6033EA59C990}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{39AA1883-BB43-4C46-9892-6033EA59C990}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A03771AD-04BE-4843-8FF8-BCBC1FA49EDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A03771AD-04BE-4843-8FF8-BCBC1FA49EDD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A03771AD-04BE-4843-8FF8-BCBC1FA49EDD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A03771AD-04BE-4843-8FF8-BCBC1FA49EDD}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
-		SolutionGuid = {5F13CE16-9CC4-4755-AFB4-367F461A209C}
+		SolutionGuid = {31245B35-82FC-4C3B-A888-4730D0AD8EE0}
 	EndGlobalSection
 EndGlobal
diff --git a/How to/Customize existing toolbar/Pages/Error.cshtml b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Error.cshtml
similarity index 100%
rename from How to/Customize existing toolbar/Pages/Error.cshtml
rename to How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Error.cshtml
diff --git a/How to/Customize existing toolbar/Pages/Error.cshtml.cs b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Error.cshtml.cs
similarity index 99%
rename from How to/Customize existing toolbar/Pages/Error.cshtml.cs
rename to How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Error.cshtml.cs
index 0a23fb0..c008cae 100644
--- a/How to/Customize existing toolbar/Pages/Error.cshtml.cs	
+++ b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Error.cshtml.cs	
@@ -24,4 +24,5 @@ public void OnGet()
             RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
         }
     }
-}
\ No newline at end of file
+
+}
diff --git a/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Index.cshtml b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Index.cshtml
new file mode 100644
index 0000000..6569478
--- /dev/null
+++ b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Index.cshtml	
@@ -0,0 +1,42 @@
+@page "{handler?}"
+@model IndexModel
+@using Syncfusion.EJ2.PdfViewer
+@using Newtonsoft.Json
+@{
+    ViewData["Title"] = "Home page";
+    CustomToolbarItems customToolbarItems = new CustomToolbarItems();
+    var toolItem1 = new { id = "submit_form", text = "Submit Form", tooltipText = "Custom toolbar item", align = "Center", cssClass = "custom_button" };
+    customToolbarItems.ToolbarItems = new List<object> { toolItem1, "OpenOption", "PageNavigationTool", "MagnificationTool", "PanTool", "SelectionTool", "SearchOption", "PrintOption", "DownloadOption", "UndoRedoTool", "AnnotationEditTool", "FormDesignerEditTool", "CommentTool" };
+    PdfViewerToolbarSettings toolbarSettings = new PdfViewerToolbarSettings()
+            {
+                ShowTooltip = true,
+                ToolbarItems = customToolbarItems.ToolbarItems
+            };
+}
+
+<br>
+<br>
+<div>
+    <ejs-pdfviewer id="pdfviewer" style="height:600px"
+                   serviceUrl="/Index"
+                   documentPath="https://cdn.syncfusion.com/content/pdf/form-designer.pdf"
+                   toolbarClick="toolbarClick"
+                   ToolbarSettings="toolbarSettings">
+
+    </ejs-pdfviewer>
+</div>
+
+<script>
+    function toolbarClick(args) {
+         var viewer = document.getElementById('pdfviewer').ej2_instances[0];
+         if (args.item && args.item.id === 'submit_form') {
+             alert('Custom button clicked!');
+         }
+     }
+</script>
+
+<style>
+    .custom_button {
+        height: 100% !important;
+    }
+</style>
diff --git a/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Index.cshtml.cs b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Index.cshtml.cs
new file mode 100644
index 0000000..8a40533
--- /dev/null
+++ b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Index.cshtml.cs	
@@ -0,0 +1,338 @@
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Caching.Memory;
+using Syncfusion.EJ2.PdfViewer;
+using Newtonsoft.Json;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using System.Reflection;
+using System.Net;
+using Syncfusion.Pdf.Parsing;
+
+namespace PDFViewerSample.Pages
+{
+
+    public class CustomToolbarItems
+    {
+        public CustomToolbarItems() { }
+        public List<object> ToolbarItems { get; set; }
+
+    }
+    [IgnoreAntiforgeryToken(Order = 1001)]
+    public class IndexModel : PageModel
+    {
+
+
+        private readonly Microsoft.AspNetCore.Hosting.IHostingEnvironment _hostingEnvironment;
+        private IMemoryCache _cache;
+
+        public IndexModel(Microsoft.AspNetCore.Hosting.IHostingEnvironment hostingEnvironment, IMemoryCache cache)
+        {
+            _hostingEnvironment = hostingEnvironment;
+            _cache = cache;
+        }
+
+        public IActionResult OnPostLoad([FromBody] jsonObjects responseData)
+        {
+            PdfRenderer pdfviewer = new PdfRenderer(_cache);
+            MemoryStream stream = new MemoryStream();
+            var jsonObject = JsonConverterstring(responseData);
+            object jsonResult = new object();
+            if (jsonObject != null && jsonObject.ContainsKey("document"))
+            {
+                if (bool.Parse(jsonObject["isFileName"]))
+                {
+                    string documentPath = GetDocumentPath(jsonObject["document"]);
+                    if (!string.IsNullOrEmpty(documentPath))
+                    {
+                        byte[] bytes = System.IO.File.ReadAllBytes(documentPath);
+                        stream = new MemoryStream(bytes);
+                    }
+                    else
+                    {
+                        string fileName = jsonObject["document"].Split(new string[] { "://" }, StringSplitOptions.None)[0];
+                        if (fileName == "http" || fileName == "https")
+                        {
+                            WebClient WebClient = new WebClient();
+                            byte[] pdfDoc = WebClient.DownloadData(jsonObject["document"]);
+                            stream = new MemoryStream(pdfDoc);
+                        }
+                        else
+                            return this.Content(jsonObject["document"] + " is not found");
+                    }
+                }
+                else
+                {
+                    byte[] bytes = Convert.FromBase64String(jsonObject["document"]);
+                    stream = new MemoryStream(bytes);
+                }
+            }
+            jsonResult = pdfviewer.Load(stream, jsonObject);
+            return Content(JsonConvert.SerializeObject(jsonResult));
+        }
+
+        public Dictionary<string, string> JsonConverterstring(jsonObjects results)
+        {
+            Dictionary<string, object> resultObjects = new Dictionary<string, object>();
+            resultObjects = results.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)
+                .ToDictionary(prop => prop.Name, prop => prop.GetValue(results, null));
+            var emptyObjects = (from kv in resultObjects
+                                where kv.Value != null
+                                select kv).ToDictionary(kv => kv.Key, kv => kv.Value);
+            Dictionary<string, string> jsonResult = emptyObjects.ToDictionary(k => k.Key, k => k.Value.ToString());
+            return jsonResult;
+        }
+
+        //Post action for processing the PDF documents.
+        public IActionResult OnPostRenderPdfPages([FromBody] jsonObjects responseData)
+        {
+            PdfRenderer pdfviewer = new PdfRenderer(_cache);
+            var jsonObject = JsonConverterstring(responseData);
+            object jsonResult = pdfviewer.GetPage(jsonObject);
+            return Content(JsonConvert.SerializeObject(jsonResult));
+        }
+
+        //Post action for unloading and disposing the PDF document resources
+        public IActionResult OnPostUnload([FromBody] jsonObjects responseData)
+        {
+            PdfRenderer pdfviewer = new PdfRenderer(_cache);
+            var jsonObject = JsonConverterstring(responseData);
+            pdfviewer.ClearCache(jsonObject);
+            return this.Content("Document cache is cleared");
+        }
+
+        //Post action for rendering the ThumbnailImages
+        public IActionResult OnPostRenderThumbnailImages([FromBody] jsonObjects responseData)
+        {
+            PdfRenderer pdfviewer = new PdfRenderer(_cache);
+            var jsonObject = JsonConverterstring(responseData);
+            object result = pdfviewer.GetThumbnailImages(jsonObject);
+            return Content(JsonConvert.SerializeObject(result));
+        }
+
+        //Post action for processing the bookmarks from the PDF documents
+        public IActionResult OnPostBookmarks([FromBody] jsonObjects responseData)
+        {
+            PdfRenderer pdfviewer = new PdfRenderer(_cache);
+            var jsonObject = JsonConverterstring(responseData);
+            object jsonResult = pdfviewer.GetBookmarks(jsonObject);
+            return Content(JsonConvert.SerializeObject(jsonResult));
+        }
+
+        //Post action for rendering the annotation comments
+        public IActionResult OnPostRenderAnnotationComments([FromBody] jsonObjects responseData)
+        {
+            PdfRenderer pdfviewer = new PdfRenderer(_cache);
+            var jsonObject = JsonConverterstring(responseData);
+            object jsonResult = pdfviewer.GetAnnotationComments(jsonObject);
+            return Content(JsonConvert.SerializeObject(jsonResult));
+        }
+
+        //Post action for exporting the annotations
+        public IActionResult OnPostExportAnnotations([FromBody] jsonObjects responseData)
+        {
+            PdfRenderer pdfviewer = new PdfRenderer(_cache);
+            var jsonObject = JsonConverterstring(responseData);
+            string jsonResult = pdfviewer.ExportAnnotation(jsonObject);
+            return Content(jsonResult);
+        }
+
+        //Post action for importing the annotations
+        public IActionResult OnPostImportAnnotations([FromBody] jsonObjects responseData)
+        {
+            PdfRenderer pdfviewer = new PdfRenderer(_cache);
+            var jsonObject = JsonConverterstring(responseData);
+            string jsonResult = string.Empty;
+            object JsonResult;
+            if (jsonObject != null && jsonObject.ContainsKey("fileName"))
+            {
+                string documentPath = GetDocumentPath(jsonObject["fileName"]);
+                if (!string.IsNullOrEmpty(documentPath))
+                {
+                    jsonResult = System.IO.File.ReadAllText(documentPath);
+                }
+                else
+                {
+                    return this.Content(jsonObject["document"] + " is not found");
+                }
+            }
+            else
+            {
+                string extension = Path.GetExtension(jsonObject["importedData"]);
+                if (extension != ".xfdf")
+                {
+                    JsonResult = pdfviewer.ImportAnnotation(jsonObject);
+                    return Content(JsonConvert.SerializeObject(JsonResult));
+                }
+                else
+                {
+                    string documentPath = GetDocumentPath(jsonObject["importedData"]);
+                    if (!string.IsNullOrEmpty(documentPath))
+                    {
+                        byte[] bytes = System.IO.File.ReadAllBytes(documentPath);
+                        jsonObject["importedData"] = Convert.ToBase64String(bytes);
+                        JsonResult = pdfviewer.ImportAnnotation(jsonObject);
+                        return Content(JsonConvert.SerializeObject(JsonResult));
+                    }
+                    else
+                    {
+                        return this.Content(jsonObject["document"] + " is not found");
+                    }
+                }
+            }
+            return Content(jsonResult);
+        }
+
+        //Post action for downloading the PDF documents
+        public IActionResult OnPostDownload([FromBody] jsonObjects responseData)
+        {
+            PdfRenderer pdfviewer = new PdfRenderer(_cache);
+            var jsonObject = JsonConverterstring(responseData);
+            string documentBase = pdfviewer.GetDocumentAsBase64(jsonObject);
+            return Content(documentBase);
+        }
+
+        //Post action for printing the PDF documents
+        public IActionResult OnPostPrintImages([FromBody] jsonObjects responseData)
+        {
+            PdfRenderer pdfviewer = new PdfRenderer(_cache);
+            var jsonObject = JsonConverterstring(responseData);
+            object pageImage = pdfviewer.GetPrintImage(jsonObject);
+            return Content(JsonConvert.SerializeObject(pageImage));
+        }
+
+        public IActionResult OnPostExportFormFields([FromBody] jsonObjects responseData)
+
+        {
+            PdfRenderer pdfviewer = new PdfRenderer(_cache);
+            var jsonObject = JsonConverterstring(responseData);
+            string jsonResult = pdfviewer.ExportFormFields(jsonObject);
+            return Content(jsonResult);
+        }
+
+        //Gets the path of the PDF document
+        private string GetDocumentPath(string document)
+        {
+            string documentPath = string.Empty;
+            if (!System.IO.File.Exists(document))
+            {
+                string basePath = _hostingEnvironment.WebRootPath;
+                string dataPath = string.Empty;
+                dataPath = basePath + "/";
+                if (System.IO.File.Exists(dataPath + (document)))
+                    documentPath = dataPath + document;
+            }
+            else
+            {
+                documentPath = document;
+            }
+            return documentPath;
+        }
+    }
+
+    public class jsonObjects
+    {
+
+        public string document { get; set; }
+
+        public string password { get; set; }
+
+        public bool isClientsideLoading { get; set; }
+
+        public string organizePages { get; set; }
+
+        public string zoomFactor { get; set; }
+
+        public string isFileName { get; set; }
+
+        public string xCoordinate { get; set; }
+
+        public string yCoordinate { get; set; }
+
+        public string pageNumber { get; set; }
+
+        public string documentId { get; set; }
+
+        public string hashId { get; set; }
+
+        public string sizeX { get; set; }
+
+        public string sizeY { get; set; }
+
+        public string startPage { get; set; }
+
+        public string endPage { get; set; }
+
+        public string stampAnnotations { get; set; }
+
+        public string textMarkupAnnotations { get; set; }
+
+        public string stickyNotesAnnotation { get; set; }
+
+        public string shapeAnnotations { get; set; }
+
+        public string measureShapeAnnotations { get; set; }
+
+        public string action { get; set; }
+
+        public string pageStartIndex { get; set; }
+
+        public string pageEndIndex { get; set; }
+
+        public string fileName { get; set; }
+
+        public string elementId { get; set; }
+
+        public string pdfAnnotation { get; set; }
+
+        public string importPageList { get; set; }
+
+        public string uniqueId { get; set; }
+
+        public string data { get; set; }
+
+        public string viewPortWidth { get; set; }
+
+        public string viewportHeight { get; set; }
+
+        public string tilecount { get; set; }
+
+        public bool isCompletePageSizeNotReceived { get; set; }
+
+        public string freeTextAnnotation { get; set; }
+
+        public string signatureData { get; set; }
+
+        public string fieldsData { get; set; }
+
+        public string formDesigner { get; set; }
+
+        public bool isSignatureEdited { get; set; }
+
+        public string inkSignatureData { get; set; }
+
+        public bool hideEmptyDigitalSignatureFields { get; set; }
+
+        public bool showDigitalSignatureAppearance { get; set; }
+
+        public bool digitalSignaturePresent { get; set; }
+
+        public string tileXCount { get; set; }
+
+        public string tileYCount { get; set; }
+
+        public string digitalSignaturePageList { get; set; }
+
+        public string annotationCollection { get; set; }
+
+        public string annotationsPageList { get; set; }
+
+        public string formFieldsPageList { get; set; }
+
+        public bool isAnnotationsExist { get; set; }
+
+        public bool isFormFieldAnnotationsExist { get; set; }
+
+        public string documentLiveCount { get; set; }
+
+        public string annotationDataFormat { get; set; }
+    }
+}
\ No newline at end of file
diff --git a/How to/Customize existing toolbar/Pages/Privacy.cshtml b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Privacy.cshtml
similarity index 100%
rename from How to/Customize existing toolbar/Pages/Privacy.cshtml
rename to How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Privacy.cshtml
diff --git a/How to/Customize existing toolbar/Pages/Privacy.cshtml.cs b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Privacy.cshtml.cs
similarity index 99%
rename from How to/Customize existing toolbar/Pages/Privacy.cshtml.cs
rename to How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Privacy.cshtml.cs
index f9a85a1..cd60641 100644
--- a/How to/Customize existing toolbar/Pages/Privacy.cshtml.cs	
+++ b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Privacy.cshtml.cs	
@@ -16,4 +16,5 @@ public void OnGet()
         {
         }
     }
-}
\ No newline at end of file
+
+}
diff --git a/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Shared/_Layout.cshtml b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Shared/_Layout.cshtml
new file mode 100644
index 0000000..f1ce8ac
--- /dev/null
+++ b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Shared/_Layout.cshtml	
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>@ViewData["Title"] - PDFViewerSample</title>
+    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
+    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
+    <link rel="stylesheet" href="~/PDFViewerSample.styles.css" asp-append-version="true" />
+    <!-- Syncfusion ASP.NET Core controls styles -->
+    <link rel="stylesheet" href="https://cdn.syncfusion.com/ej2/29.1.33/fluent.css" />
+    <!-- Syncfusion ASP.NET Core controls scripts -->
+    <script src="https://cdn.syncfusion.com/ej2/29.1.33/dist/ej2.min.js"></script>
+</head>
+<body>
+    <div class="container">
+        <main role="main" class="pb-3">
+            @RenderBody()
+        </main>
+    </div>
+
+    <script src="~/lib/jquery/dist/jquery.min.js"></script>
+    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
+    <script src="~/js/site.js" asp-append-version="true"></script>
+
+    @await RenderSectionAsync("Scripts", required: false)
+    <!-- Syncfusion ASP.NET Core Script Manager -->
+    <ejs-scripts></ejs-scripts>
+</body>
+</html>
\ No newline at end of file
diff --git a/How to/Customize existing toolbar/Pages/Shared/_Layout.cshtml.css b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Shared/_Layout.cshtml.css
similarity index 87%
rename from How to/Customize existing toolbar/Pages/Shared/_Layout.cshtml.css
rename to How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Shared/_Layout.cshtml.css
index a72cbea..c187c02 100644
--- a/How to/Customize existing toolbar/Pages/Shared/_Layout.cshtml.css	
+++ b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Shared/_Layout.cshtml.css	
@@ -1,4 +1,4 @@
-/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification
+/* Please see documentation at https://learn.microsoft.com/aspnet/core/client-side/bundling-and-minification
 for details on configuring this project to bundle and minify static web assets. */
 
 a.navbar-brand {
diff --git a/How to/Customize existing toolbar/Pages/Shared/_ValidationScriptsPartial.cshtml b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Shared/_ValidationScriptsPartial.cshtml
similarity index 100%
rename from How to/Customize existing toolbar/Pages/Shared/_ValidationScriptsPartial.cshtml
rename to How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/Shared/_ValidationScriptsPartial.cshtml
diff --git a/How to/Customize existing toolbar/Pages/_ViewImports.cshtml b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/_ViewImports.cshtml
similarity index 100%
rename from How to/Customize existing toolbar/Pages/_ViewImports.cshtml
rename to How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/_ViewImports.cshtml
diff --git a/How to/Customize existing toolbar/Pages/_ViewStart.cshtml b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/_ViewStart.cshtml
similarity index 100%
rename from How to/Customize existing toolbar/Pages/_ViewStart.cshtml
rename to How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Pages/_ViewStart.cshtml
diff --git a/How to/Customize existing toolbar/Program.cs b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Program.cs
similarity index 100%
rename from How to/Customize existing toolbar/Program.cs
rename to How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Program.cs
diff --git a/How to/Customize existing toolbar/Properties/launchSettings.json b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Properties/launchSettings.json
similarity index 51%
rename from How to/Customize existing toolbar/Properties/launchSettings.json
rename to How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Properties/launchSettings.json
index d52972e..dbe83ce 100644
--- a/How to/Customize existing toolbar/Properties/launchSettings.json	
+++ b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/Properties/launchSettings.json	
@@ -1,18 +1,28 @@
-{
+{
+  "$schema": "http://json.schemastore.org/launchsettings.json",
   "iisSettings": {
     "windowsAuthentication": false,
     "anonymousAuthentication": true,
     "iisExpress": {
-      "applicationUrl": "http://localhost:38233",
-      "sslPort": 44357
+      "applicationUrl": "http://localhost:12333",
+      "sslPort": 44366
     }
   },
   "profiles": {
-    "PDFViewerSample": {
+    "http": {
       "commandName": "Project",
       "dotnetRunMessages": true,
       "launchBrowser": true,
-      "applicationUrl": "https://localhost:7173;http://localhost:5173",
+      "applicationUrl": "http://localhost:5059",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      }
+    },
+    "https": {
+      "commandName": "Project",
+      "dotnetRunMessages": true,
+      "launchBrowser": true,
+      "applicationUrl": "https://localhost:7232;http://localhost:5059",
       "environmentVariables": {
         "ASPNETCORE_ENVIRONMENT": "Development"
       }
diff --git a/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/ToolbarCustomization.csproj b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/ToolbarCustomization.csproj
new file mode 100644
index 0000000..bd93b42
--- /dev/null
+++ b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/ToolbarCustomization.csproj	
@@ -0,0 +1,14 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <Nullable>enable</Nullable>
+    <ImplicitUsings>enable</ImplicitUsings>
+  </PropertyGroup>
+
+  <ItemGroup>
+       <PackageReference Include="Syncfusion.EJ2.AspNet.Core" Version="*" />
+       <PackageReference Include="Syncfusion.EJ2.PdfViewer.AspNet.Core" Version="*" />
+  </ItemGroup>
+
+</Project>
diff --git a/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/ToolbarCustomization.csproj.user b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/ToolbarCustomization.csproj.user
new file mode 100644
index 0000000..9ff5820
--- /dev/null
+++ b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/ToolbarCustomization.csproj.user	
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ActiveDebugProfile>https</ActiveDebugProfile>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/How to/Customize existing toolbar/appsettings.Development.json b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/appsettings.Development.json
similarity index 100%
rename from How to/Customize existing toolbar/appsettings.Development.json
rename to How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/appsettings.Development.json
diff --git a/How to/Customize existing toolbar/appsettings.json b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/appsettings.json
similarity index 100%
rename from How to/Customize existing toolbar/appsettings.json
rename to How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/appsettings.json
diff --git a/How to/Customize existing toolbar/wwwroot/favicon.ico b/How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/wwwroot/favicon.ico
similarity index 100%
rename from How to/Customize existing toolbar/wwwroot/favicon.ico
rename to How to/Customize existing toolbar/Server-Backed/ToolbarCustomization/wwwroot/favicon.ico
diff --git a/How to/Customize existing toolbar/Standalone/ToolbarCustomization.sln b/How to/Customize existing toolbar/Standalone/ToolbarCustomization.sln
new file mode 100644
index 0000000..8732bc7
--- /dev/null
+++ b/How to/Customize existing toolbar/Standalone/ToolbarCustomization.sln	
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.10.34607.79
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToolbarCustomization", "ToolbarCustomization\ToolbarCustomization.csproj", "{A03771AD-04BE-4843-8FF8-BCBC1FA49EDD}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{A03771AD-04BE-4843-8FF8-BCBC1FA49EDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A03771AD-04BE-4843-8FF8-BCBC1FA49EDD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A03771AD-04BE-4843-8FF8-BCBC1FA49EDD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A03771AD-04BE-4843-8FF8-BCBC1FA49EDD}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {31245B35-82FC-4C3B-A888-4730D0AD8EE0}
+	EndGlobalSection
+EndGlobal
diff --git a/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Error.cshtml b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Error.cshtml
new file mode 100644
index 0000000..6f92b95
--- /dev/null
+++ b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Error.cshtml	
@@ -0,0 +1,26 @@
+@page
+@model ErrorModel
+@{
+    ViewData["Title"] = "Error";
+}
+
+<h1 class="text-danger">Error.</h1>
+<h2 class="text-danger">An error occurred while processing your request.</h2>
+
+@if (Model.ShowRequestId)
+{
+    <p>
+        <strong>Request ID:</strong> <code>@Model.RequestId</code>
+    </p>
+}
+
+<h3>Development Mode</h3>
+<p>
+    Swapping to the <strong>Development</strong> environment displays detailed information about the error that occurred.
+</p>
+<p>
+    <strong>The Development environment shouldn't be enabled for deployed applications.</strong>
+    It can result in displaying sensitive information from exceptions to end users.
+    For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
+    and restarting the app.
+</p>
diff --git a/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Error.cshtml.cs b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Error.cshtml.cs
new file mode 100644
index 0000000..c008cae
--- /dev/null
+++ b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Error.cshtml.cs	
@@ -0,0 +1,28 @@
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using System.Diagnostics;
+
+namespace PDFViewerSample.Pages
+{
+    [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
+    [IgnoreAntiforgeryToken]
+    public class ErrorModel : PageModel
+    {
+        public string? RequestId { get; set; }
+
+        public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
+
+        private readonly ILogger<ErrorModel> _logger;
+
+        public ErrorModel(ILogger<ErrorModel> logger)
+        {
+            _logger = logger;
+        }
+
+        public void OnGet()
+        {
+            RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
+        }
+    }
+
+}
diff --git a/How to/Customize existing toolbar/Pages/Index.cshtml b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Index.cshtml
similarity index 98%
rename from How to/Customize existing toolbar/Pages/Index.cshtml
rename to How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Index.cshtml
index 9820d79..db4b8b1 100644
--- a/How to/Customize existing toolbar/Pages/Index.cshtml	
+++ b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Index.cshtml	
@@ -3,12 +3,13 @@
 @{
     ViewData["Title"] = "Home page";
 }
-
+<br>
+<br>
 <div>
     <ejs-pdfviewer id="pdfviewer"
                    style="width:1350px;height:100%"
                    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/29.1.35/dist/ej2-pdfviewer-lib'
                    toolbarClick="toolbarClick">
     </ejs-pdfviewer>
 </div>
diff --git a/How to/Customize existing toolbar/Pages/Index.cshtml.cs b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Index.cshtml.cs
similarity index 99%
rename from How to/Customize existing toolbar/Pages/Index.cshtml.cs
rename to How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Index.cshtml.cs
index 1f24ca8..721e2f7 100644
--- a/How to/Customize existing toolbar/Pages/Index.cshtml.cs	
+++ b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Index.cshtml.cs	
@@ -1,4 +1,4 @@
-using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Caching.Memory;
 using Syncfusion.EJ2.PdfViewer;
 using Newtonsoft.Json;
@@ -246,7 +246,7 @@ public class jsonObjects
         public string freeTextAnnotation { get; set; }
         public string signatureData { get; set; }
         public string fieldsData { get; set; }
-        public string FormDesigner { get; set; }
+        public string formDesigner { get; set; }
         public string inkSignatureData { get; set; }
         public bool hideEmptyDigitalSignatureFields { get; set; }
         public bool showDigitalSignatureAppearance { get; set; }
diff --git a/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Privacy.cshtml b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Privacy.cshtml
new file mode 100644
index 0000000..46ba966
--- /dev/null
+++ b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Privacy.cshtml	
@@ -0,0 +1,8 @@
+@page
+@model PrivacyModel
+@{
+    ViewData["Title"] = "Privacy Policy";
+}
+<h1>@ViewData["Title"]</h1>
+
+<p>Use this page to detail your site's privacy policy.</p>
diff --git a/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Privacy.cshtml.cs b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Privacy.cshtml.cs
new file mode 100644
index 0000000..cd60641
--- /dev/null
+++ b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Privacy.cshtml.cs	
@@ -0,0 +1,20 @@
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+
+namespace PDFViewerSample.Pages
+{
+    public class PrivacyModel : PageModel
+    {
+        private readonly ILogger<PrivacyModel> _logger;
+
+        public PrivacyModel(ILogger<PrivacyModel> logger)
+        {
+            _logger = logger;
+        }
+
+        public void OnGet()
+        {
+        }
+    }
+
+}
diff --git a/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Shared/_Layout.cshtml b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Shared/_Layout.cshtml
new file mode 100644
index 0000000..f1ce8ac
--- /dev/null
+++ b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Shared/_Layout.cshtml	
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>@ViewData["Title"] - PDFViewerSample</title>
+    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
+    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
+    <link rel="stylesheet" href="~/PDFViewerSample.styles.css" asp-append-version="true" />
+    <!-- Syncfusion ASP.NET Core controls styles -->
+    <link rel="stylesheet" href="https://cdn.syncfusion.com/ej2/29.1.33/fluent.css" />
+    <!-- Syncfusion ASP.NET Core controls scripts -->
+    <script src="https://cdn.syncfusion.com/ej2/29.1.33/dist/ej2.min.js"></script>
+</head>
+<body>
+    <div class="container">
+        <main role="main" class="pb-3">
+            @RenderBody()
+        </main>
+    </div>
+
+    <script src="~/lib/jquery/dist/jquery.min.js"></script>
+    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
+    <script src="~/js/site.js" asp-append-version="true"></script>
+
+    @await RenderSectionAsync("Scripts", required: false)
+    <!-- Syncfusion ASP.NET Core Script Manager -->
+    <ejs-scripts></ejs-scripts>
+</body>
+</html>
\ No newline at end of file
diff --git a/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Shared/_Layout.cshtml.css b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Shared/_Layout.cshtml.css
new file mode 100644
index 0000000..c187c02
--- /dev/null
+++ b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Shared/_Layout.cshtml.css	
@@ -0,0 +1,48 @@
+/* Please see documentation at https://learn.microsoft.com/aspnet/core/client-side/bundling-and-minification
+for details on configuring this project to bundle and minify static web assets. */
+
+a.navbar-brand {
+  white-space: normal;
+  text-align: center;
+  word-break: break-all;
+}
+
+a {
+  color: #0077cc;
+}
+
+.btn-primary {
+  color: #fff;
+  background-color: #1b6ec2;
+  border-color: #1861ac;
+}
+
+.nav-pills .nav-link.active, .nav-pills .show > .nav-link {
+  color: #fff;
+  background-color: #1b6ec2;
+  border-color: #1861ac;
+}
+
+.border-top {
+  border-top: 1px solid #e5e5e5;
+}
+.border-bottom {
+  border-bottom: 1px solid #e5e5e5;
+}
+
+.box-shadow {
+  box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05);
+}
+
+button.accept-policy {
+  font-size: 1rem;
+  line-height: inherit;
+}
+
+.footer {
+  position: absolute;
+  bottom: 0;
+  width: 100%;
+  white-space: nowrap;
+  line-height: 60px;
+}
diff --git a/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Shared/_ValidationScriptsPartial.cshtml b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Shared/_ValidationScriptsPartial.cshtml
new file mode 100644
index 0000000..5a16d80
--- /dev/null
+++ b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/Shared/_ValidationScriptsPartial.cshtml	
@@ -0,0 +1,2 @@
+<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
+<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>
diff --git a/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/_ViewImports.cshtml b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/_ViewImports.cshtml
new file mode 100644
index 0000000..51b8015
--- /dev/null
+++ b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/_ViewImports.cshtml	
@@ -0,0 +1,4 @@
+@using PDFViewerSample
+@namespace PDFViewerSample.Pages
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
+@addTagHelper *, Syncfusion.EJ2
\ No newline at end of file
diff --git a/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/_ViewStart.cshtml b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/_ViewStart.cshtml
new file mode 100644
index 0000000..a5f1004
--- /dev/null
+++ b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Pages/_ViewStart.cshtml	
@@ -0,0 +1,3 @@
+@{
+    Layout = "_Layout";
+}
diff --git a/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Program.cs b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Program.cs
new file mode 100644
index 0000000..bc275e4
--- /dev/null
+++ b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Program.cs	
@@ -0,0 +1,25 @@
+var builder = WebApplication.CreateBuilder(args);
+
+// Add services to the container.
+builder.Services.AddRazorPages();
+
+var app = builder.Build();
+
+// Configure the HTTP request pipeline.
+if (!app.Environment.IsDevelopment())
+{
+    app.UseExceptionHandler("/Error");
+    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
+    app.UseHsts();
+}
+
+app.UseHttpsRedirection();
+app.UseStaticFiles();
+
+app.UseRouting();
+
+app.UseAuthorization();
+
+app.MapRazorPages();
+
+app.Run();
diff --git a/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Properties/launchSettings.json b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Properties/launchSettings.json
new file mode 100644
index 0000000..dbe83ce
--- /dev/null
+++ b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/Properties/launchSettings.json	
@@ -0,0 +1,38 @@
+{
+  "$schema": "http://json.schemastore.org/launchsettings.json",
+  "iisSettings": {
+    "windowsAuthentication": false,
+    "anonymousAuthentication": true,
+    "iisExpress": {
+      "applicationUrl": "http://localhost:12333",
+      "sslPort": 44366
+    }
+  },
+  "profiles": {
+    "http": {
+      "commandName": "Project",
+      "dotnetRunMessages": true,
+      "launchBrowser": true,
+      "applicationUrl": "http://localhost:5059",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      }
+    },
+    "https": {
+      "commandName": "Project",
+      "dotnetRunMessages": true,
+      "launchBrowser": true,
+      "applicationUrl": "https://localhost:7232;http://localhost:5059",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      }
+    },
+    "IIS Express": {
+      "commandName": "IISExpress",
+      "launchBrowser": true,
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      }
+    }
+  }
+}
diff --git a/How to/Customize existing toolbar/Standalone/ToolbarCustomization/ToolbarCustomization.csproj b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/ToolbarCustomization.csproj
new file mode 100644
index 0000000..bd93b42
--- /dev/null
+++ b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/ToolbarCustomization.csproj	
@@ -0,0 +1,14 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <Nullable>enable</Nullable>
+    <ImplicitUsings>enable</ImplicitUsings>
+  </PropertyGroup>
+
+  <ItemGroup>
+       <PackageReference Include="Syncfusion.EJ2.AspNet.Core" Version="*" />
+       <PackageReference Include="Syncfusion.EJ2.PdfViewer.AspNet.Core" Version="*" />
+  </ItemGroup>
+
+</Project>
diff --git a/How to/Customize existing toolbar/Standalone/ToolbarCustomization/ToolbarCustomization.csproj.user b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/ToolbarCustomization.csproj.user
new file mode 100644
index 0000000..9ff5820
--- /dev/null
+++ b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/ToolbarCustomization.csproj.user	
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ActiveDebugProfile>https</ActiveDebugProfile>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/How to/Customize existing toolbar/Standalone/ToolbarCustomization/appsettings.Development.json b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/appsettings.Development.json
new file mode 100644
index 0000000..770d3e9
--- /dev/null
+++ b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/appsettings.Development.json	
@@ -0,0 +1,9 @@
+{
+  "DetailedErrors": true,
+  "Logging": {
+    "LogLevel": {
+      "Default": "Information",
+      "Microsoft.AspNetCore": "Warning"
+    }
+  }
+}
diff --git a/How to/Customize existing toolbar/Standalone/ToolbarCustomization/appsettings.json b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/appsettings.json
new file mode 100644
index 0000000..10f68b8
--- /dev/null
+++ b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/appsettings.json	
@@ -0,0 +1,9 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Information",
+      "Microsoft.AspNetCore": "Warning"
+    }
+  },
+  "AllowedHosts": "*"
+}
diff --git a/How to/Customize existing toolbar/Standalone/ToolbarCustomization/wwwroot/favicon.ico b/How to/Customize existing toolbar/Standalone/ToolbarCustomization/wwwroot/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..63e859b476eff5055e0e557aaa151ca8223fbeef
GIT binary patch
literal 5430
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
Y_O6}xTrQ{Lm(%HNn!7U|JnrZJ0OMGa@Bjb+

literal 0
HcmV?d00001