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 时,可能会遇到权限问题。确保:
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"
};