You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WebAPI的ApiController中使用Rotativa生成PDF

当然可以!我帮你梳理下在ApiController里用Rotativa直接从数据库的HTML生成PDF的方案,完全不需要依赖View或者ControllerContext:

核心思路:绕开View封装,直接调用HTML转PDF能力

Rotativa本质是封装了wkhtmltopdf工具,所以我们可以跳过它针对MVC View的上层封装,直接用底层能力处理HTML字符串生成PDF。

步骤1:从数据库获取HTML内容

先把存在数据库里的HTML字符串取出来,示例代码(ASP.NET Core为例):

// 假设你有数据库上下文和模板实体
var pdfTemplate = await _dbContext.PdfContentTemplates
    .FirstOrDefaultAsync(t => t.Id == requestedTemplateId);

if (pdfTemplate == null || string.IsNullOrWhiteSpace(pdfTemplate.HtmlContent))
{
    return BadRequest("未找到有效的PDF模板内容");
}
var htmlContent = pdfTemplate.HtmlContent;

步骤2:两种实现方案

方案A:使用Rotativa内置的HtmlStringAsPdf(推荐)

很多新版本的Rotativa(比如Rotativa.AspNetCore)提供了HtmlStringAsPdf类,专门用来直接传入HTML字符串生成PDF,完全不需要View。ApiController里虽然没有ControllerContext,但可以直接用HttpContext属性:

var pdfGenerator = new HtmlStringAsPdf(htmlContent)
{
    FileName = "生成的文档.pdf",
    PageSize = Rotativa.Options.Size.A4,
    PageOrientation = Rotativa.Options.Orientation.Portrait,
    // 还可以配置边距、页眉页脚等参数
};

// 生成PDF字节流
var pdfBytes = pdfGenerator.BuildFile(HttpContext);

// 返回给客户端
return File(pdfBytes, "application/pdf", "生成的文档.pdf");

方案B:手动调用底层wkhtmltopdf驱动(兼容旧版本)

如果你的Rotativa版本没有HtmlStringAsPdf,可以直接调用它的底层驱动类,自己处理HTML临时文件(wkhtmltopdf需要输入文件路径):

var driver = new Rotativa.WkhtmltopdfDriver();
var pdfOptions = new Rotativa.Options.PdfOptions
{
    PageSize = Rotativa.Options.Size.A4,
    Output = "-" // 指定输出到标准输出,方便获取字节流
};

// 创建临时HTML文件
var tempHtmlPath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.html");
await File.WriteAllTextAsync(tempHtmlPath, htmlContent);

// 拼接wkhtmltopdf命令参数
var arguments = pdfOptions.GetArguments(tempHtmlPath);
var pdfBytes = driver.Wkhtmltopdf(arguments);

// 清理临时文件
File.Delete(tempHtmlPath);

// 返回PDF文件
return File(pdfBytes, "application/pdf", "生成的文档.pdf");

额外注意点

  • 确保你安装了对应项目类型的Rotativa包:ASP.NET Core用Rotativa.AspNetCore,传统ASP.NET用Rotativa
  • 若在Linux环境部署,需要确保wkhtmltopdf的依赖库已安装(比如libgdiplus等)
  • 可以根据需求自定义PDF的各种参数,比如页面边距、页眉页脚样式、是否加密等

这样就能在ApiController里轻松生成PDF,完全不需要依赖View或者ControllerContext啦!

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:41:40