Плагін Конвертера

Конвертуйте документи у 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. Ідентифікатор пакету
Doconut.NET8.Converter; .26.7.0 з'являється лише у назві завантаженого файлу .nupkg.

Зареєструвати плагін

Методу AddConverter() не існує — модель плагінів Doconut уніфікована. Кожен плагін, включаючи Converter, реєструється однаково: викличте AddPlugin<TPlugin>() всередині AddDoconut(). ConverterPlugin постачається у власному пакеті NuGet, Doconut.NET8.Converter, встановленому разом із базовим пакетом переглядача.

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

Цей виклик генерує виключення під час запуску через відсутню ліцензію, застарілий файл TRIAL або нестандартну ліцензію, яка не надає можливість Converter — InvalidOperationException, підняте всередині AddDoconut(), перед тим як застосунок обробляє запити. Приймаються тимчасові реєстрації Demo/NFR; після закінчення їх терміну дії конвертація залишається доступною з водяним знаком у вихідному файлі. Безкоштовного безлімітного рівня немає. Дивіться Налаштування ліцензії для інформації про завантаження ліцензій.

Конвертувати з C#

Кожна конвертація повертає придатний до пошуку MemoryStream, розташований на позиції 0, готовий до читання або копіювання одразу. Отримайте DocumentConverter з DI там, де це потрібно — він безстановий за задумом, тому одну інстанцію безпечно використовувати повторно в різних запитах.

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);

Дві деталі, які легко переплутати: 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, веб‑документ) у власний фіксований набір дозволених цілей. Не жорстко кодуйте цей enum у списку цілей вашого інтерфейсу: ?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() три кінцеві точки ?convert= відповідають 404 — проте сам файл JS все одно подається (це простий вбудований статичний ресурс; лише кінцеві точки, до яких він звертається, захищені). AddConverterWidget() все ще вимагає реєстрації плагіна Converter та ліцензії, що надає Converter — вона не надає прав на конвертацію самостійно.

Налаштування віджета

Параметри ініціалізації, передані до Doconut.convert(selector, options):

ОпціяТипЗа замовчуваннямПримітки
basePathstring/doconutБазовий шлях для кінцевих точок ?convert=; він має відповідати гілці ASP.NET, де фактично змонтовано UseDoconut() (зазвичай координується через 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 })Користувач клацає посилання Downloadспрацьовує разом з вбудованим завантаженням браузера — не перехоплює і не замінює його
onError({ phase, message })Запит open або run завершується помилкоюphase є 'open' або 'run'; message — це очищена помилка сервера (або повідомлення на боці клієнта для попередньої перевірки розміру завантаження)

Doconut.convert() повертає сам екземпляр віджета — збережіть його, щоб керувати віджетом програмно:

javascript
const conv = Doconut.convert('#doconut-convert', { basePath: '/doconut' });
conv.reset();         // повернутись до екрану idle/drop; не викликає повторно onReady
conv.loadFile(file);  // запускає процес з об’єктом File; no-op, якщо не currently idle
conv.destroy();       // видаляє слухачі, очищає mount; instance непрацездатна після цього

Створіть власний інтерфейс

Віджет — це лише клієнт для цього HTTP‑контракту — створіть власний інтерфейс безпосередньо проти нього для іншого UX. Усі три маршрути розташовані під гілкою ASP.NET, де змонтовано UseDoconut() (зазвичай /doconut):

МаршрутПризначенняВідповідь успіху
POST ?convert=open (multipart, поле file)Завантаження та відкриття вихідного документа для попереднього перегляду200 — { token, pages, sourceExt, allowedTargets }
POST ?token=<token>&convert=run&target=<ext>Конвертувати збережене джерело у target200 — { downloadToken, resultToken, resultPages, downloadName, watermarked }
GET ?convert=download&token=<downloadToken>Потокове передавання конвертованого файлу200 — байти файлу, Content-Disposition: attachment, Cache-Control: no-store

Завантажені байти джерела зберігаються на сервері з TTL 30 хвилин; коли цей проміжок закінчується, run відповідає 404 і файл треба знову відкрити. Конвертований результат зберігається в тому ж сховищі — downloadToken отримує власне нове 30‑хвилинне вікно після завершення конвертації — тоді як resultToken є звичайним токеном сесії переглядача, тривалість якого слідує кешу сесії переглядача, незалежно від сховища.

sourceExt у відповіді open не має початкової крапки (наприклад, "docx") — протилежна конвенція до параметра sourceExtension у DocumentConverter.ConvertAsync, який вимагає її.

Режими відмов, згруповані за маршрутом:

МаршрутСтатусКолиТіло
будь‑який404Віджет не ввімкнено (AddConverterWidget() ніколи не викликався) — перевіряється до обробки будь‑якого з трьох маршрутівлише статус
будь‑який405Неправильний HTTP‑метод (open/run вимагає POST; download вимагає GET)лише статус
open413Завантажений файл перевищує MaxUploadMb{ "error": "File is too large." }
open400Відсутнє multipart‑тіло, файл або розширення джерела, яке не можна конвертувати{ "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Збережене завантаження прострочилося (TTL 30 хвилин) або токен ніколи не був відкритий{ "error": "Upload expired — please re-open the file." }
open, run500Внутрішня помилка обробки{ "error": "<sanitized message>" } — очищено так само, як і всі інші шляхи помилок Doconut; ніколи не розкриває внутрішні назви движка
download400Некоректний токен (не GUID)лише статус
download404Невідомий або прострочений токен завантаженнялише статус

Володіння ресурсом

Конвертер повертає seekable MemoryStream, розташований у нулі. Викликаючий володіє цим потоком і повинен його звільнити після копіювання або повернення його вмісту. Сервіс DocumentConverter сам по собі безстанний і отримується через впровадження залежностей; не створюйте і не звільняйте сервіс вручну.

Для веб‑віджету, сховища завантаження та скачування мають незалежні TTL у 30 хвилин. resultToken переглядача слідує життєвому циклу сесії переглядача. Закриття результату переглядача не видаляє ще дійсне сховище завантаження, і скидання віджету браузера не продовжує жоден з TTL.

Усунення проблем

СимптомПеревірка
Не вдається розв’язати DocumentConverterРеєстрація ConverterPlugin відбулася всередині AddDoconut()
Застосунок не запускається під час стартуЗавантажена ліцензія надає Converter
Конвертація потоку повідомляє, що формат не підтримуєтьсяsourceExtension містить крапку на початку
JavaScript віджету завантажується, але запити повертають 404AddConverterWidget() не був викликаний
Запити віджету використовують неправильний URLbasePath відповідає гілці, де UseDoconut() прив’язаний
Ціль відсутняВикористайте allowedTargets, повернений convert=open; не кожне джерело підтримує кожну ціль enum
Завантаження простроченоПовторіть convert=open/convert=run; токени сховища навмисно тимчасові

Водяний знак

Після реєстрації ConverterPlugin ліцензія хоста перебуває в одному з трьох станів:

Стан ліцензіїПеревірка запускуВихід конвертації
Платна ліцензія переглядача, що надає Converter, протягом її терміну діїПроходитьЧистий — watermarked: false
Активна оцінювальна (демо/NFR) ліцензіяПроходитьКонвертується успішно, з оцінювальним водяним знаком — watermarked: true
Без ліцензії, застарілий файл TRIAL або нелімітована ліцензія, що не надає ConverterЗастосунок ніколи не запускається — описана вище перевірка запуску викликає виключення—
Прострочена тимчасова/демо ліцензіяРеєстрація зберігається після закінчення термінуКонвертує з оцінювальним водяним знаком — watermarked: true

Обидва шляхи виклику обчислюють прапорець за тим же правилом: фасад DocumentConverter C# отримує його внутрішньо з стану IsViewerLicensed та IsTemporary ліцензії, а обробник ?convert=run віджету виконує еквівалентну перевірку (IsViewerLicensed && !IsTrial && !IsTemporary), щоб заповнити поле watermarked, яке він повертає. Інтеграцію можна створити та протестувати повністю на оцінювальній ліцензії перед покупкою — змінюються лише байти вихідних даних.

Чи була ця сторінка корисною?