Skip to main content

Integration Guide

Generate PDFs from HTML, URLs, or Markdown in 5 minutes.

Providers

The PDF Generator supports multiple rendering engines.

Step 1: Install Package

dotnet add package PrimusSaaS.PdfGenerator

Step 2: Configure in Program.cs

using Primus.PdfGenerator;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddPrimusPdfGenerator(opts => {
// Bind configuration
builder.Configuration.GetSection("PrimusPdfGenerator").Bind(opts);

// Explicitly set provider if not in appsettings
opts.Provider = PdfProvider.Playwright;
});

var app = builder.Build();
app.MapControllers();
app.Run();

Step 3: Configure appsettings.json

{
"PrimusPdfGenerator": {
"Provider": "Playwright",
"TimeoutSeconds": 30,
"Headless": true,
"DefaultFormat": "A4",
"DefaultMargins": {
"Top": "20mm",
"Bottom": "20mm",
"Left": "20mm",
"Right": "20mm"
}
}
}
Configuration Notes
  • Provider: Playwright (requires Playwright dependencies installed)
  • TimeoutSeconds: Max time to wait for rendering

Step 4: Create PDF Controller

Create Controllers/ReportController.cs:

using Microsoft.AspNetCore.Mvc;
using Primus.PdfGenerator;

namespace YourApp.Controllers;

[ApiController]
[Route("api/[controller]")]
public class ReportController : ControllerBase
{
private readonly IPdfGenerator _pdf;

public ReportController(IPdfGenerator pdf)
{
_pdf = pdf;
}

[HttpPost("generate")]
public async Task<IActionResult> GenerateReport([FromBody] ReportRequest request)
{
var html = $@"
<html>
<body>
<h1>{request.Title}</h1>
<p>{request.Content}</p>
</body>
</html>";

var options = new PdfOptions { Format = PdfPageFormat.A4 };
var pdf = await _pdf.GenerateFromHtmlAsync(html, options);

return File(pdf, "application/pdf", "report.pdf");
}

[HttpGet("screenshot")]
public async Task<IActionResult> ScreenshotUrl([FromQuery] string url)
{
var pdf = await _pdf.GenerateFromUrlAsync(url, new PdfOptions
{
Format = PdfPageFormat.Letter,
Landscape = true
});

return File(pdf, "application/pdf", "screenshot.pdf");
}
}

public record ReportRequest(string Title, string Content);

Step 5: Test Endpoints

# Generate from HTML
curl -X POST http://localhost:5000/api/report/generate \
-H "Content-Type: application/json" \
-d '{"title": "Test Report", "content": "Hello World"}' \
--output report.pdf

# Capture URL
curl "http://localhost:5000/api/report/screenshot?url=https://example.com" \
--output screenshot.pdf

Provider 2: Puppeteer

Step 1: Install Package

dotnet add package PrimusSaaS.PdfGenerator

Step 2: Configure in Program.cs

builder.Services.AddPrimusPdfGenerator(opts => {
opts.Provider = PdfProvider.Puppeteer;
// ...
});

Step 3: Configure appsettings.json

{
"PrimusPdfGenerator": {
"Provider": "Puppeteer"
}
}

Step 4 & 5

(Reuse Controller and Test commands)


Configuration Reference

PDF Generator Options

OptionTypeDefaultDescription
ProviderPdfProviderPlaywrightRendering engine
HeadlessbooltrueRun browser in headless mode
TimeoutSecondsint30Render timeout
ChromiumPathstringnullCustom browser path

Examples

Example 1: Custom Headers/Footers

var options = new PdfOptions
{
DisplayHeaderFooter = true,
HeaderTemplate = "<div style='font-size:10px;'>Confidential</div>",
FooterTemplate = "<div style='font-size:10px;'>Page <span class='pageNumber'></span></div>"
};

Troubleshooting

Issue: Browser missing

Error: Executable doesn't exist

Solution:

  1. For Playwright: pwsh bin/Debug/net8.0/playwright.ps1 install
  2. For Puppeteer: Ensure Chrome/Chromium is installed or downloaded.