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

.NET Core Blazor获取Razor页面/组件HTML字符串生成PDF方案

嘿,针对你在Blazor里获取HTML字符串生成PDF的问题,我来给你梳理下可行的解决方案:

在Blazor中获取Razor Page的HTML字符串

你之前在MVC里用IRazorEngine来渲染Razor模板,在Blazor环境下,其实可以用RazorLight这类轻量级Razor引擎来实现同样的效果——它不需要依赖ASP.NET Core的完整宿主,能直接加载并渲染Razor Page模板成HTML字符串,刚好你后来也用RazorLight.NETCore3解决了问题,这里给个典型的实现示例参考:

// 初始化RazorLight引擎
var engine = new RazorLightEngineBuilder()
    .UseFileSystemProject(Directory.GetCurrentDirectory()) // 指定你的Razor Page模板所在目录
    .UseMemoryCachingProvider()
    .Build();

// 准备模型数据
var userModel = new UserModel 
{ 
    FullName = "John Doe", 
    Address = "123 Main St", 
    DateOfBirth = new DateTime(1990, 5, 15) 
};

// 渲染模板得到HTML字符串
string templatePath = "/Pages/YourPdfTemplate.cshtml";
string htmlString = await engine.CompileRenderAsync(templatePath, userModel);

// 后续就可以把htmlString传入PDF生成库(比如DinkToPdf、iTextSharp)转成PDF文件
改用Blazor组件获取HTML字符串

如果换成Blazor组件(.razor)来做PDF模板,需要分两种场景处理:

场景1:服务器端Blazor - 直接渲染组件为HTML

在服务器端Blazor中,可以借助组件渲染服务来直接生成HTML,不需要依赖DOM。你可以手动实现或者用第三方工具简化这个过程,示例代码如下:

private readonly IServiceProvider _serviceProvider;

// 通过构造函数注入服务提供者
public YourPdfService(IServiceProvider serviceProvider)
{
    _serviceProvider = serviceProvider;
}

public async Task<string> RenderBlazorComponentToHtml()
{
    // 准备组件参数
    var parameters = new ComponentParameters()
        .Add(p => p.UserModel, new UserModel { FullName = "Jane Smith" });

    // 创建服务作用域并获取渲染器
    using var scope = _serviceProvider.CreateScope();
    var renderer = scope.ServiceProvider.GetRequiredService<IComponentRenderer>();
    
    // 渲染组件得到HTML
    var htmlContent = await renderer.RenderComponentAsync(typeof(YourUserProfileComponent), parameters);
    return htmlContent;
}

场景2:客户端Blazor(WebAssembly) - JS互操作获取DOM内容

客户端Blazor里无法直接在C#中生成组件的HTML,需要通过JavaScript来获取已渲染到DOM中的组件内容:

首先给Blazor组件添加引用标识:

@inject IJSRuntime JSRuntime
@ref="componentRef"

<div class="pdf-template">
  <strong>Full Name:</strong>
  <div>@UserModel.FullName</div>
  <strong>Address:</strong>
  <div>@UserModel.Address</div>
  <strong>DOB:</strong>
  <div>@UserModel.DateOfBirth.ToShortDateString()</div>
</div>

@code {
    private ElementReference componentRef;
    [Parameter] public UserModel UserModel { get; set; }

    // 调用JS获取组件HTML
    public async Task<string> GetComponentHtml()
    {
        return await JSRuntime.InvokeAsync<string>("getComponentHtml", componentRef);
    }
}

然后在wwwroot/index.html中添加对应的JS函数:

function getComponentHtml(element) {
    return element.innerHTML;
}

拿到HTML字符串后,你可以用客户端PDF库(比如jsPDF)直接在浏览器里生成PDF。

补充:你的解决方案验证

很高兴看到你已经用RazorLight.NETCore3顺利解决了问题,这个库确实是Blazor环境下处理Razor模板渲染的优质选择——轻量、不依赖完整ASP.NET Core宿主,完美适配PDF生成这类场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:22:31