Плагін Конвертера
Конвертуйте документи у 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.0Тримайте пакет Converter тієї ж версії, що і Doconut.NET6. Ідентифікатор пакету — Doconut.NET6.Converter; .26.7.0 з’являється лише у завантаженому файлі .nupkg.
Зареєструвати плагін
Методу AddConverter() не існує — модель плагінів Doconut уніфікована. Кожен плагін, включаючи Converter, реєструється однаково: викличте AddPlugin<TPlugin>() всередині AddDoconut(). ConverterPlugin постачається у власному пакеті NuGet, Doconut.NET6.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 там, де він потрібен — він безстановий за задумом, тому одну інстанцію безпечно використовувати повторно в різних запитах.
// Впровадьте DocumentConverter; його конструктор є internal, тому ніколи не `new` його.
Stream pdf = await converter.ConvertAsync("contract.docx", ConversionTarget.Pdf, ct: ct);// sourceExtension включає початкову крапку. password є null, якщо документ не захищений.
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, веб‑документ) у власний фіксований набір дозволених цілей. Не жорстко кодуйте цей 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() три кінцеві точки ?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 }) | Користувач натискає посилання Download | спрацьовує разом із вбудованим завантаженням браузера — не перехоплює і не замінює його |
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(); // видаляє слухачі, очищає mount; екземпляр після цього не придатний до використанняСтворіть власний інтерфейс
Віджет — це лише клієнт для цього 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, який вимагає крапку.
Режими збоїв, згруповані за маршрутом:
| Маршрут | Статус | Коли | Тіло |
|---|---|---|---|
| будь‑який | 404 | Віджет не ввімкнено (AddConverterWidget() ніколи не викликався) — перевіряється до обробки будь‑якого з трьох маршрутів | лише статус |
| будь‑який | 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; не кожне джерело підтримує кожну ціль enum |
| Завантаження прострочено | Повторіть convert=open/convert=run; токени сховища навмисно тимчасові |
Водяний знак
При зареєстрованому ConverterPlugin, ліцензія хоста перебуває в одному з трьох станів:
| Стан ліцензії | Контроль запуску | Вихід конвертації |
|---|---|---|
Платна ліцензія переглядача, що надає Converter, протягом її періоду дії | Проходить | Чистий — watermarked: false |
| Активна оцінювальна (демо/NFR) ліцензія | Проходить | Конвертує успішно, позначений оцінювальним водяним знаком — watermarked: true |
Без ліцензії, файл legacy TRIAL, або нелімітована ліцензія, що не надає Converter | Додаток ніколи не запускається — контроль запуску, описаний вище, викликає виключення | — |
| Прострочена тимчасова/демо ліцензія | Реєстрація зберігається після закінчення терміну | Конвертує з оцінювальним водяним знаком — watermarked: true |
Обидва шляхи виклику обчислюють прапорець за одним правилом: фасад DocumentConverter на C# отримує його внутрішньо з стану IsViewerLicensed та IsTemporary ліцензії, а обробник ?convert=run віджету виконує еквівалентну перевірку (IsViewerLicensed && !IsTrial && !IsTemporary), щоб заповнити поле watermarked, яке він повертає. Інтеграцію можна створити та протестувати повністю на оцінювальній ліцензії перед покупкою — змінюються лише байти вихідних даних.
Чи була ця сторінка корисною?