How to Generate PDF Reports from HTML in C#
In this post, you’ll learn how to generate PDF reports from HTML using our C# PDF Generator API. With our API, you receive 100 credits with the free plan. Different operations on a document consume different amounts of credits, so the number of PDF reports you can generate may vary. To access your API key, sign up for a free account.
This will be especially useful if you generate and distribute a high volume of standardized reports throughout the year. With our API, you can automate your report generation by dynamically injecting data and content into a standardized HTML template.
We’ll demonstrate how you can generate a report with a free PDF report template in HTML and CSS that can be customized to meet your specific requirements. You can easily style your report by updating the CSS file with your own custom images and fonts. For reports that span multiple pages, you can add a header and footer that repeats across all your pages.
Requirements
To get started, you’ll need:
-
The .Net SDK
To access your PSPDFKit API key, sign up for a free account. Your account lets you generate 100 documents for free every month. Once you’ve signed up, you can find your API key in the Dashboard > API Keys section.
You can find a similar example made for a receipt template on GitHub.
Creating a New .NET Project
You’ll create a new .NET project via the .NET command-line interface (CLI) with the following command:
dotnet new console --name PspdfkitApiDemo
Change your directory into the newly created project directory:
cd PspdfkitApiDemo
To make an HTTP request, install RestSharp
as a dependency:
dotnet add package RestSharp -v 106.15.0
Downloading the Report Template
Download the report template and extract the contents of the ZIP file into a folder. You’ll get an HTML file, Inter fonts, a Space Mono font, an SVG logo, images, and a README file.
Creating a CSS File
If you open the index.html
file, you’ll see the styles between the opening and closing <style>
tag. Copy the styles to a new file called style.css
, and save it in the same folder:
@font-face { font-family: 'Inter'; src: url('Inter-Regular.ttf') format('truetype'); font-weight: 400; font-style: normal; } @font-face { font-family: 'Inter'; src: url('Inter-Medium.ttf') format('truetype'); font-weight: 500; font-style: normal; } @font-face { font-family: 'Inter'; src: url('Inter-Bold.ttf') format('truetype'); font-weight: 700; font-style: normal; } @font-face { font-family: 'Space Mono'; src: url('SpaceMono-Regular.ttf') format('truetype'); font-weight: 400; font-style: normal; } body { font-size: 0.75rem; font-family: 'Inter', sans-serif; font-weight: 400; color: #000000; margin: 0 auto; position: relative; } #pspdfkit-header { font-size: 0.625rem; text-transform: uppercase; letter-spacing: 2px; font-weight: 400; color: #717885; margin-top: 2.5rem; margin-bottom: 2.5rem; width: 100%; } .header-columns { display: flex; justify-content: space-between; padding-left: 2.5rem; padding-right: 2.5rem; } .logo { height: 1.5rem; width: auto; margin-right: 1rem; } .logotype { display: flex; align-items: center; font-weight: 700; } h1 { font-family: 'Space Mono', monospace; font-size: 2.25rem; font-weight: 400; } h2 { font-family: 'Space Mono', monospace; font-size: 1.5rem; font-weight: 400; } h3 { font-family: 'Space Mono', monospace; font-size: 1.25rem; font-weight: 400; } h4 { font-family: 'Inter', sans-serif; font-size: 1rem; font-weight: 400; } .page { margin-left: 5rem; margin-right: 5rem; } .column-layout { display: flex; justify-content: space-between; margin: 3rem 0 5rem 0; gap: 2rem; } .column { display: flex; flex-direction: column; } .width-30 { width: 30%; } .width-70 { width: 70%; } .column-title { font-size: 0.625rem; margin: 0; } .full-width { width: 100%; } .spacer-1 { height: 1rem; } .spacer-2 { height: 2rem; } .line-break { height: 1px; width: 100%; background-color: #000000; margin: 2.5rem 0 2.5rem 0; } .margin-b-0 { margin-bottom: 0; } .margin-t-0 { margin-top: 0; } .text-blue { color: #4537de; } #pspdfkit-footer { font-size: 0.5rem; text-transform: uppercase; letter-spacing: 1px; font-weight: 500; color: #717885; margin-top: 2.5rem; bottom: 2.5rem; position: absolute; width: 100%; } .footer-columns { display: flex; justify-content: space-between; padding-left: 2.5rem; padding-right: 2.5rem; }
To access the styles from index.html
, use the <link>
tag. While referring to the stylesheet file, just use the name of the file and don’t create nested paths:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Report</title> <link rel="stylesheet" href="style.css" /> </head> </html>
Interacting with the API
Now, open the Program.cs
file. It should have the Program
class with the Main
method:
using System; using System.IO; using System.Net; using RestSharp; namespace PspdfkitApiDemo { class Program { static void Main(string[] args) { // Implement your call to PSPDFKit API here. } } }
Preparing the Request
Next, you can start making your request. Use the RestClient
class to make requests to the PSPDFKit API /build
endpoint.
Then, create a RestRequest
with the required authorization header, the files you want to send, and the instructions
as a parameter:
using System; using System.IO; using System.Net; using RestSharp; namespace PspdfkitApiDemo { class Program { static void Main(string[] args) { var client = new RestClient("https://api.pspdfkit.com/build"); var request = new RestRequest(Method.POST) .AddHeader("Authorization", "Bearer {YOUR_API_KEY}") // Replace {YOUR_API_KEY} with your API key. .AddFile("index.html", "index.html") .AddFile("style.css", "style.css") .AddFile("Inter-Regular.ttf", "Inter-Regular.ttf") .AddFile("Inter-Medium.ttf", "Inter-Medium.ttf") .AddFile("Inter-Bold.ttf", "Inter-Bold.ttf") .AddFile("SpaceMono-Regular.ttf", "SpaceMono-Regular.ttf") .AddFile("logo.svg", "logo.svg") .AddFile("photo-1.png", "photo-1.png") .AddFile("photo-2.png", "photo-2.png") .AddFile("photo-3.png", "photo-3.png") .AddFile("photo-4.png", "photo-4.png") .AddParameter("instructions", new JsonObject { ["parts"] = new JsonArray { new JsonObject { ["html"] = "index.html", ["assets"] = new JsonArray { "style.css", "Inter-Regular.ttf", "Inter-Medium.ttf", "Inter-Bold.ttf", "SpaceMono-Regular.ttf", "logo.svg", "photo-1.png", "photo-2.png", "photo-3.png", "photo-4.png" } } } } .ToString()); } } }
After making a successful request, save the response to a file. Then, stream the response to a file using AdvancedResponseWriter
on your request:
request.AdvancedResponseWriter = (responseStream, response) => { if (response.StatusCode == HttpStatusCode.OK) { using (responseStream) { using var outputFileWriter = File.OpenWrite("result.pdf"); responseStream.CopyTo(outputFileWriter); } } else { var responseStreamReader = new StreamReader(responseStream); Console.Write(responseStreamReader.ReadToEnd()); } };
Executing the Request
All that’s left is to execute your request:
var response = client.Execute(request);
This will save the resulting PDF in the root directory of the project as result.pdf
.
To generate the PDF, go to your terminal and run:
dotnet run
You can see the full code below:
// Program.cs using System; using System.IO; using System.Net; using RestSharp; namespace PspdfkitApiDemo { class Program { static void Main(string[] args) { var client = new RestClient("https://api.pspdfkit.com/build"); var request = new RestRequest(Method.POST) .AddHeader("Authorization", "Bearer {YOUR_API_KEY}") // Replace {YOUR_API_KEY} with your API key. .AddFile("index.html", "index.html") .AddFile("style.css", "style.css") .AddFile("Inter-Regular.ttf", "Inter-Regular.ttf") .AddFile("Inter-Medium.ttf", "Inter-Medium.ttf") .AddFile("Inter-Bold.ttf", "Inter-Bold.ttf") .AddFile("SpaceMono-Regular.ttf", "SpaceMono-Regular.ttf") .AddFile("logo.svg", "logo.svg") .AddFile("photo-1.png", "photo-1.png") .AddFile("photo-2.png", "photo-2.png") .AddFile("photo-3.png", "photo-3.png") .AddFile("photo-4.png", "photo-4.png") .AddParameter("instructions", new JsonObject { ["parts"] = new JsonArray { new JsonObject { ["html"] = "index.html", ["assets"] = new JsonArray { "style.css", "Inter-Regular.ttf", "Inter-Medium.ttf", "Inter-Bold.ttf", "SpaceMono-Regular.ttf", "logo.svg", "photo-1.png", "photo-2.png", "photo-3.png", "photo-4.png" } } } } .ToString()); request.AdvancedResponseWriter = (responseStream, response) => { if (response.StatusCode == HttpStatusCode.OK) { using (responseStream) { using var outputFileWriter = File.OpenWrite("result.pdf"); responseStream.CopyTo(outputFileWriter); } } else { var responseStreamReader = new StreamReader(responseStream); Console.Write(responseStreamReader.ReadToEnd()); } }; client.Execute(request); } } }
Conclusion
In this post, you generated a PDF report from an HTML template using our C# PDF generation API. We created similar PDF report generation guides using sample code from other programming languages:
In addition to templates for generating reports, we created free templates for other commonly used documents, like receipts, invoices, and certificates. If you’re interested in generating other types of documents in C#, check out the following posts:
- Generating PDF receipts using C#
- Generating PDF invoices using C#
- Generating PDF certificates using C#
All our templates are available for you to download on our PDF Generator API page. Feel free to customize or add any CSS to the template to fit your use case or help reflect your company’s brand.