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

Конвертуйте документи у 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 або нелімітована ліцензія, яка не надає можливості ConverterInvalidOperationException, підняте всередині AddDoconut(), до того як застосунок обробляє запити. Приймаються тимчасові реєстрації Demo/NFR; після закінчення їх терміну дії конвертація залишається доступною, але з водяним знаком у результаті. Безкоштовного «тихого» рівня немає. Дивіться Налаштування ліцензії щодо завантаження ліцензій.

Конвертація з C#

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

csharp
// Inject DocumentConverter; its constructor is internal, so never `new` it.
Stream pdf = await converter.ConvertAsync("contract.docx", ConversionTarget.Pdf, ct: ct);
csharp
// 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);
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, веб‑документ) зі своїм фіксованим набором дозволених цілей. Не жорстко кодуйте цей перелік у вашому інтерфейсі: ?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 })Користувач натискає посилання Завантажитивикликається разом з нативним завантаженням браузера — не перехоплює і не замінює його
onError({ phase, message })Запит open або run завершився помилкоюphase'open' або 'run'; message — очищене повідомлення сервера (або повідомлення на боці клієнта для передперевірки розміру завантаження)

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

javascript
const conv = Doconut.convert('#doconut-convert', { basePath: '/doconut' });
conv.reset();         // back to the idle/drop screen; does not re-fire onReady
conv.loadFile(file);  // starts the flow with a File object; no-op unless currently idle
conv.destroy();       // removes listeners, empties the mount; the instance is unusable after this

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

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

МаршрутПризначенняВідповідь при успіху
POST ?convert=open (multipart, field 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 — file bytes, Content-Disposition: attachment, Cache-Control: no-store

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

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

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

МаршрутСтатусКолиТіло
any404Віджет не ввімкнено (AddConverterWidget() не був викликаний) — перевіряється до обробки будь‑якого з трьох маршрутівлише статус
any405Неправильний 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Невідомий або прострочений токен завантаженнялише статус

Власність ресурсів

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

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

Усунення неполадок

СимптомПеревірка
Не вдається отримати DocumentConverterРеєстрація ConverterPlugin виконана всередині AddDoconut()
Застосунок падає під час запускуЗавантажена ліцензія надає Converter
Конвертація потоку повідомляє, що формат не підтримуєтьсяsourceExtension містить крапку на початку
JavaScript віджета завантажується, але запити повертають 404AddConverterWidget() не був викликаний
Запити віджета використовують неправильний URLbasePath відповідає гілці, де UseDoconut() прив'язаний
Ціль відсутняВикористовуйте allowedTargets, повернені convert=open; не кожне джерело підтримує кожен формат перерахування
Завантаження простроченоПовторіть 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, яке повертає. Інтеграцію можна створити та протестувати повністю на оцінювальній ліцензії перед покупкою — змінюються лише байти вихідного файлу.

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