コンバータプラグイン

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

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

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

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

bash
dotnet add package Doconut.NET6.Converter

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

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

Converter パッケージを Doconut.NET6 と同じバージョンに保ってください。パッケージ ID は Doconut.NET6.Converter です。.26.7.0 はダウンロードされた .nupkg のファイル名にのみ表示されます。

プラグインを登録

AddConverter() メソッドは存在しません — Doconut のプラグインモデルは統一されています。すべてのプラグインは、Converter も含めて、同じ方法で登録されます:AddDoconut() 内で AddPlugin<TPlugin>() を呼び出します。ConverterPlugin は独自の NuGet パッケージ Doconut.NET6.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 を返し、すぐに読み取りまたはコピーできる状態です。必要な場所で DI から DocumentConverter を解決してください — 設計上ステートレスなので、単一インスタンスをリクエスト間で安全に再利用できます。

csharp
// DocumentConverter を注入します。そのコンストラクタは internal なので、決して `new` しないでください。
Stream pdf = await converter.ConvertAsync("contract.docx", ConversionTarget.Pdf, ct: ct);
csharp
// sourceExtension には先頭のドットが含まれます。ドキュメントが保護されていない限り、password は null です。
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);

間違えやすい2つの詳細があります:ストリームオーバーロードの sourceExtension では先頭のドット(".xlsx"、"xlsx" ではなく)を含める必要があります — コンバータはそれをフォーマットカタログと照合し、ドットなしの拡張子では解決できません。また、名前に反して WordToHtmlAsync は Task<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 ドキュメント)を独自の固定された許可対象セットにマッピングします。この 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 が成功したときrun response と同じフィールドに加えて、要求された target
onDownload({ downloadName, downloadToken })ユーザーがダウンロードリンクをクリックしたときブラウザのネイティブダウンロードと同時に発火します — それをインターセプトしたり置き換えたりしません。
onError({ phase, message })オープンまたはラン要求が失敗したときphase は 'open' または 'run' です;message はサニタイズされたサーバーエラーです(またはアップロードサイズ事前チェックのクライアント側メッセージ)。

Doconut.convert() はウィジェットインスタンス自体を返します — プログラムからウィジェットを操作するために保持してください:

javascript
const conv = Doconut.convert('#doconut-convert', { basePath: '/doconut' });
conv.reset();         // アイドル/ドロップ画面に戻ります;onReady を再度発火しません
conv.loadFile(file);  // File オブジェクトでフローを開始します;現在アイドル状態でない限り何もしません
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 — file bytes, Content-Disposition: attachment, Cache-Control: no-store

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

sourceExt は open レスポンス内では先頭にドットがありません(例: "docx") — これは DocumentConverter.ConvertAsync の sourceExtension パラメータがドットを必要とするのとは逆の規約です。

失敗モード(ルート別):

ルートステータス条件本文
any404ウィジェットが有効化されていません(AddConverterWidget() が呼び出されていません) — 3 つのルートがディスパッチされる前にチェックされますステータスのみ
any405HTTP メソッドが間違っています(open/run は POST が必要です;download は GET が必要です)ステータスのみ
open413アップロードされたファイルが MaxUploadMb を超えています{ "error": "File is too large." }
open400マルチパートボディがない、ファイルがない、または変換できないソース拡張子です{ "error": "..." }
run400トークンが不正な形式(GUID ではない)、または target が ConversionTarget に解析できません{ "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不明または期限切れのダウンロードトークンステータスのみ

リソース所有権

コンバータは位置がゼロに設定されたシーク可能な 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 フィールドを埋めます。統合は購入前に評価ライセンスでエンドツーエンドに構築・テストでき、変更されるのは出力バイトだけです。

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