Export to PDF in C#

ApexCharts, by default, provides a way to enable users to download individual charts in PNG or SVG by configuring the toolbar. However, when it comes to generating charts on the server, things could become a bit challenging. Imagine you want to write a CRON job to send reports with charts in them, allow users to download PDF reports in the realtime, or send these reports as an attachment to someone else; this is where server-side chart generation becomes essential. We will be learning the same throughout the tutorial. Traditionally when it comes to exporting charts on the server, we use headless browsers like Puppeteer or PhantomJS. But for this tutorial, we will be using FusionExport. Now the obvious question is:

Why FusionExport?

When there is something like Puppeteer or PhantomJS available, why use anything else? Well, you know what happened to PhantomJS – discontinued. On the other hand, FusionExport is a product actively maintained and developed by FusionCharts. Here are a few reasons why we are using FusionExport:
  1. User-friendly APIs: FusionExport provides excellent APIs focused on exporting charts and dashboards, which help you save time as well.
  2. Integrations: It offers SDKs for C#, Java, Node.js, Python, and PHP. So even if your infra doesn’t support Node.js, no need to worry about it!
  3. Support: If you are facing any issues, you can always reach out to their support team, and you will get the answer in a matter of a few hours.
  4. Documentation: It provides excellent documentation with examples of real-world scenarios as well.
  5. Stability: FusionCharts actively develops FusionExport, and many enterprises around the world use it.
So, let’s go ahead and start with the installation of FusionExport.

Installation of FusionExport

Installation of FusionExport contains two steps:
  1. Setting up the FusionExport server
  2. Installing the SDKs in your project
Setting up the FusionExport server
Download FusionExport for the choice of your platform. Once you have downloaded it, unzip the package and open the terminal to run the following command:
./fusionexport
If you are using Windows then open PowerShell and run the following command:
./fusionexport.bat
Once done, your server will start running on the port number 1337 and the console will show messages similar to the screenshot below:
Installing the C# SDK
Now we have our export server running, we will install the FusionExport C# SDK. But first let’s create a C# project using Visual Studio.
To create a project in C#, open Visual Studio and follow the steps below:
Click on ‘New’ to create a project.
Select Other> .NET and Click on ‘Console Project’.
Configure the project name, location etc and click on ‘Create’.
Once project is created, it will look like this:
Now that we have created a project, let’s install FusionExport C# client from the Nuget. To do that, open the Nuget Package Manager Console and type the following command:
Install-Package FusionExport
Alternatively you can go to manage NuGet packages, search for fusionexport and add that package.

Exporting a simple HTML to PDF

Let’s first export a simple HTML snippet to PDF before Apex Charts to give you a brief idea of how it works. Open the program.cs file and include the dependencies:

  
using System;
using System.Collections.Generic;
using FusionCharts.FusionExport.Client;

namespace ApexChartsExport
{
    class Program
    {
        static void Main(string[] args)
        {
          ExportConfig exportConfig = new ExportConfig();
          ExportManager exportManager = new ExportManager();
As you can see above, we have imported two modules from fusionexport and instantiated them:
  1. ExportConfig: This is where you will provide all the configurations to FusionExport like file type, template, etc.
  2. ExportManager: Once you have defined the configurations, you will be passing them to ExportManager, which will further take care of exporting.
Let’s create a simple HTML called template.html file in ApexCharts-Export/bin/debug/resources.

<html>
  <body>
    <h1>Hello World</h1>
  </body>
</html>
Now we define its path and the configurations to export in program.cs file.

//define the path of template.html file created 
string templateFile = System.Environment.CurrentDirectory + "/resources/template.html";

using (ExportManager exportManager = new ExportManager())
  {
#Provide path of the chart configuration which we have defined above.
// You can also pass the same object as serialized JSON.
    exportConfig.Set("templateFilePath", templateFile);
// ++++++ ATTENTION - MODIFY THE EXPORT TYPE ++++++
// OPTIONS ARE: 'png' (default) | 'jpeg' | 'pdf' | 'svg' | 'html' | 'csv' | 'xls' | 'xlsx'
    exportConfig.Set("type", "pdf");
    exportConfig.Set("templateFormat", "A4");
}
As you can see, we are using three properties to configure:
  1. templateFilePath: This accepts the path of the HTML template which we have created.
  2. type: File format in which you want to export. We are using pdf but you can also use jpg, png and svg.
  3. templateFormat: We are setting the page format to A4. There are 7 more formats supported like A3, Letter, etc.
You can check all the available options on FusionExport’s API Reference page Now, let’s export your first page:

//define the path of template.html file created 
string templateFile = System.Environment.CurrentDirectory + "/resources/template.html";

using (ExportManager exportManager = new ExportManager())
  {
#Provide path of the chart configuration which we have defined above.
// You can also pass the same object as serialized JSON.
    exportConfig.Set("templateFilePath", templateFile);
// ++++++ ATTENTION - MODIFY THE EXPORT TYPE ++++++
// OPTIONS ARE: 'png' (default) | 'jpeg' | 'pdf' | 'svg' | 'html' | 'csv' | 'xls' | 'xlsx'
    exportConfig.Set("type", "pdf");
    exportConfig.Set("templateFormat", "A4");
}
As you can see above, we are passing exportConfig to the export method. By default, your exported file will be present inside a zip, hence we set the unzip flag to true so that it will not be zipped. Your final code will like:


using System;
using System.Collections.Generic;
using FusionCharts.FusionExport.Client;

namespace ApexChartsExport
{
    class Program
    {
        static void Main(string[] args)
        {
//Provide the path of the template.html file created 
            string templateFile = System.Environment.CurrentDirectory + "/resources/template.html";
// Instantiate the ExportConfig class and add the required configurations
            ExportConfig exportConfig = new ExportConfig();
            List results = new List();

// Instantiate the ExportManager class
            using (ExportManager exportManager = new ExportManager())
            {
                exportConfig.Set("templateFilePath", templateFile);
                exportConfig.Set("type", "pdf");
                exportConfig.Set("templateFormat", "A4");
                string tmpPath = Environment.GetEnvironmentVariable("%TMP%", EnvironmentVariableTarget.User);
// Call the Export() method with the export config
                results.AddRange(exportManager.Export(exportConfig, tmpPath, true));
            }
            foreach (string path in results)
            {
                Console.WriteLine(path);
            }
            Console.Read();
        }
    }
}
  Output after exporting HTML to PDF

Exporting ApexCharts to PDF

Now that we know how to export a simple HTML file let’s learn how to export ApexCharts. There are three important steps to perform this:
  1. Write an HTML template with JavaScript: Unlike earlier examples, we will be writing not just the HTML but also the JavaScript in the template, which will render the chart.
  2. Set up the configurations: As mentioned, we will be providing the configurations with the template to FusionExport
  3. Export!
Let’s create a simple HTML called template.html which will have the ApexCharts code as well.

<html>
    <body>
        <h1>ApexCharts Demo with FusionExport</h1>
        <div id="chart"></div>
        <script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>
        <script>
            var options = {
                chart: { type: 'line' },
                series: [{
                    name: 'sales',
                    data: [10,70,40,50,49,60,70,91,125]
                }],
                xaxis: {
                    categories: [1991,1992,1993,1994,1995,1996,1997,1998,1999]
                }
            }
            var chart = new ApexCharts(document.querySelector("#chart"), options);
    
            chart.render();
        </script>
    </body>
</html>
There are a few things happening in the code:
  1. We have added ApexCharts library from CDN
  2. We are rendering a simple line chart in the script tag
  3. Since we won’t be rendering it as a webpage in the browser, we have skipped head and meta tags as well.
If you open this file in a browser, you will find a line chart being rendering with a header on the top. We will be passing this FusionExport with similar configurations mentioned earlier. Behind the scene, FusionExport also comes with a headless browser that will take this template and render it in the headless browser. After this, it will apply various options provided via the configuration, followed by generating the final exported file. Now, let’s go back to program.cs file and add the following code to read the HTML template and pass it to FusionExport:


// Instantiate the ExportConfig class and add the required configurations
ExportConfig exportConfig = new ExportConfig();
 // Instantiate the ExportManager class
using (ExportManager exportManager = new ExportManager())
  {
// Provide path of the chart configuration which we have defined above.  
// You can also pass the same object as serialized JSON.
    exportConfig.Set("templateFilePath", templateFile);
// ++++++ ATTENTION - MODIFY THE EXPORT TYPE ++++++
// OPTIONS ARE: 'png' (default) | 'jpeg' | 'pdf' | 'svg' | 'html' | 'csv' | 'xls' | 'xlsx'
    exportConfig.Set("type", "pdf");
    exportConfig.Set("templateFormat", "A4");
    exportConfig.Set("asyncCapture", true);
}
  1. We have added a property called asyncCapture which waits till the charts are loaded. It is extremely handy when you have charts with animations.
  2. We have kept the rest of the configurations the same.
Your final code should look like this:

using System;
using System.Collections.Generic;
using FusionCharts.FusionExport.Client;

namespace ApexChartsExport
{
    class Program
    {
        static void Main(string[] args)
        {
//Provide the path of the template.html file created 
            string templateFile = System.Environment.CurrentDirectory + "/resources/template.html";
// Instantiate the ExportConfig class and add the required configurations
            ExportConfig exportConfig = new ExportConfig();
            List results = new List();

// Instantiate the ExportManager class
            using (ExportManager exportManager = new ExportManager())
            {
                exportConfig.Set("templateFilePath", templateFile);
                exportConfig.Set("type", "pdf");
                exportConfig.Set("templateFormat", "A4");
                exportConfig.Set("asyncCapture", true);
                string tmpPath = Environment.GetEnvironmentVariable("%TMP%", EnvironmentVariableTarget.User);
// Call the Export() method with the export config
                results.AddRange(exportManager.Export(exportConfig, tmpPath, true));
            }
            foreach (string path in results)
            {
                Console.WriteLine(path);
            }
            Console.Read();
        }
    }
}
Output after exporting HTML to PDF with ApexCharts

Making it pretty

Now that you have exported your first chart. Let’s make it pretty by adding some styles:

body {
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
    padding: 1em;
}
h1 { text-align: center; }
#chart { margin-top: 1em; }
We will be adding the above code snippet in the head. In the above code, we are doing the following things:
  1. Replaced the default serif font with system font which means in case of latest macOS, you will see San Fransisco
  2. We have added padding across the page
  3. Made the header center-aligned and added some margin between header and chart
Also, let’s remove the hamburger menu from the chart because it is completely irrelevant in this case.

chart: {
    type: 'line',
    toolbar: { tools: { download: false } }
}
Once, you have made the changes your file will look like this: Output after exporting HTML to PDF with ApexCharts That’s all folks. This is how you export a single chart made in ApexCharts on the server. Feel free to download the source code on Github. If you have any feedback or found any issues, submit an issue on the repository.

What’s next?

Now that you know how to export a single chart, you can similarly add more charts in the PDF. You can even add your CSS to customize the look. Furthermore, you can use a similar way to write CRON jobs to send emails with PDF attachments or even allow users to download dashboards in realtime. For more such demos check our dashboards built with ApexCharts and FusionExport.