如何在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
相关产品推荐
相关产品推荐

