Viewer

Główna klasa przeglądarki dokumentów

Viewer (namespace Doconut) jest publicznym punktem wejścia do otwierania dokumentów z Razor pages, kontrolerów MVC, komponentów Blazor lub minimalnych API. Jest sealed, zarejestrowany jako usługa transient przez AddDoconut(), i rozwiązywany poprzez wstrzykiwanie przez konstruktor — nigdy nie twórz go bezpośrednio.

Viewer nie przechowuje stanu per‑request i celowo nie implementuje IDisposable: sesje dokumentów istnieją niezależnie w pamięci podręcznej sesji, więc zwolnienie usługi nigdy nie mogłoby zamknąć otwartego dokumentu (zobacz Podstawowe pojęcia → Jak działa Viewer).

OpenDocumentAsync

Otwiera dokument i zwraca token sesji, którego widget kliencki używa we wszystkich kolejnych żądaniach.

PrzeciążenieKiedy 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 (upload, baza danych, blob). fileInfo musi zawierać prawidłowe rozszerzenie — decyduje o wykrywaniu formatu
csharp
// 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
await using var ms = new MemoryStream();
await file.CopyToAsync(ms);
ms.Position = 0;
token = await viewer.OpenDocumentAsync(ms, new FileInfo(file.FileName));

Wyjątki do obsłużenia:

  • LicenseException — znalezione licencja jest odrzucona (wiadomość zawiera przyczynę odrzucenia) lub format wymaga możliwości wtyczki, która nie jest już przyznana. Wygaśnięcie kalendarza bez wiadomości o odrzuceniu skutkuje renderowaniem z znakiem wodnym zamiast wyrzucenia wyjątku.
  • FormatNotSupportedExceptionDocument format '<extension>' is not supported. (format dokumentu '' nie jest obsługiwany).
  • InvalidDataException — zawartość pliku jest uszkodzona lub nie pasuje do jego rozszerzenia.

CloseDocument

text
void CloseDocument(string token)

Usuwa sesję z pamięci podręcznej (natychmiast zwalnia silnik dokumentu), usuwa znacznik bezpieczeństwa i cofa przyznany dostęp. Opcjonalnie — wygasanie ze ślizgiem wykonuje tę samą czynność czyszczenia — ale zalecane przy dużych dokumentach.

GetPageCount

text
int GetPageCount(string token)

Łączna liczba stron otwartej sesji. Rzuca wyjątek, jeśli token jest nieznany lub wygasł.

DocOptions

Opcje niezależne od formatu, stosowane przy otwieraniu (namespace Doconut):

TypWłaściwośćDomyślnaOpis
stringPassword""Hasło dla chronionych dokumentów (automatycznie kopiowane do konfiguracji formatu).
intImageResolution0Przestarzałe. Zachowane wyłącznie dla kompatybilności — zamiast tego ustaw ImageResolution w konfiguracji formatu.
stringWatermark""Niestandardowy tekst znaku wodnego rysowany na renderowanych stronach. Format ciągu: "^Text~Color~FontSize~FontName~Opacity~Angle", np. "^Sample Copy~Red~24~Verdana~80~-45".
intTimeOut60Wygasanie sesji ze ślizgiem w minutach.
boolIsSecuredtrueObecnie nie egzekwowane — zarezerwowane. Powiązanie tokenu jest kontrolowane globalnie przez DoconutOptions.UnsafeMode (zobacz Podstawowe pojęcia → Sesje i bezpieczeństwo).

Klasa udostępnia również specjalistyczne właściwości, które są celowo poza normalnym przepływem przeglądania jednego hosta:

TypWłaściwośćDomyślnaOpis
boolIsWebFarmfalseOznacza operację otwarcia jako scenariusz web‑farm. Używać wyłącznie z odpowiednią architekturą współdzielonego magazynu/sesji.
stringWebFarmPath""Wspólna ścieżka używana w specjalistycznym przepływie web‑farm. Pusta w normalnym przeglądarce jednego hosta.
boolEditModefalseZarezerwowane dla oddzielnie dystrybuowanego przepływu edytora; pozostaw false dla standardowego przeglądarki.

Custom watermark

DocOptions.Watermark używa sześciu pól oddzielonych tyldą. Opcjonalny początkowy znak ^ żąda układu na wszystkich rogach:

text
^Text~Color~FontSize~FontName~Opacity~Angle
csharp
string token = await viewer.OpenDocumentAsync(
    path,
    new PdfConfig(),
    new DocOptions
    {
        Watermark = "^Confidential~Red~24~Verdana~80~-45",
        TimeOut = 30
    });
PolePrzykładZnaczenie
Leading ^^Opcjonalny układ na wszystkich rogach. Bez niego używane jest standardowe rozmieszczenie znaku wodnego.
TextConfidentialTekst renderowany na każdej stronie. Nie może być pusty.
ColorRedNazwana kolor rozumiany przez warstwę rysowania.
FontSize24Rozmiar czcionki; nieprawidłowa wartość liczbową powoduje użycie domyślnego rozmiaru renderera.
FontNameVerdanaŻądana rodzina czcionek. Upewnij się, że jest zainstalowana w środowisku wdrożeniowym.
Opacity80Wartość bajtowa od 0 do 255. Musi zostać poprawnie sparsowana.
Angle-45Kąt obrotu w stopniach; nieprawidłowa wartość liczbową powoduje użycie domyślnego.

Parser oczekuje dokładnie sześciu pól po opcjonalnym ^. Nieprawidłowa definicja jest zastępowana widocznym w SDK zastępstwem Invalid Watermark zamiast cichego zniknięcia.

License decision

Stan licencjiDostarczona wartość niestandardowaWynik renderowania
Ważna płatna licencja przeglądarkiNieCzysta strona
Ważna płatna licencja przeglądarkiTakNiestandardowy znak wodny
Aktywna tymczasowa/demonstracyjna podstawowa przeglądarkaNieCzysta strona podstawowej przeglądarki
Aktywna tymczasowa/demonstracyjna podstawowa przeglądarkaTakNiestandardowy znak wodny, gdy stosuje się czysta ścieżka podstawowej przeglądarki
Brak, odrzucona, wygasła, nieprawidłowa wersja lub licencja nieprawidłowej domenyDowolnaZnak wodny wymuszający/ewaluacyjny; wartość niestandardowa go nie nadpisuje
Renderowanie wtyczki pod zasadami ewaluacjiDowolnaZnak wodny ewaluacyjny

Ta sama decyzja jest stosowana do serwowanych obrazów stron i eksportów adnotacji. Wyjście w formacie animowanego GIF jest znakowane klatka po klatce. Niestandardowy znak wodny jest więc funkcją licencjonowaną, a nie sposobem na zastąpienie lub ukrycie znaku wodnego ewaluacji.

Annotations API

Ładowanie i eksport adnotacji po stronie serwera. Pełny przewodnik znajduje się w Przewodniki → Adnotacje; interfejs to:

ElementCel
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 adnotacje z zakodowanej strony/envelopy Base64 zwróconej 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

DICOM metadata

text
Task<DicomMetadata?> GetDicomMetadataAsync(string token, CancellationToken ct = default)

Zwraca metadane tagów DICOM dla sesji otwartych przez wtyczkę DICOM; null dla dokumentów nie‑DICOM.

Resource helpers — ReferenceCss / ReferenceScripts

Generuje znaczniki <link>/<script> dla wbudowanych zasobów serwowanych przez UseDoconutResources(), w prawidłowej kolejności zależności. Pakiety dla funkcji zabezpieczonych licencją, takich jak wyszukiwanie i adnotacje, są emitowane tylko gdy licencja je włącza, utrzymując interfejs UI klienta spójny z zachowaniem serwera.

text
string ReferenceCss(CssConfig? config = null)      // null → Bootstrap + viewer + search + annotation
string ReferenceScripts(ScriptConfig? config = null)

Flagi CssConfig: IncludeBootstrapCss, IncludeViewerCss, IncludeSearchCss (zabezpieczone wyszukiwaniem), IncludeAnnotationCss (zabezpieczone adnotacjami).

Flagi ScriptConfig: IncludeJQuery (wymagane przez wszystkie pozostałe), IncludeBootstrap, IncludeViewerScripts (rdzeń: docViewer.js + splitter + links), IncludeSearchScripts i IncludeSearchBar (zabezpieczone wyszukiwaniem), IncludeAnnotationScripts i IncludeAnnotationBar (zabezpieczone adnotacjami).

html
@inject Doconut.Viewer Viewer

@Html.Raw(Viewer.ReferenceCss(new CssConfig { IncludeBootstrapCss = true, IncludeViewerCss = true }))
@Html.Raw(Viewer.ReferenceScripts(new ScriptConfig { IncludeJQuery = true, IncludeViewerScripts = true }))

Czy ta strona była pomocna?