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, rejestrowany jako usługa transient przez AddDoconut() i rozwiązywany poprzez wstrzykiwanie przez konstruktor — nigdy nie twórz go bezpośrednio.

Poprzednia biblioteka .NET Standard udostępniała publiczny konstruktor przyjmujący pamięciowy cache, dostęp do kontekstu HTTP oraz jedną lub więcej ścieżek licencji. Ten konstruktor został usunięty; graf usług dostarcza te zależności.

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

OpenDocumentAsync

Otwiera dokument i zwraca token sesji, którego widget kliencki używa we wszystkich kolejnych żądaniach. Każde otwarcie jest asynchroniczne — nie istnieje synchroniczny OpenDocument.

PrzeciążenieUżyj gdy
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 per format (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
// Proste otwarcie
string token = await viewer.OpenDocumentAsync(path);

// Z konfiguracją i opcjami dla każdego formatu
token = await viewer.OpenDocumentAsync(
    path,
    new PdfConfig { AllowSearch = true, AllowCopy = true },
    new DocOptions { TimeOut = 30 });

// Z przesyłki
await using var ms = new MemoryStream();
await file.CopyToAsync(ms);
ms.Position = 0;
token = await viewer.OpenDocumentAsync(ms, new FileInfo(file.FileName));

Exceptions to handle:

  • LicenseException — znaleziona licencja zostaje odrzucona (wiadomość zawiera przyczynę odrzucenia), lub format wymaga możliwości wtyczki, która nie jest już przyznana. Wygaśnięcie kalendarza bez komunikatu o odrzuceniu skutkuje renderowaniem z znakiem wodnym zamiast wyrzucenia wyjątku.
  • FormatNotSupportedException — Document format '<extension>' is not supported.
  • 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 przesuwne wykonuje tę samą czynność czyszczenia — ale jest zalecane dla dużych dokumentów.

GetPageCount

text
int GetPageCount(string token)

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

GetWorksheetNames

text
IReadOnlyList<string> GetWorksheetNames(string token)

Zwraca nazwy arkuszy otwartego arkusza kalkulacyjnego, w kolejności skoroszytu, lub pustą listę, gdy otwarty dokument nie jest arkuszem kalkulacyjnym.

Wymieniane są tylko renderowane arkusze: ukryte i puste arkusze są pomijane, a gdy ExcelConfig.SheetNames ogranicza renderowanie, pojawiają się tylko te arkusze. Arkusz nie zawsze odpowiada jednej stronie — bardzo duży arkusz jest renderowany na kilku stronach. Rzuca wyjątek, jeśli token jest nieznany lub wygasł.

Dodano w wersji 26.9.0.

Flagi możliwości

CzłonekZnaczenie
bool IsSearchEnabledObecna licencja przyznaje Search
bool IsAnnotationEnabledObecna licencja przyznaje Annotation

Użyj ich w widoku Razor, aby renderować licencjonowaną wstążkę tylko wtedy, gdy serwer faktycznie ją udostępni — zobacz Szybki start.

DocOptions

Opcje niezależne od formatu, obowiązujące przy każdym otwarciu (przestrzeń nazw Doconut):

TypWłaściwośćDomyślneOpis
stringPassword""Hasło do 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. Ciąg formatowania: "^Text~Color~FontSize~FontName~Opacity~Angle", np. "^Sample Copy~Red~24~Verdana~80~-45".
intTimeOut60Przesuwające się wygaśnięcie sesji 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ślneOpis
boolIsWebFarmfalseOznacza operację otwarcia jako scenariusz współdzielonego magazynu. Zwróć uwagę na wielkość liter — poprzednia biblioteka zapisywała to jako IsWebfarm.
stringWebFarmPath""Wspólna ścieżka używana w tym przepływie pracy. Poprzednio zapisywana jako WebfarmPath. Pusta w normalnym przeglądarce jednego hosta i nie jest potrzebna w ścieżce publikacji opisanej w Rozproszone wdrożenia.
boolEditModefalseZarezerwowane dla oddzielnie dystrybuowanego przepływu edycji; pozostaw false dla standardowego przeglądarki.

Niestandardowy znak wodny

DocOptions.Watermark używa sześciu pól oddzielonych tyldą. Opcjonalny wiodący ^ żąda układu we 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 we wszystkich rogach. Bez niego używane jest normalne umiejscowienie znaku wodnego.
TextConfidentialTekst renderowany na każdej stronie. Nie może być pusty.
ColorRedNazwany kolor rozumiany przez warstwę rysowania.
FontSize24Rozmiar czcionki; nieprawidłowa wartość numeryczna powoduje powrót do 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ść numeryczna powoduje użycie domyślnego.

Parser oczekuje dokładnie sześciu pól po opcjonalnym ^. Nieprawidłowa definicja jest zastępowana widoczną wartością zastępczą Invalid Watermark SDK zamiast cichego zniknięcia.

Decyzja licencyjna

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 obowiązuje ścieżka czystej podstawowej przeglądarki
Brak, odrzucona, wygasła, nieprawidłowa wersja lub nieprawidłowa domena licencjiDowolnaZnak wodny wymuszania/ewaluacji; wartość niestandardowa go nie nadpisuje
Renderowanie wtyczki według zasad ewaluacjiDowolnaZnak wodny ewaluacji

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

API adnotacji

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

CzłonekCel
AnnotationManager GetAnnotationManager(string token)Menedżer powiązany z wymiarami strony 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)Wczytaj adnotacje stworzone w C# do sesji
void LoadAnnotationData(string token, string annotationData)Wczytaj adnotacje z zakodowanej strony/envelopy Base64 zwróconej przez AnnotationManager.GetAnnotationData()
void LoadAnnotationXML(string token, XmlDocument annotationXml)Wczytaj adnotacje z XML
XmlDocument GetAnnotationXML(string token)Eksportuj adnotacje sesji jako XML
Task<byte[]> ExportAnnotationsToPdfAsync(string token, int zoom = 100, CancellationToken ct = default)PDF z wbudowanymi adnotacjami
Task<int> ExportAnnotationsToPngAsync(…)Pliki PNG z wbudowanymi adnotacjami
Task<byte[]> ExportAnnotationsToPngZipAsync(string token, int zoom = 100, CancellationToken ct = default)ZIP z plikami PNG per strona z wbudowanymi adnotacjami

Każdy z nich przyjmuje token sesji. Kształt GetAnnotationManager(pageWidth, pageHeight) wolny od sesji w poprzedniej bibliotece nadal istnieje do budowania adnotacji poza sesją, ale ich wczytanie nadal wymaga tokena.

Metadane DICOM

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

Metoda jest dostępna w celu zachowania zgodności API, ale ten pakiet nie może dostarczyć technicznych tagów DICOM: czytnik metadanych jest dostępny tylko w wersji .NET 8. Zwraca null dla sesji DICOM i nie‑DICOM; w sesji DICOM dodatkowo wypisuje jednorazowe ostrzeżenie wyjaśniające ograniczenie platformy. Renderowanie stron, klatek i animacji pozostaje wspierane.

Pomocnicy zasobów — ReferenceCss / ReferenceScripts

Wstaw tagi <link>/<script> dla osadzonych 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 klienta spójny z zachowaniem serwera.

text
string ReferenceCss(CssConfig? config = null)      // null → Bootstrap + przeglądarka + wyszukiwanie + adnotacja
string ReferenceScripts(ScriptConfig? config = null)

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

ScriptConfig flags: 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 }))

Ci pomocnicy są wspieranym sposobem dostarczania zasobów przeglądarki. Aplikacje, które skopiowały docViewer.js, documentLinks.js i docViewer.UI.js do wwwroot, powinny usunąć te kopie po tym, jak strona zostanie wyrenderowana z emitowanych tagów.

Czy ta strona była pomocna?