Blazor Server と WebAssembly
レンダリングはどちらの場合もサーバー側です。Server では呼び出しが直接行われ、WebAssembly では open 呼び出しを最小限の API エンドポイントとして公開し、返されたトークンをウィジェットに渡します。どちらも数行で実装できます。
Blazor はコンポーネントモデルとレンダー ループを提供し、サードパーティの JavaScript にはあまり関心を持ちません。Doconut はそれに対抗するのではなく、協調して動作します:レンダリングは自分のプロセス内でサーバー側で行われ、ウィジェットは通常のインターロップ ライフサイクルを通じて制御できるシンプルな要素にマウントされます。
問題
クライアント側のルートは、レンダリングエンジンをブラウザに組み込むことを意味します。Blazor WebAssembly ではそれがダウンロードサイズに直結し、対応できるのは PDF のみです — 誰かが DOCX や XLSX をアップロードした瞬間、最初に戻ってしまいます。
iframe から Office へのルートは、ドキュメントが他者のインフラを経由することを意味し、セキュリティチームとのやり取りが二度必要になる可能性があります。
Doconut は第三のルートを取ります。ファイルは自サーバーでページ画像にラスタライズされ、Blazor は div をホストするだけです。コンポーネントツリーは所有していないビューアを再レンダリングすることはなく、差分エンジンは何も戦うものがありません。
機能
レンダリングはどちらの場合もサーバー側です。Server では呼び出しが直接行われ、WebAssembly では open 呼び出しを最小限の API エンドポイントとして公開し、返されたトークンをウィジェットに渡します。どちらも数行で実装できます。
最初のレンダー後にウィジェットを一度だけ初期化し、標準の JS インターロップ フックを使用します。Blazor はビューアの内部 DOM を所有しないため、以降の再レンダーでは影響を受けません。
Interactive Server、Interactive WebAssembly、または Auto。ビューアはコンポーネントの状態ではなく不透明なトークンで駆動されるため、レンダーモードを切り替えても統合は変わりません。
同じコンポーネントで PDF、DOCX、XLSX、PPTX、DWG、MSG などカタログ全体を開くことができます。ファイルごとにページを作成するのではなく、1つのビューアページを書くだけです。
ナビゲーション UI はウィジェットに含まれています。キャンバスやページ番号入力からビューアを構築するのではなく、ビューアを接続するだけです。
レンダリングされたページ画像以外はブラウザにストリーミングされません。これは WebAssembly では想像以上に重要です — クライアントは完全に検査可能ですから。
統合
doconutHost.mount は、$('#div_ctlDoc').docViewer({ ... }) を呼び出し、続いて .View(token) を実行する独自の JavaScript 数行です。Blazor の外に置くのは意図的で、ウィジェットの DOM がレンダラーによって調整されるべきものではありません。
サポートされているプラットフォーム
// 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);
}
}詳細
両方です。レンダリングは常にサーバー側で行われるため、WebAssembly では OpenDocumentAsync を呼び出すエンドポイントを追加し、トークンを返します。クライアントはドキュメントを解析しないので、WASM ペイロードは影響を受けません。
いいえ、Blazor がリーフとして扱う要素にマウントすれば問題ありません。空の div をレンダーし、ウィジェットがインターロップで中身を埋めるようにします — 差分エンジンは調整すべき子要素がありません。
いいえ。1つのページでカタログ全体を処理します。フォーマットは開くドキュメントから検出され、事前に選択する必要はありません。
一時ライセンスの取得には数分かかり、完全にご自身のマシン上で実行されます。重要なファイルは、現在のビューアで既に問題を起こしているものです。