You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用wkhtmlToPdf(Rotativa)生成PDF频繁失败,偶发成功求助

Hey there, sorry to hear you're stuck with this super inconsistent Rotativa/wkhtmltopdf issue—it sounds incredibly frustrating, especially that endless loading loop after a rare success. Let’s walk through some targeted fixes and checks to get this working reliably for you:

Troubleshooting & Fixes for Rotativa PDF Generation Issues

1. Kill Leaking wkhtmltopdf Processes

Rotativa relies on the underlying wkhtmltopdf executable to generate PDFs. A common culprit here is orphaned processes that don’t get cleaned up after a request, hogging system resources and blocking future attempts.

  • On Windows, open Task Manager and look for lingering wkhtmltopdf.exe entries—kill all of them and try generating a PDF again.
  • On Linux/macOS, use ps aux | grep wkhtmltopdf to find running processes, then kill <PID> to terminate them.
  • For a more permanent fix, you can add code to explicitly kill the process after PDF generation if you’re handling the process directly (Rotativa sometimes leaves processes hanging in edge cases).

2. Tune Rotativa Configuration Parameters

Default settings might not handle your workload or environment properly. Try adjusting these:

  • Set a hard timeout to avoid infinite loading:
    var pdfResult = new ViewAsPdf("YourTargetView")
    {
        Timeout = 60000, // 60-second timeout (adjust as needed)
        PageSize = Size.A4
    };
    return pdfResult;
    
  • Disable unnecessary features to reduce resource load:
    pdfResult.EnableJavaScript = false; // Only if your view doesn't need JS
    pdfResult.DisableExternalLinks = true; // Block external resources if not required
    

3. Verify Permissions & Resource Paths

Rotativa needs proper access to both the wkhtmltopdf binary and your view’s assets (CSS, images, JS):

  • Ensure your app’s runtime user (IIS App Pool identity, or the user running your console/app) has read access to the wkhtmltopdf executable and your project’s wwwroot folder.
  • Use absolute paths for assets in your view (e.g., @Url.Content("~/css/styles.css") instead of relative paths) — wkhtmltopdf can struggle with relative paths when rendering server-side views.

4. Update Rotativa & wkhtmltopdf

Older versions have known stability and process-leak bugs:

  • Update the Rotativa NuGet package to the latest stable version (use Rotativa.AspNetCore if you’re on ASP.NET Core).
  • Manually replace the wkhtmltopdf binary included with Rotativa with the latest official stable release—sometimes NuGet packages ship with outdated binaries.

5. Limit Concurrent PDF Requests

If multiple requests hit the PDF generator at once, resource contention can cause failures:

  • Use a semaphore to restrict concurrent PDF generation to a small number of requests:
    private static readonly SemaphoreSlim _pdfGenerationSemaphore = new SemaphoreSlim(2); // Allow 2 concurrent requests
    
    public async Task<IActionResult> GeneratePdf()
    {
        await _pdfGenerationSemaphore.WaitAsync();
        try
        {
            var pdf = new ViewAsPdf("YourView");
            return pdf;
        }
        finally
        {
            _pdfGenerationSemaphore.Release();
        }
    }
    

6. Debug Directly with wkhtmltopdf CLI

To uncover hidden errors that Rotativa might swallow, test your view directly with the wkhtmltopdf command line:

  1. Render your view to a static HTML file (save the output of your view action to a local .html file).
  2. Run this command in your terminal:
    wkhtmltopdf path/to/your/file.html output.pdf
    
    Any errors (like missing assets, invalid HTML, or resource timeouts) will show up here, giving you a clear target for fixes.

内容的提问来源于stack exchange,提问作者Vandenberghe Willy

火山引擎 最新活动