Плагін Конвертера
Конвертуйте документи у 24 формати призначення
Плагін Converter перетворює Doconut у сервіс конвертації документів. Він забезпечує движок, що стоїть за публічним фасадом DocumentConverter, і — за бажанням — готовий віджет зі своїм HTTP‑контрактом, тож ви можете конвертувати документи з C#, з віджета або з власного інтерфейсу, який ви створите.
Встановлення пакету
Встановіть останню стабільну версію плагіна Converter:
dotnet add package Doconut.NET8.ConverterЩоб зафіксувати плагін на поточному випуску 26.7.0, передайте версію окремо:
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, встановленому разом з базовим пакетом переглядача.
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 там, де це потрібно — він безстановий за задумом, тому одну інстанцію безпечно використовувати повторно в різних запитах.
// 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, веб‑документ) зі своїм фіксованим набором дозволених цілей. Не жорстко кодуйте цей перелік у вашому інтерфейсі: ?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() три кінцеві точки ?convert= повертають 404 — проте сам файл JS все одно подається (це простий вбудований статичний ресурс; лише кінцеві точки, до яких він звертається, захищені). AddConverterWidget() все ще вимагає, щоб плагін Converter був зареєстрований і щоб ліцензія надавала Converter — він сам по собі не надає прав на конвертацію.
Налаштування віджета
Початкові параметри, що передаються у Doconut.convert(selector, options):
| Параметр | Тип | За замовчуванням | Примітки |
|---|---|---|---|
basePath | string | /doconut | Базовий шлях для кінцевих точок ?convert=; він має відповідати гілці ASP.NET, де фактично змонтовано UseDoconut() (зазвичай координується через MiddlewarePath). |
resPath | string | /doconut-res | Прийнято для узгодженості конфігурації з іншими віджетами Doconut; віджет конвертера наразі не формує жодного URL з цього параметра. |
maxUploadMb | number | 25 | Лише передперевірка на боці клієнта — відхиляє файл, що перевищує розмір, ще до завантаження. Сервер самостійно застосовує власний ліміт і повертає 413, якщо він перевищений. |
licenseUrl | string | null | null | Якщо встановлено, перетворює повідомлення про водяний знак на екрані результату у посилання на цей URL. |
labels | object | {} | Перевизначає будь‑яку підмножину англійських рядків за замовчуванням віджета (текст підказки, кнопки, оголошення 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() повертає сам екземпляр віджета — збережіть його, щоб керувати віджетом програмно:
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> | Конвертувати збережене джерело у target | 200 — { 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, який вимагає крапку.
Режими помилок, згруповані за маршрутом
| Маршрут | Статус | Коли | Тіло |
|---|---|---|---|
| any | 404 | Віджет не ввімкнено (AddConverterWidget() не був викликаний) — перевіряється до обробки будь‑якого з трьох маршрутів | лише статус |
| any | 405 | Неправильний HTTP‑метод (open/run вимагають POST; download вимагає GET) | лише статус |
open | 413 | Завантажений файл перевищує MaxUploadMb | { "error": "File is too large." } |
open | 400 | Відсутнє multipart‑тіло, файл або розширення джерела, яке не можна конвертувати | { "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 | Завантаження прострочено (TTL 30 хв) або токен ніколи не був відкритий | { "error": "Upload expired — please re-open the file." } |
open, run | 500 | Внутрішня помилка під час обробки | { "error": "<sanitized message>" } — очищене повідомлення, так само, як у всіх інших шляхів помилок Doconut; ніколи не розкриває внутрішні назви движка |
download | 400 | Некоректний токен (не GUID) | лише статус |
download | 404 | Невідомий або прострочений токен завантаження | лише статус |
Власність ресурсів
Конвертер повертає придатний до пошуку MemoryStream, позиціонований на нуль. Викликальник володіє цим потоком і повинен його звільнити після копіювання або повернення вмісту. Сервіс DocumentConverter сам по собі безстановий і отримується через впровадження залежностей; не створюйте і не звільняйте сервіс вручну.
Для веб‑віджета сховища завантажень і завантажень мають незалежні TTL у 30 хвилин. Токен resultToken переглядача слідує терміну сесії переглядача. Закриття результату переглядача не видаляє ще дійсне сховище завантаження, і скидання віджета в браузері не продовжує жоден з TTL.
Усунення неполадок
| Симптом | Перевірка |
|---|---|
Не вдається отримати DocumentConverter | Реєстрація ConverterPlugin виконана всередині AddDoconut() |
| Застосунок падає під час запуску | Завантажена ліцензія надає Converter |
| Конвертація потоку повідомляє, що формат не підтримується | sourceExtension містить крапку на початку |
| JavaScript віджета завантажується, але запити повертають 404 | AddConverterWidget() не був викликаний |
| Запити віджета використовують неправильний URL | basePath відповідає гілці, де 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, яке повертає. Інтеграцію можна створити та протестувати повністю на оцінювальній ліцензії перед покупкою — змінюються лише байти вихідного файлу.
Чи була ця сторінка корисною?