Przeglądarka
Główna klasa przeglądarki dokumentów
Viewer (namespace Doconut) jest publicznym punktem wejścia do otwierania dokumentów z kontrolerów MVC, stron Web Forms oraz obsługujących ich handlerów. Jest to usługa przejściowa tworzona przez DoconutHost.Initialize; rozwiąż ją tam, gdzie jej używasz:
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();new Viewer() również działa po uruchomieniu DoconutHost.Initialize — rozwiązuje te same usługi — co umożliwia kompilację kodu migrowanego z klasycznego pakietu. Przed Initialize zgłasza InvalidOperationException.
Viewer nie przechowuje stanu dokumentu per żądanie i celowo nie implementuje IDisposable: sesje dokumentów istnieją niezależnie od niej, więc zwolnienie Viewer nigdy nie zamknie otwartego dokumentu (zobacz Jak działa Viewer).
OpenDocumentAsync
Otwiera dokument i zwraca token sesji, którego widget używa przy każdym późniejszym żądaniu. Gdy UnsafeMode jest false (wartość domyślna), token jest przydzielany do sesji ASP.NET bieżącego żądania — wywołaj go z żądania, które posiada stan sesji (zobacz Sesje i bezpieczeństwo).
| Przeciążenie | Kiedy używać |
|---|---|
Task<string> OpenDocumentAsync(string filePath, DocOptions? options = null, CancellationToken ct = default) | Otwieranie z dysku z automatycznym wykrywaniem formatu i domyślną konfiguracją formatu |
Task<string> OpenDocumentAsync(string filePath, BaseConfig? config, DocOptions? options = null, CancellationToken ct = default) | Potrzebujesz opcji renderowania specyficznych dla formatu (PdfConfig, WordConfig, …) |
Task<string> OpenDocumentAsync(Stream stream, FileInfo fileInfo, BaseConfig? config = null, DocOptions? options = null, CancellationToken ct = default) | Dokument nie jest plikiem na dysku (przesyłanie, baza danych, blob). fileInfo musi zawierać właściwe rozszerzenie — wybiera format |
// Simple open
string token = await viewer.OpenDocumentAsync(path);
// With per-format config and options
token = await viewer.OpenDocumentAsync(
path,
new PdfConfig { AllowSearch = true, AllowCopy = true },
new DocOptions { TimeOut = 30 });
// From an upload (HttpPostedFileBase in MVC; HttpPostedFile in Web Forms)
using (var ms = new MemoryStream())
{
await file.InputStream.CopyToAsync(ms);
ms.Position = 0;
token = await viewer.OpenDocumentAsync(ms, new FileInfo(Path.GetFileName(file.FileName)));
}Wyjątki do obsłużenia:
LicenseException— znaleziono licencję, ale została odrzucona (wiadomość zawiera przyczynę) lub format wymaga możliwości wtyczki, której licencja nie przyznaje.FormatNotSupportedException— żaden podgląd nie obsługuje rozszerzenia pliku.InvalidDataException— zawartość jest uszkodzona lub nie pasuje do swojego rozszerzenia.
OpenDocument (synchroniczny)
Dla kodu w Web Forms i innych scenariuszy, które nie używają stron asynchronicznych:
string OpenDocument(string filePath, BaseConfig? config = null, DocOptions? options = null)
string OpenDocument(Stream stream, string fileName, BaseConfig? config = null, DocOptions? options = null)
string OpenDocument(byte[] bytes, string fileName, BaseConfig? config = null, DocOptions? options = null)Każda metoda zwraca token i dodatkowo zapisuje go w viewer.Token. fileName musi zawierać właściwe rozszerzenie. Te opakowania są bezpieczne do wywołania z strony Web Forms: ścieżka otwarcia nigdy nie wznawia się w kontekście żądania ASP.NET, więc oczekiwanie na nią nie może spowodować zakleszczenia. To nie jest prawdą dla każdej asynchronicznej API Doconut — zobacz sekcję Web Forms w Wtyczka konwertera.
CloseDocument
void CloseDocument(string token)Usuwa sesję (natychmiast zwalniając silnik dokumentu), usuwa przyznanie tokenu z bieżącej sesji ASP.NET żądania i unieważnia token. Opcjonalnie — wygaśnięcie przesuwane wykonuje tę samą czynność czyszczenia — ale zalecane przy dużych dokumentach.
Zapytania sesji
| Metoda | Zwraca |
|---|---|
int GetPageCount(string token) | Łączna liczba stron otwartego dokumentu |
(int Width, int Height) GetPageDimensions(string token, int page = 1) | Domyślny rozmiar renderowanej strony przy 100 % powiększeniu — przestrzeń współrzędnych dla adnotacji tworzonych w kodzie |
IReadOnlyList<string> GetWorksheetNames(string token) | Renderowane arkusze kalkulacyjne w kolejności skoroszytu; pusty dla innych dokumentów |
Każda metoda zgłasza wyjątek, jeśli token jest nieznany lub wygasł.
DocOptions
Opcje niezależne od formatu, obowiązujące przy otwarciu (przestrzeń nazw Doconut):
| Typ | Właściwość | Domyślnie | Opis |
|---|---|---|---|
string | Password | "" | Hasło dla chronionych dokumentów (automatycznie kopiowane do konfiguracji formatu). |
string | Watermark | "" | Niestandardowy tekst znaku wodnego rysowany na renderowanych stronach — patrz poniżej. |
int | TimeOut | 60 | Czas wygaśnięcia sesji w trybie przesuwanym, w minutach. |
string | BrowserId | "" | Farmy sieciowe: przeglądarka, do której przypisany jest podpisany bilet. Ustaw ją za pomocą DoconutFarmBinding.EnsureBrowserId (zobacz Sesje i bezpieczeństwo). |
string | UserId | "" | Farmy sieciowe: zalogowany użytkownik, do którego przypisany jest bilet, z DoconutFarmBinding.ResolveUserId. |
int | ImageResolution | 0 | Przestarzałe. Ustaw ImageResolution w konfiguracji formatu zamiast tego. |
bool | IsSecured | true | Zarezerwowane; nie wymuszone. Kontrola dostępu to DoconutOptions.UnsafeMode. |
bool | IsWebFarm / string WebFarmPath | false / "" | Zachowane dla kodu migrowanego z klasycznego pakietu. Nie przełączają trybu farmy — robi to AddDoconutDistributed. |
bool | EditMode | false | Zarezerwowane dla oddzielnie dystrybuowanego edytora; pozostaw false. |
Niestandardowy znak wodny
DocOptions.Watermark przyjmuje sześć pól oddzielonych tyldą. Opcjonalny początkowy ^ żąda układu we wszystkich rogach:
^Text~Color~FontSize~FontName~Opacity~Anglestring token = await viewer.OpenDocumentAsync(
path,
new PdfConfig(),
new DocOptions
{
Watermark = "^Confidential~Red~24~Verdana~80~-45",
TimeOut = 30
});| Pole | Przykład | Znaczenie |
|---|---|---|
Leading ^ | ^ | Opcjonalny układ we wszystkich rogach. Bez niego używane jest normalne rozmieszczenie. |
| Text | Confidential | Tekst rysowany na każdej stronie. Nie może być pusty. |
| Color | Red | Nazwany kolor. |
| FontSize | 24 | Rozmiar czcionki; nieprawidłowa wartość numeryczna powoduje użycie domyślnego. |
| FontName | Verdana | Rodzina czcionki. Musi być zainstalowana na serwerze — Windows Server ma mniej czcionek niż komputer stacjonarny. |
| Opacity | 80 | 0 do 255. Musi się dać sparsować. |
| Angle | -45 | Obrót w stopniach; nieprawidłowa wartość numeryczna powoduje użycie domyślnego. |
Parser oczekuje dokładnie sześciu pól po opcjonalnym ^. Nieprawidłowa definicja zostaje zastąpiona widocznym tekstem Invalid Watermark zamiast zniknąć cicho.
Decyzja licencyjna
| Stan licencji | Dostarczona wartość niestandardowa | Wynik renderowania |
|---|---|---|
| Ważna płatna licencja przeglądarki | Nie | Czysta strona |
| Ważna płatna licencja przeglądarki | Tak | Niestandardowy znak wodny |
| Aktywna licencja tymczasowa/demo | Nie | Czysta strona |
| Aktywna licencja tymczasowa/demo | Tak | Niestandardowy znak wodny |
| Brak, odrzucona, wygasła, nieprawidłowa wersja lub licencja z nieprawidłową domeną | Dowolna | Znak wodny ewaluacyjny; wartość niestandardowa go nie zastępuje |
Ta sama decyzja dotyczy serwowanych stron oraz eksportów adnotacji. Niestandardowy znak wodny jest funkcją licencjonowanej aplikacji, a nie sposobem na zastąpienie znaku wodnego ewaluacyjnego.
API adnotacji
Ładowanie i eksport adnotacji po stronie serwera. Szczegółowy opis znajduje się w Adnotacje.
| Metoda | Cel |
|---|---|
AnnotationManager GetAnnotationManager(string token) | Menedżer powiązany z wymiarami stron otwartej sesji |
AnnotationManager GetAnnotationManager(string token, int pageWidth, int pageHeight) | Menedżer z wyraźnie określonymi wymiarami strony |
AnnotationManager GetAnnotationManager(int pageWidth, int pageHeight) | Menedżer niezależny od sesji |
void LoadAnnotationData(string token, AnnotationManager manager) | Ładuje adnotacje stworzone w C# do sesji |
void LoadAnnotationData(string token, string annotationData) | Ładuje zakodowaną powłokę zwróconą przez AnnotationManager.GetAnnotationData() |
void LoadAnnotationXML(string token, XmlDocument annotationXml) | Ładuje adnotacje z XML |
XmlDocument GetAnnotationXML(string token) | Eksportuje adnotacje sesji jako XML |
Task<byte[]> ExportAnnotationsToPdfAsync(string token, int zoom = 100, CancellationToken ct = default) | PDF z wtopionymi adnotacjami |
Task<int> ExportAnnotationsToPngAsync(…) | Pliki PNG z wtopionymi adnotacjami |
Task<byte[]> ExportAnnotationsToPngZipAsync(string token, int zoom = 100, CancellationToken ct = default) | ZIP z PNG‑ami per strona z wtopionymi adnotacjami |
Metadane DICOM
Task<DicomMetadata?> GetDicomMetadataAsync(string token, CancellationToken ct = default)W tym pakiecie zawsze zwraca null, a żądanie metadanych widżetu odpowiada 501 Not Implemented: odczyt tagów DICOM nie jest dostępny w .NET Framework. DICOM renderowanie — strony, klatki i animacje — działa. Zobacz Wtyczka DICOM.
Pomocnicze zasoby — ReferenceCss / ReferenceScripts
Emituj znaczniki <link> i <script> dla zasobów, które moduł zasobów udostępnia pod DoconutOptions.ResourcesPath, w kolejności zależności. Pliki funkcji dostępnych na licencji (Search, Annotation) są emitowane tylko gdy licencja je przyznaje.
string ReferenceCss(CssConfig? config = null) // null → Bootstrap + viewer + search + annotation
string ReferenceScripts(ScriptConfig? config = null)
bool IsSearchEnabled { get; } // license state, for guarding ribbon init code
bool IsAnnotationEnabled { get; }Flagi CssConfig: IncludeBootstrapCss, IncludeViewerCss, IncludeSearchCss (dostępne po wyszukiwaniu), IncludeAnnotationCss (dostępne po adnotacji).
Flagi ScriptConfig: IncludeJQuery (wymagane przez wszystkie pozostałe), IncludeBootstrap, IncludeViewerScripts (główne skrypty podglądu), IncludeSearchScripts i IncludeSearchBar (dostępne po wyszukiwaniu), IncludeAnnotationScripts i IncludeAnnotationBar (dostępne po adnotacji).
Obie zwracają HTML: zapisz je przy użyciu @Html.Raw(...) w MVC 5 (generuj je w kontrolerze — widoki nie mają @inject) lub <%= %> w Web Forms. Szybki start pokazuje oba rozwiązania.
RenderViewer
string RenderViewer(string elementId, string token, ViewerConfig? config = null)Zwraca blok <script>, który inicjalizuje widżet na elemencie o identyfikatorze elementId i wyświetla dokument: docViewer({...}) zbudowany na podstawie ViewerConfig (domyślnie: BasePath: '/', ResPath: 'doconut-res/images'), a następnie .View(token). Umieść go po skryptach podglądu. Wygenerowany skrypt nie przechowuje odniesienia do obiektu podglądu, więc strona z własnym paskiem narzędzi powinna ręcznie zainicjować widżet. Zobacz ViewerConfig.
Farma serwerowa
string? AccessToken przechowuje podpisany bilet wydany przy ostatnim otwarciu, gdy tryb rozproszony jest aktywny i UnsafeMode jest ustawione na false; jest null na pojedynczym serwerze. Prześlij go do widżetu razem z tokenem: objViewer.View(token, access).
Czy ta strona była pomocna?