コンバータプラグイン

文書を24の対象フォーマットに変換

ConverterプラグインはDoconutを文書変換サービスに変えます。パブリックな DocumentConverter ファサードの背後にあるエンジンを提供し、オプトインで独自の HTTP 契約を持つドロップインウィジェットも提供するため、C# から、ウィジェットから、または自分で作成したフロントエンドから文書を変換できます。

パッケージのインストール

最新の安定版 Converter プラグインをインストールします:

bash
dotnet add package Doconut.NET8.Converter

現在の 26.7.0 リリースにプラグインを固定するには、バージョンを別途指定します:

bash
dotnet add package Doconut.NET8.Converter --version 26.7.0

Converter パッケージは Doconut.NET8 と同じバージョンに保ちます。パッケージ ID は Doconut.NET8.Converter で、.26.7.0 はダウンロードされた .nupkg ファイル名にのみ現れます。

プラグインの登録

AddConverter() メソッドは存在しません — Doconut のプラグインモデルは統一されています。すべてのプラグインは同じ方法で登録されます: AddDoconut() の内部で AddPlugin<TPlugin>() を呼び出すだけです。ConverterPlugin は独自の NuGet パッケージ Doconut.NET8.Converter に含まれ、ベースビューアーパッケージと共にインストールされます。

csharp
builder.Services.AddDoconut(options =>
{
    options.LicensePath = "Doconut.Viewer.lic";
    options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
});

この呼び出しは、ライセンスが欠如している、レガシーな TRIAL ファイルがある、または Converter 機能を付与しない一時的でないライセンスがある場合に、AddDoconut() 内部からスローされる InvalidOperationException によって起動時に失敗します。デモ/NFR の一時ライセンスは受け付けられ、期限が切れた後も透かし付き出力で変換は利用可能です。無料のサイレントティアはありません。ライセンスの読み込み方法については ライセンス設定 を参照してください。

C# から変換

すべての変換は、位置が 0 に設定されたシーク可能な MemoryStream を返し、すぐに読み取りまたはコピーできます。DocumentConverter は必要な場所で DI から解決してください — 設計上ステートレスなので、単一インスタンスをリクエスト間で安全に再利用できます。

csharp
// Inject DocumentConverter; its constructor is internal, so never `new` it.
Stream pdf = await converter.ConvertAsync("contract.docx", ConversionTarget.Pdf, ct: ct);
csharp
// sourceExtension includes the leading dot. password is null unless the document is protected.
Stream png = await converter.ConvertAsync(upload, ".xlsx", ConversionTarget.Png, password: null, ct: ct);
csharp
Stream html = await converter.WordToHtmlAsync("report.docx", ct);
csharp
Stream docx = await converter.HtmlToWordAsync(html, ConversionTarget.Docx, ct);

間違えやすいポイントが二つあります: ストリームオーバーロードの sourceExtension には先頭のドット (".xlsx""xlsx" ではなく) を含める必要があります — コンバータはこれをフォーマットカタログと照合し、ドットなしの拡張子では解決できません。また、名前に反して WordToHtmlAsyncTask<Stream> を返し、Task<string> ではありません — HTML 文書(画像は Base64 埋め込み)をストリームとして取得し、他のすべての変換結果と同様に扱えます。

対象フォーマット

text
Pdf, Docx, Doc, Html, Xlsx, Pptx, Png, Jpeg, Csv, Tiff, Bmp, Gif, Svg, Xml,
Txt, Xls, Jp2, Rtf, Odt, Ods, Odp, Epub, Xps, Webp

すべてのソースがすべてのターゲットに変換できるわけではありません — プラグインは各ソースのフォーマットファミリー(Word、Excel、PowerPoint、PDF、CAD、Image、Email、Diagram、Project/Task、PSD、web document)を独自の固定された許可対象リストにマッピングします。この enum を UI のターゲットリストとしてハードコードしないでください: ?convert=open はアップロードされたファイルに対して実際の allowedTargets を返し、ピッカーはそれに基づいて構築すべきです。

ドロップインウィジェット

ウィジェットの ?convert=open|run|download エンドポイントはオプトインで、デフォルトでは無効化されています — デフォルトで安全です。サーバー側で有効化し、プラグイン登録と併せて設定してください:

csharp
builder.Services.AddDoconut(options =>
{
    options.LicensePath = "Doconut.Viewer.lic";
    options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
    options.AddConverterWidget(widget =>
    {
        widget.MaxUploadMb = 25;
    });
});
html
<div id="doconut-convert"></div>
<script src="/doconut-res/js/doconutConverter.js"></script>
<script>
  Doconut.convert('#doconut-convert', { basePath: '/doconut', resPath: '/doconut-res', maxUploadMb: 25 });
</script>

AddConverterWidget() を呼び出さない場合、3 つの ?convert= エンドポイントは 404 を返します — ただし JS ファイル自体は引き続き配信されます(単なる埋め込み静的リソースで、通信先エンドポイントだけがゲートされます)。AddConverterWidget() は、Converter プラグインが登録され、Converter を付与するライセンスがあることを前提とします — それ自体で変換権限を付与するわけではありません。

ウィジェットのカスタマイズ

Doconut.convert(selector, options) に渡す初期オプション:

オプションデフォルト備考
basePathstring/doconut?convert= エンドポイントのベースパス。UseDoconut() が実際にマウントされている ASP.NET ブランチ(通常は MiddlewarePath で調整)と一致させる必要があります
resPathstring/doconut-res他の Doconut ウィジェットと設定の一貫性を保つために受け入れられますが、コンバータウィジェットは現在このパスから URL を生成しません
maxUploadMbnumber25クライアント側の事前チェックのみ — アップロード前にサイズ超過ファイルを拒否します。サーバー側でも独自に上限を設定し、超過時は 413 を返します
licenseUrlstring | nullnull設定すると、結果画面の透かし通知がこの URL へのリンクになります
labelsobject{}ウィジェットの英語デフォルト文字列(ドロップテキスト、ボタン、aria-live アナウンス、エラーメッセージ)を任意のサブセットで上書きできます

コールバック

コールバック発火タイミングペイロード
onReady()ウィジェットがアイドル/ドロップ画面を描画したとき
onSourceLoaded({ token, pages, sourceExt, allowedTargets })?convert=open が成功したときソースセッショントークン、ページ数、ソース拡張子(先頭ドットなし)、許可対象リスト
onConverted({ downloadToken, resultToken, resultPages, downloadName, watermarked, target })?convert=run が成功したときランレスポンスと同様のフィールドに加えて、要求された target
onDownload({ downloadName, downloadToken })ユーザーがダウンロードリンクをクリックしたときブラウザーのネイティブダウンロードと同時に発火します — 置き換えや割り込みは行いません
onError({ phase, message })open または run リクエストが失敗したときphase'open' または 'run'message はサニタイズされたサーバーエラー(またはアップロードサイズ事前チェックのクライアント側メッセージ)

Doconut.convert() はウィジェットインスタンス自体を返します — 取得してプログラムからウィジェットを操作できます:

javascript
const conv = Doconut.convert('#doconut-convert', { basePath: '/doconut' });
conv.reset();         // アイドル/ドロップ画面に戻す。onReady は再発火しない
conv.loadFile(file);  // File オブジェクトでフロー開始。アイドル時以外は No‑op
conv.destroy();       // リスナーを削除し、マウントを空にする。以後インスタンスは使用不可

独自のフロントエンドを構築

ウィジェットはこの HTTP 契約のクライアントに過ぎません — 直接この契約に対して独自のフロントエンドを構築すれば、別の UX を実現できます。3 つのルートはすべて UseDoconut() がマウントされている ASP.NET ブランチ(通常は /doconut)の下にあります:

ルート用途成功レスポンス
POST ?convert=open (multipart, field file)ソース文書をアップロードしてプレビュー用に開く200{ token, pages, sourceExt, allowedTargets }
POST ?token=<token>&convert=run&target=<ext>ストアされたソースを target に変換200{ downloadToken, resultToken, resultPages, downloadName, watermarked }
GET ?convert=download&token=<downloadToken>変換済みファイルをストリーム配信200 — ファイルバイト、Content-Disposition: attachmentCache-Control: no-store

アップロードされたソースバイトはサーバー側で 30 分の TTL と共に保管されます。この期間が過ぎると run404 を返し、ファイルは再度開く必要があります。変換結果も同じ保管領域に残り、変換完了時に downloadToken に新たな 30 分ウィンドウが付与されます。一方 resultToken は通常のビューアーセッショントークンで、ビューアーのセッションキャッシュの寿命に従い、保管領域とは独立しています。

open 応答の sourceExt には先頭ドットがありません(例: "docx") — DocumentConverter.ConvertAsyncsourceExtension パラメータがドットを要求するのとは逆の規約です。

失敗モード(ルート別)

ルートステータス発生条件ボディ
任意404ウィジェットが有効化されていない(AddConverterWidget() が呼ばれていない) — 3 つのルートがディスパッチされる前にチェックされますステータスのみ
任意405HTTP メソッドが間違っている(open/runPOSTdownloadGET が必要)ステータスのみ
open413アップロードファイルが MaxUploadMb を超過{ "error": "File is too large." }
open400マルチパートボディがない、ファイルがない、または変換できないソース拡張子{ "error": "..." }
run400トークンが GUID でない、または targetConversionTarget にパースできない{ "error": "Invalid token." } / { "error": "Unknown target format." }
run400target がソースの allowedTargets に含まれていない{ "error": "That target format is not available for this file." }
run404ストアされたアップロードが期限切れ(30 分 TTL)またはトークンが開かれていない{ "error": "Upload expired — please re-open the file." }
open, run500内部処理で失敗{ "error": "<sanitized message>" } — 他の Doconut エラーパスと同様にサニタイズされ、内部エンジン名は漏れません
download400トークンが GUID でないステータスのみ
download404不明または期限切れのダウンロードトークンステータスのみ

リソースの所有権

コンバータは位置が 0 に設定されたシーク可能な MemoryStream を返します。呼び出し側がそのストリームを所有し、コピーまたは内容を返した後に破棄する必要があります。DocumentConverter サービス自体はステートレスで、依存性注入から解決されます。手動でインスタンスを生成したり破棄したりしないでください。

Web ウィジェットの場合、アップロードとダウンロードの保管はそれぞれ独立した 30 分 TTL を持ちます。ビューアーの resultToken はビューアーセッションの寿命に従います。ビューアー結果を閉じても有効なダウンロード保管は削除されず、ブラウザーウィジェットをリセットしても TTL は延長されません。

トラブルシューティング

症状確認項目
DocumentConverter の解決に失敗ConverterPlugin の登録が AddDoconut() 内で行われているか
アプリ起動時に失敗読み込まれたライセンスが Converter を付与しているか
ストリーム変換でフォーマット未対応と表示sourceExtension に先頭ドットが含まれているか
ウィジェットの JavaScript は読み込まれるがリクエストが 404AddConverterWidget() が呼ばれているか
ウィジェットのリクエストが間違った URL を使用basePathUseDoconut() がマッピングされているブランチと一致しているか
ターゲットが見つからないconvert=open が返す allowedTargets を使用する。すべてのソースがすべての enum ターゲットをサポートしているわけではありません
ダウンロードが期限切れconvert=open / convert=run を再度実行する。保管トークンは意図的に一時的です

ウォーターマーキング

ConverterPlugin が登録されている場合、ホストのライセンスは次の 3 つの状態のいずれかです:

ライセンス状態起動時ゲート変換出力
有料ビューアーライセンスで Converter が付与され、期限内通過クリーン — watermarked: false
アクティブな評価(デモ/NFR)ライセンス通過変換は成功し、評価用透かしが付与される — watermarked: true
ライセンス未取得、レガシー TRIAL ファイル、または Converter を付与しない一時的でないライセンスアプリは起動しない — 上記の起動時ゲートで例外がスローされる
期限切れの一時/デモライセンス登録は有効だが期限切れ評価用透かしが付与されたまま変換 — watermarked: true

両方の呼び出し経路は同じルールでフラグを算出します: DocumentConverter の C# ファサードは内部でライセンスの IsViewerLicensedIsTemporary 状態から導出し、ウィジェットの ?convert=run ハンドラも同等のチェック (IsViewerLicensed && !IsTrial && !IsTemporary) を行って watermarked フィールドを設定します。評価ライセンスでエンドツーエンドの統合を構築・テストでき、購入前に動作確認が可能です — 変更されるのは出力バイトだけです。

このページは役に立ちましたか?