Convert HTML to PDF in Azure Functions Linux

20 Sep 202412 minutes to read

The Syncfusion HTML to PDF converter is a .NET Core library for converting webpages, SVG, MHTML, and HTML to PDF using C#. The result preserves all graphics, images, text, fonts, and the layout of the original HTML document or webpage. Using this library, you can convert an HTML to PDF using C# with the Blink rendering engine in Azure Functions Linux.

NOTE

HTML to PDF converter is not supported with Azure App Service windows. We internally use Blink rendering engine for the conversion, it uses GDI calls for viewing and rendering the webpages. But Azure app service blocks GDI calls in the Azure website environment. As the Azure website does not have the elevated permission and enough rights, we can not launch the Chrome headless browser in the Azure app service windows (Azure website and Azure function).

Step 1: Create the Azure function project.
Convert HTMLToPDF Azure Functions Step1

Step 2: Select the Azure Functions type and .NET Core version.
Convert HTMLToPDF Azure Functions Step2

Step 3: Select the function worker as .NET 8.0 isolated (Long-term support), and the selected HTTP triggers as follows.
Convert HTMLToPDF Azure Functions Step3

Step 4: Install the Syncfusion.HtmlToPdfConverter.Net.Linux NuGet package as a reference to your .NET Core application NuGet.org.
Convert HTMLToPDF Azure Functions Step3

NOTE

Starting with v16.2.0.x, if you reference Syncfusion assemblies from trial setup or from the NuGet feed, you also have to add “Syncfusion.Licensing” assembly reference and include a license key in your projects. Please refer to this link to know about registering Syncfusion license key in your application to use our components.

Step 5: Include the following namespaces in Function1.cs file.

  • C#
  • using Syncfusion.HtmlConverter;
        using Syncfusion.Pdf;
        using Syncfusion.Pdf.Graphics;
        using System.Runtime.InteropServices;

    Step 6: Add the following code example in the Function1 class to convert HTML to PDF document using Convert method in HtmlToPdfConverter class. The Blink command line arguments based on the given CommandLineArguments property of BlinkConverterSettings class.

  • C#
  • [Function("Function1")]
        public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, ILogger log, FunctionContext executionContext)
        {
            string blinkBinariesPath = string.Empty;
            //Create a new PDF document.
            PdfDocument document;
            BlinkConverterSettings settings = new BlinkConverterSettings();
            //Creating the stream object.
            MemoryStream stream;
            try
            {
                blinkBinariesPath = SetupBlinkBinaries();              
                    
                //Initialize the HTML to PDF converter with the Blink rendering engine.
                HtmlToPdfConverter htmlConverter = new HtmlToPdfConverter(HtmlRenderingEngine.Blink);
                  
                //Set command line arguments to run without sandbox.
                settings.CommandLineArguments.Add("--no-sandbox");
                settings.CommandLineArguments.Add("--disable-setuid-sandbox");
                settings.BlinkPath = blinkBinariesPath;
                //Assign BlinkConverter settings to the HTML converter 
                htmlConverter.ConverterSettings = settings;
                //Convert URL to PDF
                document = htmlConverter.Convert("http://www.syncfusion.com");
                stream = new MemoryStream();
                //Save and close the PDF document  
                document.Save(stream);
            }
            catch(Exception ex)
            {
                //Create a new PDF document.
                document = new PdfDocument();
                //Add a page to the document.
                PdfPage page = document.Pages.Add();
                //Create PDF graphics for the page.
                PdfGraphics graphics = page.Graphics;
    
                //Set the standard font.
                PdfFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 8);
                //Draw the text.
                graphics.DrawString(ex.Message.ToString(), font, PdfBrushes.Black, new Syncfusion.Drawing.PointF(0, 0));
                  
                stream = new MemoryStream();
                //Save the document into memory stream.
                document.Save(stream);
            }
            document.Close();
            stream.Position = 0;
            return new FileStreamResult(stream, "application/pdf");
        }

    Step 7: Add the following helper methods to copy and set permission to the BlinkBinariesLinux folder.

  • C#
  • private static string SetupBlinkBinaries( )
        {
            var fileInfo = new FileInfo(Assembly.GetExecutingAssembly().Location);
            string path = fileInfo.Directory.Parent.FullName;
            string blinkAppDir = Path.Combine(path, @"wwwroot");
            string tempBlinkDir = Path.GetTempPath();
            string chromePath = Path.Combine(tempBlinkDir, "chrome");
            if (!File.Exists(chromePath))
            {
                CopyFilesRecursively(blinkAppDir, tempBlinkDir);
                SetExecutablePermission(tempBlinkDir);
            }
            return tempBlinkDir;
        }
        private static void CopyFilesRecursively(string sourcePath, string targetPath)
        {
            //Create all the directories from the source to the destination path.
            foreach (string dirPath in Directory.GetDirectories(sourcePath, "*", SearchOption.AllDirectories))
            {
                Directory.CreateDirectory(dirPath.Replace(sourcePath, targetPath));
            }
            //Copy all the files from the source path to the destination path.
            foreach (string newPath in Directory.GetFiles(sourcePath, "*.*", SearchOption.AllDirectories))
            {
                File.Copy(newPath, newPath.Replace(sourcePath, targetPath), true);
            }
        }
        [DllImport("libc", SetLastError = true, EntryPoint = "chmod")]
        internal static extern int Chmod(string path, FileAccessPermissions mode);
        private static void SetExecutablePermission(string tempBlinkDir)
        {
            FileAccessPermissions ExecutableFilePermissions = FileAccessPermissions.UserRead | FileAccessPermissions.UserWrite | FileAccessPermissions.UserExecute |
            FileAccessPermissions.GroupRead | FileAccessPermissions.GroupExecute | FileAccessPermissions.OtherRead | FileAccessPermissions.OtherExecute;
            string[] executableFiles = new string[] { "chrome", "chrome_sandbox" };
            foreach (string executable in executableFiles)
            {
                var execPath = Path.Combine(tempBlinkDir, executable);
                if (File.Exists(execPath))
                {
                    var code = Function1.Chmod(execPath, ExecutableFilePermissions);
                    if (code != 0)
                    {
                        throw new Exception("Chmod operation failed");
                    }
                }
            }
        }

    Step 8: Include the below enum in the Function1.cs file.

  • C#
  • [Flags]
        internal enum FileAccessPermissions : uint
        {
            OtherExecute = 1,
            OtherWrite = 2,
            OtherRead = 4,
            GroupExecute = 8,
            GroupWrite = 16,
            GroupRead = 32,
            UserExecute = 64,
            UserWrite = 128,
            UserRead = 256
        }

    Publish to Azure Functions Linux

    Step 1: Right-click the project and select Publish. Then, create a new profile in the Publish Window.
    Create a new profile in the Publish Window

    Step 2: Select the target as Azure and click Next.
    Select the target as Azure

    Step 3: Right-click the project and select Publish. Then, create a new profile in the Publish Window. The Blink rendering engine will work in consumption plan. So, you can create the Azure Function App service with a consumption plan.
    Convert HTMLToPDF Azure Functions Step4

    Step 4: Select the Create new.
    Configure Hosting Plan

    Step 5: Click Create.
    Browser will open after publish

    Step 6: After creating the function app service, click Finish.
    Creating app service

    Step 7: Click Close button.
    Create a ASP.NET Core Project

    Step 8: Click Publish.
    Click the Publish button

    Step 9: Now, Publish has succeeded.
    Publish has been succeeded

    Step 10: Now, go to the Azure portal and select the App Services. After running the service, click Get function URL > Copy. Include the URL as a query string in the URL. Then, paste it into the new browser tab. You will get the PDF document as follows.
    Convert HTMLToPDF Azure Functions Step6

    A complete working sample can be downloaded from Github

    Click here to explore the rich set of Syncfusion HTML to PDF converter library features.

    An online sample link to convert HTML to PDF document in ASP.NET Core.

    Click here to explore the rich set of Syncfusion HTML to PDF converter library features.

    An online sample link to convert HTML to PDF document in ASP.NET Core.