コンバータープラグイン
ドキュメントを24の対象フォーマットに変換
ConverterプラグインはDoconutをドキュメント変換サービスに変えます。パブリックな DocumentConverter ファサードの背後にあるエンジンを提供し、オプトインで独自のHTTP契約を持つドロップインウィジェットも提供するので、C# から、ウィジェットから、または自分で作成したフロントエンドからドキュメントを変換できます。
パッケージのインストール
最新の安定版Converterプラグインをインストールします:
dotnet add package Doconut.NET8.Converterプラグインを現在の 26.7.0 リリースに固定するには、バージョンを別途指定します:
dotnet add package Doconut.NET8.Converter --version 26.7.0Converterパッケージは Doconut.NET8 と同じバージョンに保ってください。パッケージIDは Doconut.NET8.Converter です。.26.7.0 はダウンロードされた .nupkg ファイル名にのみ現れます。
プラグインの登録
AddConverter() メソッドは存在しません — Doconut のプラグインモデルは統一されています。すべてのプラグインは、Converter も含めて、同じ方法で登録されます:AddDoconut() 内で AddPlugin<TPlugin>() を呼び出します。ConverterPlugin は独自の NuGet パッケージ Doconut.NET8.Converter として提供され、ベースビューアーパッケージと共にインストールされます。
builder.Services.AddDoconut(options =>
{
options.LicensePath = "Doconut.Viewer.lic";
options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
});この呼び出しは、ライセンスが欠如している場合、レガシーな
TRIALファイルがある場合、またはConverter機能を付与しない一時的でないライセンスの場合、起動時に例外をスローします —AddDoconut()内部から発生したInvalidOperationExceptionです。アプリがリクエストを処理する前に発生します。 一時的なデモ/NFR 登録は受け付けられます;期限が切れた後も、透かし付き出力で変換は利用可能です。サイレントな無料ティアはありません。ライセンスのロード方法については License Setup を参照してください。
C# から変換
すべての変換は、位置が0に設定されたシーク可能な MemoryStream を返し、すぐに読み取りまたはコピーできます。必要な場所で DI から DocumentConverter を解決してください — 設計上ステートレスなので、単一インスタンスをリクエスト間で安全に再利用できます。
// DocumentConverter を注入します。そのコンストラクタは internal なので、決して `new` しないでください。
Stream pdf = await converter.ConvertAsync("contract.docx", ConversionTarget.Pdf, ct: ct);// sourceExtension には先頭のドットが含まれます。password は、ドキュメントが保護されていない限り null です。
Stream png = await converter.ConvertAsync(upload, ".xlsx", ConversionTarget.Png, password: null, ct: ct);Stream html = await converter.WordToHtmlAsync("report.docx", ct);Stream docx = await converter.HtmlToWordAsync(html, ConversionTarget.Docx, ct);間違えやすい2つの詳細があります:ストリームオーバーロードの sourceExtension では先頭のドット(".xlsx"、"xlsx" ではなく)を含める必要があります — コンバータはそれをフォーマットカタログと照合し、ドットなしの拡張子では解決できません。また、名前に反して WordToHtmlAsync は Task<string> ではなく Task<Stream> を返します — HTMLドキュメント(画像はBase64で埋め込まれた)をストリームとして取得でき、他のすべての変換結果と同様です。
対象フォーマット
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ドキュメント)を独自の固定された許可対象セットにマッピングします。この enum を UI のターゲットリストとしてハードコードしないでください:?convert=open はアップロードされたファイルに対する実際の allowedTargets を返し、それがピッカーの駆動要素となります。
ドロップインウィジェット
ウィジェットの ?convert=open|run|download エンドポイントはオプトイン方式で、デフォルトでは無効化されています — デフォルトで安全です。サーバー側で有効化し、プラグインの登録と併せて行います:
builder.Services.AddDoconut(options =>
{
options.LicensePath = "Doconut.Viewer.lic";
options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
options.AddConverterWidget(widget =>
{
widget.MaxUploadMb = 25;
});
});<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) に渡される初期オプション:
| オプション | 型 | デフォルト | 備考 |
|---|---|---|---|
basePath | string | /doconut | ?convert= エンドポイントのベースパスです。UseDoconut() が実際にマウントされている ASP.NET ブランチと一致する必要があります(通常は MiddlewarePath を通じて調整されます)。 |
resPath | string | /doconut-res | 他の Doconut ウィジェットとの設定一貫性のために受け入れられます;コンバータウィジェットは現在それから URL を生成しません。 |
maxUploadMb | number | 25 | クライアント側の事前チェックのみです — アップロード前にサイズオーバーのファイルを拒否します。サーバーは独立して独自の上限を適用し、超過した場合は 413 を返します。 |
licenseUrl | string | null | null | 設定すると、結果画面の透かし通知をこの URL へのリンクに変えます。 |
labels | object | {} | ウィジェットの英語デフォルト文字列(ドロップテキスト、ボタン、aria-live アナウンス、エラーメッセージなど)の任意のサブセットを上書きします。 |
コールバック:
| コールバック | 発火条件 | ペイロード |
|---|---|---|
onReady() | ウィジェットがアイドル/ドロップ画面をレンダリングしたとき | — |
onSourceLoaded({ token, pages, sourceExt, allowedTargets }) | ?convert=open が成功したとき | ソースセッショントークン、ページ数、ソース拡張子(先頭のドットなし)、許可されたターゲットリスト |
onConverted({ downloadToken, resultToken, resultPages, downloadName, watermarked, target }) | ?convert=run が成功したとき | run 応答と同じフィールドに加えて、要求された target |
onDownload({ downloadName, downloadToken }) | ユーザーがダウンロードリンクをクリックしたとき | ブラウザのネイティブダウンロードと同時に発火します — それをインターセプトしたり置き換えたりはしません。 |
onError({ phase, message }) | オープンまたは実行リクエストが失敗したとき | phase は 'open' または 'run' です;message はサニタイズされたサーバーエラー(またはアップロードサイズ事前チェックのクライアント側メッセージ)です。 |
Doconut.convert() はウィジェットインスタンス自体を返します — それを保持してウィジェットをプログラムから操作してください:
const conv = Doconut.convert('#doconut-convert', { basePath: '/doconut' });
conv.reset(); // アイドル/ドロップ画面に戻ります; onReady は再度発火しません
conv.loadFile(file); // File オブジェクトでフローを開始します; 現在アイドル状態でない限り何もしません
conv.destroy(); // リスナーを削除し、mount を空にします; これ以降インスタンスは使用できません独自フロントエンドの構築
ウィジェットはこの 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 — file bytes, Content-Disposition: attachment, Cache-Control: no-store |
アップロードされたソースバイトはサーバー側に 30 分の TTL で保管されます;その期間が過ぎると、run は 404 を返し、ファイルは再度開く必要があります。変換結果は同じ保管領域に残ります — 変換が完了すると downloadToken は新たな 30 分間のウィンドウを取得します — 一方、resultToken は通常のビューアセッショントークンで、ビューアのセッションキャッシュに従い、保管領域とは独立しています。
sourceExt は open 応答内では先頭にドットがありません(例: "docx") — これは DocumentConverter.ConvertAsync の sourceExtension パラメータとは逆の慣例で、こちらはドットが必要です。
失敗モード(ルート別):
| ルート | ステータス | 条件 | 本文 |
|---|---|---|---|
| any | 404 | ウィジェットが有効化されていません(AddConverterWidget() が呼び出されていません) — 3 つのルートがディスパッチされる前にチェックされます | ステータスのみ |
| any | 405 | HTTP メソッドが間違っています(open/run は POST が必要です;download は GET が必要です) | ステータスのみ |
open | 413 | アップロードされたファイルが MaxUploadMb を超えています | { "error": "File is too large." } |
open | 400 | マルチパートボディがない、ファイルがない、または変換できないソース拡張子です | { "error": "..." } |
run | 400 | 不正なトークン(GUID ではありません)、または target が ConversionTarget にパースできません | { "error": "Invalid token." } / { "error": "Unknown target format." } |
run | 400 | target がソースの allowedTargets にありません | { "error": "That target format is not available for this file." } |
run | 404 | 保管されたアップロードが期限切れです(30 分 TTL)またはトークンが開かれたことがありません | { "error": "Upload expired — please re-open the file." } |
open, run | 500 | 内部で処理が失敗しました | { "error": "<sanitized message>" } — 他のすべての Doconut エラーパスと同様にサニタイズされます;内部エンジン名は漏洩しません |
download | 400 | 不正なトークン(GUID ではありません) | ステータスのみ |
download | 404 | 不明または期限切れのダウンロードトークン | ステータスのみ |
リソース所有権
コンバータはゼロ位置に設定されたシーク可能な MemoryStream を返します。呼び出し側がそのストリームを所有し、コピーまたは内容を返した後に破棄すべきです。DocumentConverter サービス自体はステートレスで、依存性注入から解決されます。サービスを手動で構築したり破棄したりしないでください。
Web ウィジェットでは、アップロードとダウンロードのスタッシュはそれぞれ独立した 30 分の TTL を持ちます。代わりに、ビューア resultToken はビューアセッションの有効期間に従います。ビューア結果を閉じても、まだ有効なダウンロードスタッシュは削除されず、ブラウザウィジェットをリセットしてもいずれの TTL も延長されません。
トラブルシューティング
| 症状 | 確認項目 |
|---|---|
DocumentConverter の解決に失敗 | ConverterPlugin の登録が AddDoconut() 内で行われました |
| 起動時にアプリケーションが失敗 | ロードされたライセンスは Converter を付与します |
| ストリーム変換がフォーマット未対応と表示 | sourceExtension に先頭のドットが含まれています |
| ウィジェットの JavaScript はロードされるがリクエストが 404 を返す | AddConverterWidget() が呼び出されませんでした |
| ウィジェットのリクエストが誤った URL を使用 | basePath が UseDoconut() がマップされているブランチと一致します |
| ターゲットが見つかりません | convert=open が返す allowedTargets を使用してください;すべてのソースがすべての enum ターゲットをサポートしているわけではありません |
| ダウンロードが期限切れ | convert=open/convert=run を再実行してください;スタッシュトークンは意図的に一時的です |
ウォーターマーキング
ConverterPlugin が登録されている場合、ホストのライセンスは次の 3 つの状態のいずれかです:
| ライセンス状態 | 起動ゲート | 変換出力 |
|---|---|---|
有効期間内に Converter を付与する有料ビューアライセンス | 合格 | クリーン — watermarked: false |
| アクティブな評価(デモ/NFR)ライセンス | 合格 | 正常に変換され、評価ウォーターマーク — watermarked: true が付与されます |
未ライセンス、レガシー TRIAL ファイル、または Converter を付与しない非一時的ライセンス | アプリは起動しません — 上記の起動ゲートが例外をスローします | — |
| 期限切れの一時/デモライセンス | 期限切れ後も登録は残ります | 評価ウォーターマーク — watermarked: true が付与された状態で変換されます |
両方の呼び出しパスは同じルールからフラグを計算します:DocumentConverter の C# ファサードはライセンスの IsViewerLicensed と IsTemporary の状態から内部的に導出し、ウィジェットの ?convert=run ハンドラは同等のチェック(IsViewerLicensed && !IsTrial && !IsTemporary)を行い、返す watermarked フィールドを埋めます。統合は購入前に評価ライセンスでエンドツーエンドに構築・テストでき、変更されるのは出力バイトだけです。
このページは役に立ちましたか?