【.net core】Rotativa 如何在linux上实现
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(){// 从视图生成 PDFreturn new ViewAsPdf("PdfView"){FileName = "document.pdf",PageOrientation = Rotativa.AspNetCore.Options.Orientation.Landscape,PageSize = Rotativa.AspNetCore.Options.Size.A4};}public IActionResult GeneratePdfFromHtml(){// 从 HTML 字符串生成 PDFstring 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 时,可能会遇到权限问题。确保:
-
wkhtmltopdf 可执行文件具有执行权限:
sudo chmod +x /usr/local/bin/wkhtmltopdf
-
如果在容器中运行,可能需要以特权模式运行或调整 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"
};