Плагін Конвертера
Конвертуйте документи у 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 там, де це потрібно — він безстановий за замовчуванням, тому одну інстанцію безпечно використовувати у багатьох запитах.
// 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 document) у власний фіксований набір дозволених цілей. Не «жорстко» кодуйте цей enum у вашому UI: ?convert=open повертає реальний allowedTargets для завантаженого файлу, і саме його слід використовувати у випадаючому списку.
Вбудований віджет
Кінцеві точки віджета ?convert=open|run|download є opt‑in і вимкнені за замовчуванням — безпека за замовчуванням. Увімкніть їх на сервері разом із реєстрацією плагіна:
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; нічого не робить, якщо не в стані idle
conv.destroy(); // видаляє слухачі, очищає монтування; після цього екземпляр не придатний до використанняСтворіть власний інтерфейс
Віджет — лише клієнт HTTP‑контракту — тому ви можете створити власний інтерфейс, який безпосередньо працюватиме з ним, отримуючи інший UX. Усі три маршрути розташовані під гілкою ASP.NET, де змонтовано UseDoconut() (зазвичай /doconut):
| Маршрут | Призначення | Відповідь успіху |
|---|---|---|
POST ?convert=open (multipart, поле 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 хвилин; після закінчення цього інтервалу 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 сам по собі безстановий і отримується через DI; не створюйте і не звільняйте його вручну.
Для веб‑віджета сховища завантажень і завантажень мають незалежні 30‑хвилинні TTL. Токен resultToken переглядача живе протягом сесії переглядача. Закриття результату переглядача не видаляє ще дійсне сховище завантаження, і скидання віджета в браузері не продовжує жоден TTL.
Устранення неполадок
| Симптом | Перевірка |
|---|---|
Не вдається отримати DocumentConverter | Реєстрація ConverterPlugin виконана всередині AddDoconut() |
| Додаток падає під час запуску | Завантажена ліцензія надає Converter |
| Конвертація стріму повідомляє про непідтримуваний формат | sourceExtension містить крапку на початку |
| JavaScript віджета завантажується, а запити повертають 404 | AddConverterWidget() не був викликаний |
| Запити віджета використовують неправильний URL | basePath відповідає гілці, де змонтовано UseDoconut() |
| Відсутня ціль | Використовуйте allowedTargets, повернуті convert=open; не кожен джерело підтримує кожен enum‑target |
| Завантаження прострочено | Повторіть convert=open/convert=run; токени сховища навмисно тимчасові |
Водяний знак
При зареєстрованому ConverterPlugin ліцензія хоста перебуває в одному з трьох станів:
| Стан ліцензії | Перевірка під час запуску | Вихід конвертації |
|---|---|---|
Платна ліцензія переглядача, що надає Converter, у терміні дії | Проходить | Чиста — watermarked: false |
| Активна оцінювальна (demo/NFR) ліцензія | Проходить | Конвертація успішна, з оцінювальним водяним знаком — watermarked: true |
Без ліцензії, застарілий файл TRIAL або нелімітована ліцензія, що не надає Converter | Додаток не стартує — описаний вище шлюз під час запуску генерує виняток | — |
| Протермінована тимчасова/демо‑ліцензія | Реєстрація виживає після закінчення терміну | Конвертація з водяним знаком — watermarked: true |
Обидва шляхи обчислюють прапорець за одним правилом: фасад C# DocumentConverter визначає його внутрішньо на основі станів IsViewerLicensed і IsTemporary ліцензії, а обробник віджета ?convert=run виконує еквівалентну перевірку (IsViewerLicensed && !IsTrial && !IsTemporary), щоб заповнити поле watermarked у відповіді. Інтеграцію можна побудувати і протестувати «від кінця до кінця» на оцінювальній ліцензії перед покупкою — змінюються лише байти вихідного файлу.
Чи була ця сторінка корисною?