コンバータプラグイン
ドキュメントを24の対象フォーマットに変換
ConverterプラグインはDoconutをドキュメント変換サービスに変えます。公開 DocumentConverter ファサードの背後にあるエンジンを提供し、オプトインで独自の HTTP 契約を持つドロップインウィジェットも提供するため、C# から、ウィジェットから、または自前で実装したフロントエンドからドキュメントを変換できます。
パッケージのインストール
最新の安定版 Converter プラグインをインストールします:
dotnet add package Doconut.NET6.Converter現在の 26.7.0 リリースに固定したい場合は、バージョンを別途指定します:
dotnet add package Doconut.NET6.Converter --version 26.7.0Converter パッケージは Doconut.NET6 と同じバージョンに保つ必要があります。パッケージ ID は
Doconut.NET6.Converter で、.26.7.0 はダウンロードされた .nupkg ファイル名にのみ現れます。
プラグインの登録
AddConverter() メソッドはありません — Doconut のプラグインモデルは統一されています。すべてのプラグインは同じ方法で登録します: AddDoconut() 内で AddPlugin<TPlugin>() を呼び出すだけです。ConverterPlugin は独自の NuGet パッケージ Doconut.NET6.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 を返し、すぐに読み取りまたはコピーできます。DocumentConverter は DI から取得してください — 設計上ステートレスなので、単一インスタンスをリクエスト間で安全に再利用できます。
// Inject DocumentConverter; its constructor is internal, so never `new` it.
Stream pdf = await converter.ConvertAsync("contract.docx", ConversionTarget.Pdf, ct: ct);// 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);Stream html = await converter.WordToHtmlAsync("report.docx", ct);Stream docx = await converter.HtmlToWordAsync(html, ConversionTarget.Docx, ct);間違えやすいポイントが二つあります: ストリームオーバーロードの sourceExtension には先頭のドット (".xlsx") を含める必要があり、ドットなし ("xlsx") ではフォーマットカタログと照合できません。また、名前に反して WordToHtmlAsync は Task<Stream> を返し、Task<string> ではありません — 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 ドキュメント)を独自の許可されたターゲット集合にマッピングします。UI のターゲットリストとしてこの enum をハードコードしないでください: ?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) に渡す初期オプション:
| Option | Type | Default | Notes |
|---|---|---|---|
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 アナウンス、エラーメッセージ)を任意で上書きできます。 |
コールバック:
| Callback | 発火タイミング | Payload |
|---|---|---|
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() はウィジェットインスタンス自体を返します — 取得してプログラムからウィジェットを操作できます:
const conv = Doconut.convert('#doconut-convert', { basePath: '/doconut' });
conv.reset(); // アイドル/ドロップ画面に戻す。onReady は再発火しない
conv.loadFile(file); // File オブジェクトでフロー開始。アイドル時以外は無操作
conv.destroy(); // リスナーを削除し、マウントを空にする。以後インスタンスは使用不可独自フロントエンドの構築
ウィジェットはこの HTTP 契約のクライアントに過ぎません — 直接この契約に対して独自フロントエンドを構築すれば、別の UX を実現できます。3 つのルートはすべて UseDoconut() がマウントされている ASP.NET ブランチ(通常は /doconut)の下に配置されます:
| Route | Purpose | Success response |
|---|---|---|
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: attachment、Cache-Control: no-store |
アップロードされたソースバイトはサーバー側で 30 分の TTL と共に保管されます。この期間が過ぎると run は 404 を返し、再度 open からやり直す必要があります。変換結果も同じ保管領域に残り、downloadToken は変換完了時に新たな 30 分間のウィンドウを取得します。一方 resultToken はビューアーセッションのキャッシュ寿命に従う普通のセッショントークンです。
open 応答の sourceExt には先頭のドットがありません(例: "docx") — これは DocumentConverter.ConvertAsync の sourceExtension パラメータ(ドット必須)とは逆の規約です。
失敗モード(ルート別)
| Route | Status | 発生条件 | Body |
|---|---|---|---|
| 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 | 不明または期限切れのダウンロードトークン | ステータスのみ |
リソースの所有権
コンバータは位置 0 にシークされた 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 フィールドを設定します。評価ライセンスでエンドツーエンドの統合を構築・テストでき、購入後は出力バイトだけが変わります。
このページは役に立ちましたか?