【.net core】Rotativa 如何在linux上实现

发布于:2025-05-30 ⋅ 阅读:(20) ⋅ 点赞:(0)

1.安装 wkhtmltopdf

Rotativa 依赖于 wkhtmltopdf 工具,因此首先需要在 Linux 系统上安装它:

# 安装依赖
sudo apt-get update
sudo apt-get install -y libfontconfig1 libxrender1 libxext6 fontconfig

# 下载并安装 wkhtmltopdf
wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.buster_amd64.deb
sudo dpkg -i wkhtmltox_0.12.6-1.buster_amd64.deb
sudo apt-get install -f  # 修复依赖问题

wkhtmltopdf工具库(各版本系统下):Releases · wkhtmltopdf/packaging · GitHub 

2. 配置 Rotativa

在 .NET Core 项目中,需要进行以下配置:

2.1 安装 Rotativa 包

dotnet add package Rotativa.AspNetCore

2.2 设置 wkhtmltopdf 路径

在 Startup.cs 中配置 Rotativa,指定 wkhtmltopdf 的路径:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Rotativa.AspNetCore;

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });

        // 设置 Rotativa 路径
        RotativaConfiguration.Setup(env.WebRootPath, "/usr/local/bin");
    }
}

3. 创建控制器和视图

下面是一个简单的控制器示例,用于生成 PDF:

using Microsoft.AspNetCore.Mvc;
using Rotativa.AspNetCore;

public class PdfController : Controller
{
    public IActionResult GeneratePdf()
    {
        // 从视图生成 PDF
        return new ViewAsPdf("PdfView")
        {
            FileName = "document.pdf",
            PageOrientation = Rotativa.AspNetCore.Options.Orientation.Landscape,
            PageSize = Rotativa.AspNetCore.Options.Size.A4
        };
    }

    public IActionResult GeneratePdfFromHtml()
    {
        // 从 HTML 字符串生成 PDF
        string htmlContent = "<h1>Hello, World!</h1><p>This is a PDF generated from HTML.</p>";
        
        return new HtmlAsPdf(htmlContent)
        {
            FileName = "html-document.pdf",
            PageSize = Rotativa.AspNetCore.Options.Size.A4
        };
    }
}

4. 处理 Linux 权限问题

在 Linux 上运行 wkhtmltopdf 时,可能会遇到权限问题。确保:

  1. wkhtmltopdf 可执行文件具有执行权限:

    sudo chmod +x /usr/local/bin/wkhtmltopdf
  2. 如果在容器中运行,可能需要以特权模式运行或调整 SELinux/AppArmor 设置。

5. 处理字体问题

wkhtmltopdf 在 Linux 上可能无法正确渲染某些字体。可以安装缺失的字体:

# 安装常用字体
sudo apt-get install -y ttf-mscorefonts-installer
sudo fc-cache -fv

6. 故障排除 

 如果遇到内存或渲染问题,可以尝试使用 --disable-smart-shrinking 选项(如未出现问题则不添加):

return new ViewAsPdf("PdfView")
{
    CustomSwitches = "--disable-smart-shrinking"
};


网站公告

今日签到

点亮在社区的每一天
去签到