Blazor

在 Blazor 中运行的文档查看器

Blazor 为你提供了组件模型和渲染循环,对第三方 JavaScript 并不在意。Doconut 与其配合而非对抗:渲染在你自己的进程中服务器端进行,部件挂载到你通过常规互操作生命周期控制的普通元素中。

75
文件扩展名,无客户端解析
2
支持的托管模型
0
用于渲染的 WASM 负载

问题

为什么常规方法在 Blazor 中会受限

客户端路径意味着将渲染引擎运送到浏览器中。在 Blazor WebAssembly 中,这直接增加了下载大小,而且它仅支持 PDF——一旦有人上传 DOCX 或 XLSX,你就回到原点。

iframe 到 Office 的路径意味着你的文档要经过他人的基础设施,这需要与你的安全团队进行一次你可能不想重复的沟通。

Doconut 采用第三种路径。文件由你自己的服务器栅格化为页面图像,Blazor 只需托管一个 div。你的组件树永远不会重新渲染它不拥有的查看器,差异引擎也无可争执。

功能

在 Blazor 应用中你能获得的功能

Blazor Server 与 WebAssembly

渲染始终在服务器端进行。Server 模式下调用直接;在 WebAssembly 中,你将打开调用暴露为最小 API 端点,并将返回的令牌交给部件。两者只需几行代码。

通过 OnAfterRenderAsync 挂载

在首次渲染后通过标准 JS 互操作钩子初始化部件一次。由于 Blazor 从不拥有查看器的内部 DOM,后续的重新渲染不会触及它。

兼容你选择的渲染模式

交互式 Server、交互式 WebAssembly 或 Auto。查看器由不透明令牌驱动,而非组件状态,因此切换渲染模式不会改变集成方式。

无格式缺口

同一组件可打开 PDF、DOCX、XLSX、PPTX、DWG、MSG 以及目录中的其他格式。你只需编写一个查看器页面,而不是每种文件类型各一个。

缩略图、搜索与打印

导航 UI 随部件提供。你只需接线一个查看器,而不是从画布和页码输入自行构建。

文档保留在你的服务器上

除渲染后的页面图像外,未向浏览器传输任何内容,这在 WebAssembly 中比人们预期的更重要——毕竟客户端是完全可检查的。

集成

Program.cs 与 Blazor 页面

doconutHost.mount 是几行你自己的 JavaScript,调用 $('#div_ctlDoc').docViewer({ ... }) 然后 .View(token)。将其置于 Blazor 之外是有意为之——部件的 DOM 不应成为渲染器尝试调和的对象。

支持的平台

Blazor ServerBlazor WebAssembly.NET 8.NET 6WindowsDocker
csharp
// Program.cs — order matters
builder.Services.AddDoconut(options =>
{
    options.LicensePath = "Doconut.Viewer.lic";
});
builder.Services.AddSession();

app.UseSession();          // before UseDoconut()
app.UseDoconutResources(); // before UseDoconut()
app.UseDoconut();

// Viewer.razor — open server-side, hand the token to the widget
@inject Doconut.Viewer Viewer
@inject IJSRuntime JS

<div id="divDocViewer"><div id="div_ctlDoc"></div></div>

@code {
    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (!firstRender) return;

        // Authorize first — the viewer renders whatever you hand it.
        string token = await Viewer.OpenDocumentAsync("wwwroot/files/Sample.pdf");
        await JS.InvokeVoidAsync("doconutHost.mount", token);
    }
}

详情

开始前值得了解的事项

  • 部件是 jQuery 插件,因此 jQuery 必须在查看器脚本之前加载。
  • UseSession() 和 UseDoconutResources() 必须在 UseDoconut() 之前注册。
  • 在 WebAssembly 中,open 调用应位于服务器端——将其暴露为最小 API 端点并仅返回令牌。
  • 令牌是不透明的。不要将其放入日志的查询字符串,也不要在组件状态中缓存超过页面生命周期的时间。

常见问题

这在 Blazor WebAssembly 中也能工作吗,还是仅限 Server?

两者皆可。渲染始终在服务器端进行,因此在 WebAssembly 中只需添加一个调用 OpenDocumentAsync 并返回令牌的端点。客户端从不解析文档,这正是 WASM 负载保持不变的原因。

Blazor 的渲染器会与查看器的 DOM 冲突吗?

不会,只要你挂载到 Blazor 视为叶子的元素。渲染一个空的 div,让部件通过互操作填充——差异引擎没有子元素需要调和。

我是否需要为每种文件类型单独的查看器页面?

不需要。一个页面即可处理整个目录。格式是从你打开的文档中检测到的,而不是事先由你选择的。

在您自己的文档上试用

临时许可证的申请只需几分钟,并且完全在您自己的机器上运行。重要的文件是那些已经导致您当前查看器出现问题的文件。