Convert from HTML to PDF in ASP.NET Core with a Free 3rd Party Library

Html to Pdf Conversion is now available for .NET Core. SelectPdf offers a Community Edition (FREE) of the powerful Html To Pdf Converter for .NET Core that can be found in the full featured pdf library.

C# (1.6 MB)
4.3 Star
2,055 times
Add to favorites
E-mail Twitter Digg Facebook

Solution explorer

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Routing;
using System.IO;
using System.Text.Encodings.Web;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.Rendering;
using System.Diagnostics;

namespace SelectPdf.Samples
    public interface IViewRenderService
        Task<string> RenderToStringAsync<T>(string pageName, string pageLayout, T model) where T : PageModel;

    public class ViewRenderService : IViewRenderService
        private readonly IRazorViewEngine _razorViewEngine;
        private readonly ITempDataProvider _tempDataProvider;
        private readonly IServiceProvider _serviceProvider;
        private readonly IHttpContextAccessor _httpContext;
        private readonly IActionContextAccessor _actionContext;
        private readonly IRazorPageActivator _activator;

        public ViewRenderService(IRazorViewEngine razorViewEngine,
            ITempDataProvider tempDataProvider,
            IServiceProvider serviceProvider,
            IHttpContextAccessor httpContext,
            IRazorPageActivator activator,
            IActionContextAccessor actionContext)
            _razorViewEngine = razorViewEngine;
            _tempDataProvider = tempDataProvider;
            _serviceProvider = serviceProvider;

            _httpContext = httpContext;
            _actionContext = actionContext;
            _activator = activator;

        public async Task<string> RenderToStringAsync<T>(string pageName, string pageLayout, T model) where T : PageModel
            var actionContext =
                new ActionContext(

            using (var sw = new StringWriter())
                var result = _razorViewEngine.FindPage(actionContext, pageName);

                if (result.Page == null)
                    throw new ArgumentNullException($"The page {pageName} cannot be found.");

                var page = ((Page)result.Page);
                page.Layout = pageLayout;

                var view = new RazorView(_razorViewEngine,
                    new List<IRazorPage>(),
                    new DiagnosticListener("ViewRenderService"));

                var viewContext = new ViewContext(
                    new ViewDataDictionary<T>(new EmptyModelMetadataProvider(), new ModelStateDictionary())
                        Model = model
                    new TempDataDictionary(
                    new HtmlHelperOptions()

                page.PageContext = new Microsoft.AspNetCore.Mvc.RazorPages.PageContext
                    ViewData = viewContext.ViewData

                page.ViewContext = viewContext;

                _activator.Activate(page, viewContext);

                await page.ExecuteAsync();

                return sw.ToString();