HakanL / WkHtmlToPdf-DotNet

C# .NET Core wrapper for wkhtmltopdf library that uses Webkit engine to convert HTML pages to PDF.
GNU Lesser General Public License v3.0
366 stars 64 forks source link

Calling in. net8 webapi failed to free memory #132

Open jinghun1999 opened 1 month ago

jinghun1999 commented 1 month ago

We used to generate pdf in .net5 in 2021, then we upgraded to .net6 in 2022 and upgraded to .net8 in 2024,But we found this caused failed to free memory in .net8. I don't know the problem caused by .net8 Or by the WkHtmlToPdf version. The api called 10000 times maybe every day, the memory trend like this. 微信截图_20240712142639

code in my project below:

Startup.cs

services.AddSingleton<WkHtmlToPdfDotNet.Contracts.IConverter>(sp =>
{
    var logger = sp.GetService<ILogger<WkHtmlToPdfDotNet.Contracts.IConverter>>();
    var converter = new WkHtmlToPdfDotNet.SynchronizedConverter(new WkHtmlToPdfDotNet.PdfTools());
    converter.Warning += (sender, e) =>
    {
        logger.LogWarning(e.Message);
    };
    converter.Error += (sender, e) =>
    {
        logger.LogError(e.Message);
    };
    return converter;
});

ValueController.cs

private IConverter converter;
public ValueController(IConverter _converter) 
{
    converter = _converter;
}
[HttpGet]
public async Task<IActionResult> DownChainPdf()
{    
    var doc = new HtmlToPdfDocument()
    {
        GlobalSettings = {
            ColorMode = ColorMode.Color,
            Orientation = Orientation.Portrait,
            PaperSize = PaperKind.A4Plus,
        },
        Objects = {
            new ObjectSettings() {
                PagesCount = true,
                HtmlContent = html, // html string, 100kb
                WebSettings = { DefaultEncoding = "utf-8" },
                HeaderSettings = { FontSize = 9, FontName = "微软雅黑", Line = true, Spacing = 5, Left = $"Gen by:{model.User.UserName}【{model.User.DisplayName}】", Right = $"Gen date:{model.ReportDate.ToOffset(TimeSpan.FromHours(8)).ToString("yyyy-MM-dd HH:mm:ss")}" },
                FooterSettings = { FontSize = 9, FontName = "微软雅黑", Line = true, Spacing = 5, Center = "[page] / [topage]" }
            }
        }
    };
    byte[] pdfData;
    await _PdfSlim.WaitAsync();
    try
    {
        pdfData = converter.Convert(doc);
    }
    finally
    {
        _PdfSlim.Release();
    }            
    Response.Headers.Append("Content-Disposition", "attachment; filename=\"output.pdf\"");
    return File(pdfData, "application/pdf", "output.pdf");
}
HakanL commented 1 month ago

It's hard to know exactly what could cause it, but the GC process is a little different in .NET8 vs earlier versions, so maybe that's related. The WkHtmlToPdf package doesn't have specific builds for .NET8, so it's odd that it would be related.

jinghun1999 commented 1 month ago

@Han Thanks a lot. May you test it in .net8, and if it show you the memory issue and can repair it , that's very important and amazing for us.

HakanL commented 1 month ago

@han Thanks a lot. May you test it in .net8, and if it show you the memory issue and can repair it , that's very important and amazing for us.

I run it in .NET8, but I don't have good test set up for memory leak testing. We welcome PRs though :)

HakanL commented 1 month ago

See this as well: https://github.com/HakanL/WkHtmlToPdf-DotNet/issues/129

HakanL commented 1 month ago

Also see this: https://github.com/HakanL/WkHtmlToPdf-DotNet/issues/114