EHTISHAM AKRAM
EHTISHAM AKRAM

Reputation: 1

How can I convert HTML to PDF in C# on Azure App Service (Free Tier) - IronPdf Slow Performance

I deployed my ASP.NET Core app to Azure App Service (Free Tier) and I'm using IronPdf to convert HTML to PDF in C#. The problem is that PDF generation is incredibly slow—even a simple page takes 20-30 seconds to render, and anything more complex sometimes times out. When I test the exact same code on my local machine, it runs in about 1-2 seconds, so this seems to be an Azure-specific issue.

     async Task GeneratePDF(string htmlContent)
 {
     var renderer = new ChromePdfRenderer();

     renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen;
     renderer.RenderingOptions.EnableJavaScript = false; 
     renderer.RenderingOptions.ViewPortWidth = 1280; 
     renderer.RenderingOptions.FirstPageNumber = 1;


     PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync(htmlContent);

     string outputPath = Path.Combine(Directory.GetCurrentDirectory(), "output.pdf");
     pdf.SaveAs(outputPath);
 }

My client wants to continue using IronPDF because their PDFs exactly match their HTML designs. So I don't want people promoting other libraries I need help with IronPDF

Upvotes: 0

Views: 54

Answers (1)

Sirra Sneha
Sirra Sneha

Reputation: 1197

It is recommended to upgrade from the Free Tier to the Basic or Standard plan because,

  • The Free Tier is slow and may time out due to limits on processing power. Upgrading to Basic or Standard makes PDF generation faster and more reliable.

I tested PDF generation in the Free Tier, and it took about 20 seconds for large files without any timeout errors.

I've added the below lines that increase the render delay and increase timeout to prevent errors.

renderer.RenderingOptions.RenderDelay = 5000;
renderer.RenderingOptions.Timeout = 60000;

As the default timeout is too short, so increasing it to 60 seconds ensures the PDF generation completes without failure.

My Program.cs:

using IronPdf;

var builder = WebApplication.CreateBuilder(args);

IronPdf.License.LicenseKey = "<License-key>";
builder.Services.AddControllers();
builder.Services.AddCors();
builder.Logging.AddConsole(); 

var app = builder.Build();

app.UseHttpsRedirection();
app.UseCors(policy => policy.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
app.UseAuthorization();

app.MapControllers();

app.MapGet("/", () => "API is Running! Visit /weatherforecast");

app.MapPost("/generate-pdf", async () =>
{
    return await Task.Run(() =>
    {
        var renderer = new ChromePdfRenderer();

        renderer.RenderingOptions.EnableJavaScript = true;

        renderer.RenderingOptions.ViewPortWidth = 1280;
        renderer.RenderingOptions.ViewPortHeight = 1024;

        renderer.RenderingOptions.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.MarginLeft = 10;
        renderer.RenderingOptions.MarginRight = 10;

        renderer.RenderingOptions.RenderDelay = 5000; 
        renderer.RenderingOptions.Timeout = 60000;
        renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello, PDF!</h1>");
        return Results.File(pdf.BinaryData, "application/pdf", "output.pdf");
    });
});

app.Run();

PdfController.cs:

using IronPdf.Rendering;
using Microsoft.AspNetCore.Mvc;

namespace IronPdfAzureApp.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class PdfController : ControllerBase
    {
        [HttpPost("generate")]
        public async Task<IActionResult> GeneratePdf([FromBody] PdfRequest request)
        {
            try
            {
                var renderer = new ChromePdfRenderer();                
                renderer.RenderingOptions.RenderDelay = 100; 
                renderer.RenderingOptions.EnableJavaScript = false; 
                renderer.RenderingOptions.ViewPortWidth = 1280;
                renderer.RenderingOptions.FirstPageNumber = 1;
                renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen;

                PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync(request.HtmlContent);

                byte[] pdfBytes = pdf.BinaryData;

                return File(pdfBytes, "applicaation/pdf", "output.pdf");
            }
            catch (System.Exception ex)
            {
                return BadRequest($"Error generating PDF: {ex.Message}");
            }
        }
    }

    public class PdfRequest
    {
        public string HtmlContent { get; set; }
    }
}

Here’s the generated PDF after deploying to Azure App Service without any issues.

enter image description here

Upvotes: 1

Related Questions