Multi-Platform HTML to PDF Library for .NET

HiQPdf Multiplatform HTML to PDF Converter for .NET Core

The new HiQPdf Client-Server Solution allows you to use the same features from regular HiQPdf library in applications on any platform that supports .NET Core or .NET Standard 2.0 and above.

You can deploy your applications using this solution on Windows, Linux and MacOS operating systems or on Azure App Service platform. You can use it in UWP and Xamarin applications.

Download Now
Online Demo
Documentation

The HiQPdf Multi-Platform Solution delivers the same power and quality to your .NET Core applications on many platforms, including the most restrictive ones. The solution consists in HiQPdf Server application which can run as an Azure Cloud Service or as a Windows Service and a client library for .NET Core that can be used in any .NET Core application on any platform which offers support for .NET Core or .NET Standard 2.0 and above.

You can deploy your .NET Core applications on Windows, Linux and MacOS operating systems or in more restrictive environments like Azure App Service for Windows and Linux. You can also use the library in Universal Windows Platform applications or in Xamarin applications for Android and iOS.
Getting Started
Download the Server Zip Package from downloads page. and extract it in a folder close to the root folder to avoid working with long file path names. Follow the detailed instructions from 'Installation Guide.pdf' document to install the server and get the server IP address that you will use in the client applications. For a quick testing you can use either the Windows Service installed on localhost or the Azure Cloud Service started in emulator and in this case the IP address is 127.0.0.1.
Download Client Library for .NET Core Zip Package, extract it into a folder, open in Visual Studio the demo application from Samples folder to build and run it. By default the application is using the localhost IP address. If everything works well on localhost you can start the production deployment. Instead of using our demo application you can create your own application for .NET Core in Visual Studio, add a reference to HiQPdf.Client NuGet Package or to assembly from product package and use the simple code below to convert an URL to a PDF document you can save into a file or send it for download in browser.
 using HiQPdfClient;

 // Create the converter object
 HtmlToPdf converter = new HtmlToPdf("{server_ip_address}");

 // Convert the HTML page from URL to memory
 byte[] pdfData = converter.ConvertUrlToMemory(UrlToConvert);

 // Save the PDF data to a file
 System.IO.File.WriteAllBytes("output.pdf", pdfData);

 // Alternatively convert and save to a file in one step
 converter.ConvertUrlToFile(UrlToConvert, "output.pdf");

 // Send the PDF data for download in ASP.NET Core applications
 FileResult fileResult = new FileContentResult(pdfData, "application/pdf");
 fileResult.FileDownloadName = "Output.pdf";
 return fileResult;

 // Send the PDF data for download in ASP.NET Web Forms applications
 HttpResponse httpResponse = HttpContext.Current.Response;
 httpResponse.AddHeader("Content-Type", "application/pdf");
 httpResponse.AddHeader("Content-Disposition",
            String.Format("attachment; filename=ConvertHtmlPart.pdf; size={0}",
            pdfData.Length.ToString()));
 httpResponse.BinaryWrite(pdfData);
 httpResponse.End();
The multi-platform solution offers the same features as the regular library for .NET and .NET Core that you can use now at the same power and quality on various operating systems and in the most restrictive environments.
Same Quality for All Platforms
The PDF documents you can create with this new technology have the same quality you can get with the regular HiQPdf library on all platforms. You can deploy the same .NET Core application in Azure App Service for Windows or for Linux and the generated PDF documents will be the same
Same Features as the Regular Library for .NET
The client libraries for .NET and .NET Core have an API very similar to the regular library for .NET. You will able to use the new multi-platform client library with minor code changes or even without any code changes for some features like HTML to PDF conversion
Advanced Features in Restricted Environments
All the advanced features like Web Fonts rendering in HTML to PDF Converter are fully supported and made available even to the most restrictive platforms like Azure App Service, Universal Windows Platform or Xamarin for Android and iOS
Fully Owned and Reusable Server Instance
You install your own server instance once in Azure Cloud or on any Windows Server and you can reuse it in many .NET Core applications that you can deploy on multiple platforms. The HiQPdf Server is secure, reliable, configurable, designed for highly concurrent usage. You are not using any third-party online service, you control everything
ASP.NET Core, Web Forms and MVC Samples
The HiQPdf client libraries comes with a suite of ASP.NET Core, ASP.NET Web Forms and MVC samples with complete source code in C# and VB.NET. The main features of the library are well documented and there is a complete API reference in HTML and in Microsoft Help format. If you need more help you can contact our support team at any time
Simple and Flexible Licensing for All Platforms Costs
The same license works both with the regular library for .NET and with the client libraries for .NET and .NET Core. There are no additional run time or deployment costs charged for using our software component in your applications, the license never expires and includes the software upgrades

Convert HTML Documents to PDF, to Image or to SVG ...

Convert Only a Selected Region of a HTML Document to PDF

Convert Multiple HTML Documents into the Same PDF document

Control HTML Content Location, Scaling and Fitting in PDF Page

Automatic, Manual or WaitTime HTML Conversion Triggering

Automatically Generated Outlines and Links

Automatically Generated Table of Contents

Automatically Generated Outlines Hierarchy

Control PDF page breaks with page-break CSS attributes in HTML

Repeat HTML Table Header and Footer on Each PDF Page

Retrieve Detailed Info About the Laid Out HTML Elements

HTTP Authentication, HTTP Headers, HTTP Cookies and Proxies

Use HTTP GET or POST Requests to Access the HTML to Convert

Create PDF/A and PDF/X Standards Compliant Documents ...

Encrypt, Password Protect and Digitally Sign PDF Documents

Create and Submit Interactive PDF Forms

Automatically Generated Fillable PDF Forms

Add HTML, Text, Image and Graphic Objects to PDF

Create PDF Documents with Outlines, Links and Attachments

Load and Edit External PDF Documents

Merge PDF Documents

Extract the Text from PDF Documents

Search Text in PDF Documents

Extract the Images from PDF Documents

Convert PDF Pages to Images or to Multipage TIFF

Convert PDF pages to HTML documents

HTML to PDF Converter for .NET - C# Code Sample for ASP.NET Core
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Hosting;

using HiQPdfClient;

namespace HiQPdf_Demo.Controllers
{
    public class ConvertHtmlToPdfController : Controller
    {
        IFormCollection m_formCollection;
        IWebHostEnvironment m_hostingEnvironment;
        public ConvertHtmlToPdfController(IWebHostEnvironment hostingEnvironment)
        {
            m_hostingEnvironment = hostingEnvironment;
        }

        // GET: ConvertHtmlToPdf
        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public ActionResult ConvertToPdf(IFormCollection collection)
        {
            m_formCollection = collection;

            string serverIP = collection["textBoxServerIP"];
            uint serverPort = uint.Parse(collection["textBoxServerPort"]);
            string serverPassword = collection["textBoxServerPassword"];

            // create the HTML to PDF converter
            HtmlToPdf htmlToPdfConverter = new HtmlToPdf(serverIP, serverPort);

            // use server password if necessary
            if (serverPassword.Length > 0)
                htmlToPdfConverter.ServerPassword = serverPassword;

            // set a demo serial number
            htmlToPdfConverter.SerialNumber = "YCgJMTAE-BiwJAhIB-EhlWTlBA-UEBRQFBA-U1FOUVJO-WVlZWQ==";

            // set browser width
            htmlToPdfConverter.BrowserWidth = int.Parse(collection["textBoxBrowserWidth"]);

            // set browser height if specified, otherwise use the default
            if (collection["textBoxBrowserHeight"][0].Length > 0)
                htmlToPdfConverter.BrowserHeight = int.Parse(collection["textBoxBrowserHeight"]);

            // set HTML Load timeout
            htmlToPdfConverter.HtmlLoadedTimeout = int.Parse(collection["textBoxLoadHtmlTimeout"]);

            // set PDF page size and orientation
            htmlToPdfConverter.Document.PageSize = GetSelectedPageSize();
            htmlToPdfConverter.Document.PageOrientation = GetSelectedPageOrientation();

            // set the PDF standard used by the document
            htmlToPdfConverter.Document.PdfStandard = collection["checkBoxPdfA"].Count > 0 ? PdfStandard.PdfA : PdfStandard.Pdf;

            // set PDF page margins
            htmlToPdfConverter.Document.Margins = new PdfMargins(5);

            // set whether to embed the true type font in PDF
            htmlToPdfConverter.Document.FontEmbedding = collection["checkBoxFontEmbedding"].Count > 0;

            // set triggering mode; for WaitTime mode set the wait time before convert
            switch (collection["dropDownListTriggeringMode"])
            {
                case "Auto":
                    htmlToPdfConverter.TriggerMode = ConversionTriggerMode.Auto;
                    break;
                case "WaitTime":
                    htmlToPdfConverter.TriggerMode = ConversionTriggerMode.WaitTime;
                    htmlToPdfConverter.WaitBeforeConvert = int.Parse(collection["textBoxWaitTime"]);
                    break;
                case "Manual":
                    htmlToPdfConverter.TriggerMode = ConversionTriggerMode.Manual;
                    break;
                default:
                    htmlToPdfConverter.TriggerMode = ConversionTriggerMode.Auto;
                    break;
            }

            // set header and footer
            SetHeader(htmlToPdfConverter.Document);
            SetFooter(htmlToPdfConverter.Document);

            // set the document security
            htmlToPdfConverter.Document.Security.OpenPassword = collection["textBoxOpenPassword"];
            htmlToPdfConverter.Document.Security.AllowPrinting = collection["checkBoxAllowPrinting"].Count > 0;

            // set the permissions password too if an open password was set
            if (htmlToPdfConverter.Document.Security.OpenPassword != null && htmlToPdfConverter.Document.Security.OpenPassword != String.Empty)
                htmlToPdfConverter.Document.Security.PermissionsPassword = htmlToPdfConverter.Document.Security.OpenPassword + "_admin";

            // convert HTML to PDF
            byte[] pdfBuffer = null;

            if (collection["UrlOrHtmlCode"] == "radioButtonConvertUrl")
            {
                // convert URL to a PDF memory buffer
                string url = collection["textBoxUrl"];

                pdfBuffer = htmlToPdfConverter.ConvertUrlToMemory(url);
            }
            else
            {
                // convert HTML code
                string htmlCode = collection["textBoxHtmlCode"];
                string baseUrl = collection["textBoxBaseUrl"];

                // convert HTML code to a PDF memory buffer
                pdfBuffer = htmlToPdfConverter.ConvertHtmlToMemory(htmlCode, baseUrl);
            }

            FileResult fileResult = new FileContentResult(pdfBuffer, "application/pdf");
            if (collection["checkBoxOpenInline"].Count == 0)
                fileResult.FileDownloadName = "HtmlToPdf.pdf";

            return fileResult;
        }

        private void SetHeader(PdfDocumentControl htmlToPdfDocument)
        {
            // enable header display
            htmlToPdfDocument.Header.Enabled = m_formCollection["checkBoxAddHeader"].Count > 0;

            if (!htmlToPdfDocument.Header.Enabled)
                return;

            // set header height
            htmlToPdfDocument.Header.Height = 50;

            float pdfPageWidth = htmlToPdfDocument.PageOrientation == PdfPageOrientation.Portrait ?
                                        htmlToPdfDocument.PageSize.Width : htmlToPdfDocument.PageSize.Height;

            float headerWidth = pdfPageWidth - htmlToPdfDocument.Margins.Left - htmlToPdfDocument.Margins.Right;
            float headerHeight = htmlToPdfDocument.Header.Height;

            // set header background color
            htmlToPdfDocument.Header.BackgroundColor = PdfColor.WhiteSmoke;

            string headerImageFile = m_hostingEnvironment.WebRootPath + "/DemoFiles/Images/HiQPdfLogo.png";
            PdfImage logoHeaderImage = new PdfImage(5, 5, 40, headerImageFile);
            htmlToPdfDocument.Header.Layout(logoHeaderImage);

            // layout HTML in header
            PdfHtml headerHtml = new PdfHtml(50, 5, @"<span style=""color:Navy; font-family:Times New Roman; font-style:italic"">
                            Quickly Create High Quality PDFs with </span><a href=""http://www.hiqpdf.com"">HiQPdf</a>", null);
            headerHtml.FitDestHeight = true;
            headerHtml.FontEmbedding = m_formCollection["checkBoxFontEmbedding"].Count > 0;
            htmlToPdfDocument.Header.Layout(headerHtml);

            // create a border for header

            PdfRectangle borderRectangle = new PdfRectangle(1, 1, headerWidth - 2, headerHeight - 2);
            borderRectangle.LineStyle.LineWidth = 0.5f;
            borderRectangle.ForeColor = PdfColor.Navy;
            htmlToPdfDocument.Header.Layout(borderRectangle);
        }

        private void SetFooter(PdfDocumentControl htmlToPdfDocument)
        {
            // enable footer display
            htmlToPdfDocument.Footer.Enabled = m_formCollection["checkBoxAddFooter"].Count > 0;

            if (!htmlToPdfDocument.Footer.Enabled)
                return;

            // set footer height
            htmlToPdfDocument.Footer.Height = 50;

            // set footer background color
            htmlToPdfDocument.Footer.BackgroundColor = PdfColor.WhiteSmoke;

            float pdfPageWidth = htmlToPdfDocument.PageOrientation == PdfPageOrientation.Portrait ?
                                        htmlToPdfDocument.PageSize.Width : htmlToPdfDocument.PageSize.Height;

            float footerWidth = pdfPageWidth - htmlToPdfDocument.Margins.Left - htmlToPdfDocument.Margins.Right;
            float footerHeight = htmlToPdfDocument.Footer.Height;

            // layout HTML in footer
            PdfHtml footerHtml = new PdfHtml(5, 5, @"<span style=""color:Navy; font-family:Times New Roman; font-style:italic"">
                            Quickly Create High Quality PDFs with </span><a href=""http://www.hiqpdf.com"">HiQPdf</a>", null);
            footerHtml.FitDestHeight = true;
            footerHtml.FontEmbedding = m_formCollection["checkBoxFontEmbedding"].Count > 0;
            htmlToPdfDocument.Footer.Layout(footerHtml);

            // add page numbering
            PdfFont pageNumberingFont = new PdfFont("Times New Roman", 8, true);
            PdfText pageNumberingText = new PdfText(5, footerHeight - 12, "Page {CrtPage} of {PageCount}", pageNumberingFont);
            pageNumberingText.HorizontalAlign = PdfTextHAlign.Center;
            pageNumberingText.EmbedSystemFont = true;
            pageNumberingText.ForeColor = PdfColor.DarkGreen;
            htmlToPdfDocument.Footer.Layout(pageNumberingText);

            string footerImageFile = m_hostingEnvironment.WebRootPath + "/DemoFiles/Images/HiQPdfLogo.png";
            PdfImage logoFooterImage = new PdfImage(footerWidth - 40 - 5, 5, 40, footerImageFile);
            htmlToPdfDocument.Footer.Layout(logoFooterImage);

            // create a border for footer
            PdfRectangle borderRectangle = new PdfRectangle(1, 1, footerWidth - 2, footerHeight - 2);
            borderRectangle.LineStyle.LineWidth = 0.5f;
            borderRectangle.ForeColor = PdfColor.DarkGreen;
            htmlToPdfDocument.Footer.Layout(borderRectangle);
        }

        private PdfPageSize GetSelectedPageSize()
        {
            switch (m_formCollection["dropDownListPageSizes"])
            {
                case "A0":
                    return PdfPageSize.A0;
                case "A1":
                    return PdfPageSize.A1;
                case "A10":
                    return PdfPageSize.A10;
                case "A2":
                    return PdfPageSize.A2;
                case "A3":
                    return PdfPageSize.A3;
                case "A4":
                    return PdfPageSize.A4;
                case "A5":
                    return PdfPageSize.A5;
                case "A6":
                    return PdfPageSize.A6;
                case "A7":
                    return PdfPageSize.A7;
                case "A8":
                    return PdfPageSize.A8;
                case "A9":
                    return PdfPageSize.A9;
                case "ArchA":
                    return PdfPageSize.ArchA;
                case "ArchB":
                    return PdfPageSize.ArchB;
                case "ArchC":
                    return PdfPageSize.ArchC;
                case "ArchD":
                    return PdfPageSize.ArchD;
                case "ArchE":
                    return PdfPageSize.ArchE;
                case "B0":
                    return PdfPageSize.B0;
                case "B1":
                    return PdfPageSize.B1;
                case "B2":
                    return PdfPageSize.B2;
                case "B3":
                    return PdfPageSize.B3;
                case "B4":
                    return PdfPageSize.B4;
                case "B5":
                    return PdfPageSize.B5;
                case "Flsa":
                    return PdfPageSize.Flsa;
                case "HalfLetter":
                    return PdfPageSize.HalfLetter;
                case "Ledger":
                    return PdfPageSize.Ledger;
                case "Legal":
                    return PdfPageSize.Legal;
                case "Letter":
                    return PdfPageSize.Letter;
                case "Letter11x17":
                    return PdfPageSize.Letter11x17;
                case "Note":
                    return PdfPageSize.Note;
                default:
                    return PdfPageSize.A4;
            }
        }

        private PdfPageOrientation GetSelectedPageOrientation()
        {
            return (m_formCollection["dropDownListPageOrientations"] == "Portrait") ?
                PdfPageOrientation.Portrait : PdfPageOrientation.Landscape;
        }
    }
}