Articles in this section
Category / Section

How to create PDF Viewer web service application in ASP.NET Core?

19 mins read
Introduction

The Essential ASP.NET Core PDF Viewer has a server-side dependency to retrieve details from PDF documents for rendering. This section explains how to create the service for the PDF Viewer to perform server-side preprocessing of the PDF document to be rendered on the client side.

Prerequisites

To get started with the ASP.NET Core Web API service, ensure that the following software is installed on the machine:

  • Visual Studio 2017
  • .NET Core 2.0

ASP.NET Core application setup with Web API for the PDF Viewer service

The following steps are used to create the PDF Viewer service:

  1. Select File > New > Project in the Visual Studio menu bar.

Creating Project

  1. Select Installed > Visual C# > .NET Core and choose the required .NET Framework in the drop-down.
  2. Select ASP.NET Core Web Application and change the application name, and then click OK.

Choosing platform

  1. Select API, and then click OK. The web application project is now created with the default ASP.NET Core template.

Including API

  1. After creating the project, add the Syncfusion.EJ2.PdfViewer.AspNet.Core.Windows dependency to your project by using the NuGet Package Manager.

Open the NuGet package manager.

Nuget Packages

Install the Syncfusion.EJ2.PdfViewer.AspNet.Core.Windows package to the application.

Installing Packages

Note:

For Linux and OSX operating systems, use the following corresponding libraries:

  • Syncfusion.EJ2.PdfViewer.AspNet.Core.Linux
  • Syncfusion.EJ2.PdfViewer.AspNet.Core.OSX
  1. Rename the ValuesController.cs file to PdfViewerController.cs inside the Controllers folder and add the following code.

C#

using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using Syncfusion.EJ2.PdfViewer;
using System;
using System.Collections.Generic;
using System.IO;

namespace ej2_pdfviewer_service.Controllers
{
    public class PdfViewerController : Controller
    {
        private IHostingEnvironment _hostingEnvironment;
        // Initialize the memory cache object
        public IMemoryCache _cache;
        public PdfViewerController(IHostingEnvironment hostingEnvironment, IMemoryCache cache)
        {
            _hostingEnvironment = hostingEnvironment;
            _cache = cache;
        }

        [AcceptVerbs("Post")]
        [HttpPost]
        [Microsoft.AspNetCore.Cors.EnableCors("MyPolicy")]
        // Post action for loading the PDF documents
        public IActionResult Load([FromBody] Dictionary<string, string> jsonObject)
        {
            // Initialize the PDF viewer object with the memory cache object
            PdfRenderer pdfviewer = new PdfRenderer(_cache);
            MemoryStream stream = new MemoryStream();
            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
                    {
                        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));
        }

        [AcceptVerbs("Post")]
        [HttpPost]
        [Microsoft.AspNetCore.Cors.EnableCors("MyPolicy")]
        // Post action for processing the bookmarks from the PDF documents
        public IActionResult Bookmarks([FromBody] Dictionary<string, string> jsonObject)
        {
            PdfRenderer pdfviewer = new PdfRenderer(_cache);
            var jsonResult = pdfviewer.GetBookmarks(jsonObject);
            return Content(JsonConvert.SerializeObject(jsonResult));
        }

        [AcceptVerbs("Post")]
        [HttpPost]
        [Microsoft.AspNetCore.Cors.EnableCors("MyPolicy")]
        // Post action for processing the PDF documents
        public IActionResult RenderPdfPages([FromBody] Dictionary<string, string> jsonObject)
        {
            PdfRenderer pdfviewer = new PdfRenderer(_cache);
            object jsonResult = pdfviewer.GetPage(jsonObject);
            return Content(JsonConvert.SerializeObject(jsonResult));
        }

        [AcceptVerbs("Post")]
        [HttpPost]
        [Microsoft.AspNetCore.Cors.EnableCors("MyPolicy")]
        // Post action for rendering the thumbnail images
        public IActionResult RenderThumbnailImages([FromBody] Dictionary<string, string> jsonObject)
        {
            PdfRenderer pdfviewer = new PdfRenderer(_cache);
            object result = pdfviewer.GetThumbnailImages(jsonObject);
            return Content(JsonConvert.SerializeObject(result));
        }

        [AcceptVerbs("Post")]
        [HttpPost]
        [Microsoft.AspNetCore.Cors.EnableCors("MyPolicy")]
        // Post action for rendering annotations
        public IActionResult RenderAnnotationComments([FromBody] Dictionary<string, string> jsonObject)
        {
            PdfRenderer pdfviewer = new PdfRenderer(_cache);
            object jsonResult = pdfviewer.GetAnnotationComments(jsonObject);
            return Content(JsonConvert.SerializeObject(jsonResult));													 
        }

        [AcceptVerbs("Post")]
        [HttpPost]
        [Microsoft.AspNetCore.Cors.EnableCors("MyPolicy")]
        // Post action to export annotations
        public IActionResult ExportAnnotations([FromBody] Dictionary<string, string> jsonObject)
        {
            PdfRenderer pdfviewer = new PdfRenderer(_cache);
            string jsonResult = pdfviewer.GetAnnotations(jsonObject);
            return Content(jsonResult);
        }

        [AcceptVerbs("Post")]
        [HttpPost]
        [Microsoft.AspNetCore.Cors.EnableCors("MyPolicy")]
        // Post action to import annotations
        public IActionResult ImportAnnotations([FromBody] Dictionary<string, string> jsonObject)
        {
            PdfRenderer pdfviewer = new PdfRenderer(_cache);
            string jsonResult = string.Empty;

            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");
                }
            }

            return Content(jsonResult);
        }

        [AcceptVerbs("Post")]
        [HttpPost]
        [Microsoft.AspNetCore.Cors.EnableCors("MyPolicy")]
        // Post action for unloading and disposing of the PDF document resources
        public IActionResult Unload([FromBody] Dictionary<string, string> jsonObject)
        {
            PdfRenderer pdfviewer = new PdfRenderer(_cache);
            pdfviewer.ClearCache(jsonObject);
            return this.Content("Document cache is cleared");
        }

        [HttpPost]
        [Microsoft.AspNetCore.Cors.EnableCors("MyPolicy")]
        // Post action for downloading the PDF documents
        public IActionResult Download([FromBody] Dictionary<string, string> jsonObject)
        {
            PdfRenderer pdfviewer = new PdfRenderer(_cache);
            string documentBase = pdfviewer.GetDocumentAsBase64(jsonObject);
            return Content(documentBase);
        }

        [HttpPost]
        [Microsoft.AspNetCore.Cors.EnableCors("MyPolicy")]
        // Post action for printing the PDF documents
        public IActionResult PrintImages([FromBody] Dictionary<string, string> jsonObject)
        {
            PdfRenderer pdfviewer = new PdfRenderer(_cache);
            object pageImage = pdfviewer.GetPrintImage(jsonObject);
            return Content(JsonConvert.SerializeObject(pageImage));
        }

        // Gets the path of the PDF document
        private string GetDocumentPath(string document)
        {
            string documentPath = string.Empty;

            if (!System.IO.File.Exists(document))
            {
                var path = _hostingEnvironment.ContentRootPath;
                if (System.IO.File.Exists(path + "\\Data\\" + document))
                {
                    documentPath = path + "\\Data\\" + document;
                }
            }
            else
            {
                documentPath = document;
            }

            return documentPath;
        }
    }
}

Change the launchUrl to pdfviewer (name of the controller) in the lauchSettings.json as follows:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:58767/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "pdfviewer",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "ej2_pdfviewer_service": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "pdfviewer",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:62978/"
    }
  }
}

Configuring CORS policy

Browser security prevents a webpage from making requests to a different domain than the one that served the webpage. This restriction is called the **same-origin policy**. **Cross-Origin Resource Sharing (CORS)** allows a server to relax the same-origin policy. Using CORS, a server can explicitly allow some cross-origin requests.

Configure a CORS policy in the application `Startup.cs` file in the `ConfigureServices` method using the following code:

Code snippet

public void ConfigureServices(IServiceCollection services)
{
    services.AddMemoryCache();
    services.AddMvc();
    services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
    {
        builder.AllowAnyOrigin()
               .AllowAnyMethod()
               .AllowAnyHeader();
    }));
    services.Configure<GzipCompressionProviderOptions>(options => options.Level = System.IO.Compression.CompressionLevel.Optimal);
    services.AddResponseCompression();
}

The CorsPolicyBuilder in builder allows you to configure the policy as required. You can now use this policy name to apply the policy to controllers and actions.

[Microsoft.AspNetCore.Cors.EnableCors("MyPolicy")]

Sample link: https://www.syncfusion.com/downloads/support/directtrac/general/ze/ej2-pdfviewer-web-service-1568002846

Note:
  • From the 2019 Volume 2 release, new annotation features included in the PDF Viewer. So update the Scripts, CSS, and Nuget packages to the latest Essential Studio Version to work with PDF Viewer.
  • From the version 17.2.0.39, we have improved the memory cache method in ASP.NET Core. So update the controller code with the above updated code snippet to work with PDF Viewer.

 

https://cdn.syncfusion.com/ej2/17.2.28/dist/ej2.min.js 

https://cdn.syncfusion.com/ej2/17.2.28/material.css   


 See Also


Conclusion

I hope you enjoyed learning how to create a PDF Viewer web service application in ASP.NET Core.

You can refer to our ASP.NET Core PDF Viewer feature tour page to learn about its other groundbreaking feature representations and documentation, and how to quickly get started with configuration specifications. You can also explore our ASP.NET Core PDF Viewer example to understand how to create and manipulate data. For current customers, you can check out our components from the License and Downloads page. If you are new to Syncfusion®, you can try our 30-day free trial to check out our other controls. If you have any queries or require clarifications, please let us know in the comments section below. You can also contact us through our support forums or feedback portal. We are always happy to assist you!

Did you find this information helpful?
Yes
No
Help us improve this page
Please provide feedback or comments
Comments
Please  to leave a comment
Access denied
Access denied