Wtyczka Konwertera
Konwertuj dokumenty do 24 formatów docelowych
Wtyczka Converter przekształca Doconut w usługę konwersji dokumentów. Dostarcza silnik stojący za publiczną fasadą DocumentConverter oraz — po włączeniu — gotowy widget z własnym kontraktem HTTP, dzięki czemu możesz konwertować dokumenty z C#, z widgetu lub z własnego frontendu.
Zainstaluj pakiet
Zainstaluj najnowszą stabilną wtyczkę Converter:
dotnet add package Doconut.NET8.ConverterAby przypiąć wtyczkę do bieżącej wersji 26.7.0, podaj wersję osobno:
dotnet add package Doconut.NET8.Converter --version 26.7.0Utrzymuj pakiet Converter w tej samej wersji co Doconut.NET8. Identyfikator pakietu to Doconut.NET8.Converter; .26.7.0 pojawia się tylko w nazwie pobranego pliku .nupkg.
Zarejestruj wtyczkę
Nie ma metody AddConverter() — model wtyczek Doconut jest jednolity. Każda wtyczka, w tym Converter, rejestruje się w ten sam sposób: wywołaj AddPlugin<TPlugin>() wewnątrz AddDoconut(). ConverterPlugin jest dostarczany w osobnym pakiecie NuGet, Doconut.NET8.Converter, zainstalowanym razem z podstawowym pakietem przeglądarki.
builder.Services.AddDoconut(options =>
{
options.LicensePath = "Doconut.Viewer.lic";
options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
});To wywołanie rzuca wyjątek przy uruchamianiu, jeśli brakuje licencji, istnieje starszy plik
TRIALlub licencja nie‑tymczasowa, która nie przyznaje możliwościConverter—InvalidOperationExceptionpodnoszone wewnątrzAddDoconut(), przed obsługą żądań przez aplikację. Tymczasowe rejestracje Demo/NFR są akceptowane; po upływie ich terminu konwersja pozostaje dostępna z oznaczeniem wodnym. Nie ma cichego darmowego poziomu. Zobacz License Setup, aby dowiedzieć się, jak ładowane są licencje.
Konwertuj z C#
Każda konwersja zwraca przeszukiwalny MemoryStream ustawiony na pozycji 0, gotowy do odczytu lub kopiowania od razu. Rozwiąż DocumentConverter z DI, gdziekolwiek jest potrzebny — jest bezstanowy z założenia, więc pojedyncza instancja może być bezpiecznie używana wielokrotnie w żądaniach.
// 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);Dwa szczegóły, które łatwo pomylić: sourceExtension w przeciążeniu strumienia musi zawierać wiodącą kropkę (".xlsx", a nie "xlsx") — konwerter dopasowuje ją do katalogu formatów i sama rozszerzenie nie zostanie rozpoznane. I pomimo nazwy, WordToHtmlAsync zwraca Task<Stream>, a nie Task<string> — otrzymujesz dokument HTML (obrazy osadzone jako Base64) jako strumień, tak jak każdy inny wynik konwersji.
Formaty docelowe
Pdf, Docx, Doc, Html, Xlsx, Pptx, Png, Jpeg, Csv, Tiff, Bmp, Gif, Svg, Xml,
Txt, Xls, Jp2, Rtf, Odt, Ods, Odp, Epub, Xps, WebpNie każdy format źródłowy konwertuje się na każdy format docelowy — wtyczka mapuje rodzinę formatów źródłowych (Word, Excel, PowerPoint, PDF, CAD, Image, Email, Diagram, Project/Task, PSD, dokument internetowy) na własny stały zestaw dozwolonych celów. Nie koduj na sztywno tego wyliczenia jako listy docelowej w UI: ?convert=open zwraca rzeczywiste allowedTargets dla właśnie przesłanego pliku i to powinno sterować wyborem.
Gotowy widget
Endpointy widgetu ?convert=open|run|download są opcjonalne i domyślnie wyłączone — zabezpieczone z góry. Włącz je po stronie serwera, razem z rejestracją wtyczki:
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>Bez AddConverterWidget() trzy endpointy ?convert= zwracają 404 — ale sam plik JS jest nadal udostępniany (to zwykły wbudowany zasób statyczny; tylko endpointy, z którymi się komunikuje, są zabezpieczone). AddConverterWidget() nadal wymaga, aby wtyczka Converter była zarejestrowana oraz licencji przyznającej Converter — nie przyznaje ona samodzielnie praw do konwersji.
Dostosuj widget
Opcje inicjalizacji przekazywane do Doconut.convert(selector, options):
| Opcja | Typ | Domyślnie | Uwagi |
|---|---|---|---|
basePath | string | /doconut | Ścieżka bazowa dla endpointów ?convert=; musi odpowiadać gałęzi ASP.NET, w której UseDoconut() jest faktycznie zamontowany (zwykle koordynowane przez MiddlewarePath) |
resPath | string | /doconut-res | Akceptowane dla spójności konfiguracji z innymi widgetami Doconut; widget konwertera obecnie nie buduje z tego żadnego URL |
maxUploadMb | number | 25 | Tylko wstępna kontrola po stronie klienta — odrzuca zbyt duży plik przed wysłaniem. Serwer egzekwuje własny limit niezależnie i zwraca 413, jeśli zostanie przekroczony |
licenseUrl | string | null | null | Gdy ustawione, zamienia informację o znaku wodnym na ekranie wyniku w link do tego URL |
labels | object | {} | Zastępuje dowolny podzbiór domyślnych angielskich ciągów widgetu (tekst upuszczania, przyciski, ogłoszenia aria‑live, komunikaty o błędach) |
Wywołania zwrotne:
| Wywołanie zwrotne | Wywoływane gdy | Ładunek |
|---|---|---|
onReady() | Widget wyrenderował ekran bezczynności/upuszczania | — |
onSourceLoaded({ token, pages, sourceExt, allowedTargets }) | Powodzenie ?convert=open | token sesji źródła, liczba stron, rozszerzenie źródła (bez kropki), lista dozwolonych celów |
onConverted({ downloadToken, resultToken, resultPages, downloadName, watermarked, target }) | Powodzenie ?convert=run | te same pola co odpowiedź run, plus target, które zostało żądane |
onDownload({ downloadName, downloadToken }) | Użytkownik klika link Pobierz | wywoływane równocześnie z natywnym pobraniem przeglądarki — nie przechwytuje ani nie zastępuje go |
onError({ phase, message }) | Żądanie open lub run nie powiodło się | phase to 'open' lub 'run'; message to oczyszczony błąd serwera (lub komunikat po stronie klienta dla wstępnej kontroli rozmiaru przesyłanego pliku) |
Doconut.convert() zwraca samą instancję widgetu — zachowaj ją, aby sterować widgetem programowo:
const conv = Doconut.convert('#doconut-convert', { basePath: '/doconut' });
conv.reset(); // powrót do ekranu bezczynności/upuszczania; nie wywołuje ponownie onReady
conv.loadFile(file); // rozpoczyna przepływ z obiektem File; nie robi nic, jeśli nie jest w stanie bezczynności
conv.destroy(); // usuwa nasłuchiwacze, opróżnia montaż; po tym instancja jest nieużytecznaZbuduj własny frontend
Widget jest jedynie klientem tego kontraktu HTTP — zbuduj własny frontend bezpośrednio przeciwko niemu, aby uzyskać inne UX. Wszystkie trzy trasy znajdują się pod gałęzią ASP.NET, w której zamontowano UseDoconut() (zwykle /doconut):
| Ścieżka | Cel | Odpowiedź sukcesu |
|---|---|---|
POST ?convert=open (multipart, pole file) | Przesłanie i otwarcie dokumentu źródłowego w celu podglądu | 200 — { token, pages, sourceExt, allowedTargets } |
POST ?token=<token>&convert=run&target=<ext> | Konwersja przechowywanego źródła do podanego target | 200 — { downloadToken, resultToken, resultPages, downloadName, watermarked } |
GET ?convert=download&token=<downloadToken> | Strumieniowanie skonwertowanego pliku | 200 — bajty pliku, Content-Disposition: attachment, Cache-Control: no-store |
Przesłane bajty źródła są przechowywane po stronie serwera z TTL 30 minut; po upływie tego okna run zwraca 404 i plik musi być ponownie otwarty. Wynik konwersji pozostaje w tym samym magazynie — downloadToken otrzymuje własne świeże 30‑minutowe okno po zakończeniu konwersji — podczas gdy resultToken jest zwykłym tokenem sesji przeglądarki, którego czas życia podąża za pamięcią podręczną sesji przeglądarki, niezależnie od magazynu.
sourceExt w odpowiedzi open nie ma wiodącej kropki (np. "docx") — odwrotna konwencja w stosunku do parametru sourceExtension w DocumentConverter.ConvertAsync, który wymaga kropki.
Tryby awarii, pogrupowane według trasy
| Ścieżka | Status | Kiedy | Treść |
|---|---|---|---|
| dowolna | 404 | Widget nie jest włączony (AddConverterWidget() nie został wywołany) — sprawdzane przed obsługą którejkolwiek z trzech tras | tylko status |
| dowolna | 405 | Nieprawidłowy czasownik HTTP (open/run wymagają POST; download wymaga GET) | tylko status |
open | 413 | Przesłany plik przekracza MaxUploadMb | { "error": "Plik jest za duży." } |
open | 400 | Brak ciała multipart, brak pliku lub rozszerzenie źródła, którego nie można skonwertować | { "error": "..." } |
run | 400 | Nieprawidłowy token (nie jest GUID) lub target, którego nie da się sparsować do ConversionTarget | { "error": "Nieprawidłowy token." } / { "error": "Nieznany format docelowy." } |
run | 400 | target nie znajduje się w allowedTargets źródła | { "error": "Ten format docelowy nie jest dostępny dla tego pliku." } |
run | 404 | Przechowywany upload wygasł (TTL 30 min) lub token nigdy nie został otwarty | { "error": "Upload wygasł — proszę ponownie otworzyć plik." } |
open, run | 500 | Przetwarzanie nie powiodło się wewnętrznie | { "error": "<sanitized message>" } — oczyszczone w taki sam sposób jak wszystkie inne ścieżki błędów Doconut; nigdy nie ujawnia wewnętrznych nazw silnika |
download | 400 | Nieprawidłowy token (nie jest GUID) | tylko status |
download | 404 | Nieznany lub wygasły token pobrania | tylko status |
Własność zasobów
Konwerter zwraca przeszukiwalny MemoryStream ustawiony na zero. Wywołujący jest właścicielem tego strumienia i powinien go zwolnić po skopiowaniu lub zwróceniu jego zawartości. Usługa DocumentConverter jest bezstanowa i jest rozwiązywana z wstrzykiwania zależności; nie twórz ani nie zwalniaj usługi ręcznie.
Dla widgetu internetowego, magazyny upload i download mają niezależne TTL 30 minut. resultToken przeglądarki podąża za czasem życia sesji przeglądarki. Zamknięcie wyniku przeglądarki nie usuwa nadal ważnego magazynu pobrania, a resetowanie widgetu w przeglądarce nie wydłuża żadnego z TTL.
Rozwiązywanie problemów
| Objaw | Sprawdź |
|---|---|
Rozwiązywanie DocumentConverter nie powiodło się | Rejestracja ConverterPlugin odbyła się wewnątrz AddDoconut() |
| Aplikacja nie uruchamia się | Załadowana licencja przyznaje uprawnienie Converter |
| Konwersja strumienia zgłasza, że format jest nieobsługiwany | sourceExtension zawiera wiodącą kropkę |
| JavaScript widgetu ładuje się, ale żądania zwracają 404 | AddConverterWidget() nie został wywołany |
| Żądania widgetu używają niewłaściwego URL | basePath odpowiada gałęzi, w której zamapowano UseDoconut() |
| Brakuje celu | Użyj allowedTargets zwróconych przez convert=open; nie każdy format źródłowy obsługuje każdy enumowy cel |
| Pobranie wygasło | Powtórz convert=open/convert=run; tokeny magazynu są celowo tymczasowe |
Dodawanie znaków wodnych
Po zarejestrowaniu ConverterPlugin licencja hosta znajduje się w jednym z trzech stanów:
| Stan licencji | Bramka startowa | Wynik konwersji |
|---|---|---|
Płatna licencja przeglądarki przyznająca Converter, w okresie ważności | Przechodzi | Czysty — watermarked: false |
| Aktywna licencja ewaluacyjna (demo/NFR) | Przechodzi | Konwertuje pomyślnie, oznaczony znakiem wodnym ewaluacji — watermarked: true |
Brak licencji, starszy plik TRIAL lub licencja nie‑tymczasowa, która nie przyznaje Converter | Aplikacja nigdy się nie uruchamia — opisane powyżej bramki startowej rzuca wyjątek | — |
| Wygasła licencja tymczasowa/demo | Rejestracja przetrwa wygaśnięcie | Konwertuje ze znakiem wodnym ewaluacji — watermarked: true |
Obie ścieżki wywołań obliczają flagę według tej samej reguły: fasada C# DocumentConverter wyprowadza ją wewnętrznie ze stanu licencji IsViewerLicensed i IsTemporary, a obsługa widgetu ?convert=run wykonuje równoważne sprawdzenie (IsViewerLicensed && !IsTrial && !IsTemporary), aby wypełnić pole watermarked, które zwraca. Integrację można zbudować i przetestować end‑to‑end na licencji ewaluacyjnej przed zakupem — zmieniają się tylko bajty wyjściowe.
Czy ta strona była pomocna?