コンバータープラグイン

ドキュメントを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 のプラグインモデルは統一されています。すべてのプラグインは、Converter も含めて、同じ方法で登録されます: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 登録は受け付けられます;期限が切れた後も、透かし付き出力で変換は利用可能です。サイレントな無料ティアはありません。ライセンスのロード方法については License Setup を参照してください。

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<string> ではなく Task<Stream> を返します — 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 応答と同じフィールドに加えて、要求された 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();       // リスナーを削除し、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 パラメータとは逆の慣例で、こちらはドットが必要です。

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

ルートステータス条件本文
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 フィールドを埋めます。統合は購入前に評価ライセンスでエンドツーエンドに構築・テストでき、変更されるのは出力バイトだけです。

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