Przeglądarka

Główna klasa przeglądarki dokumentów

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

Viewer nie posiada stanu per‑request 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 zamknie otwartego dokumentu (zobacz Podstawowe koncepcje → Jak działa przeglądarka).

OpenDocumentAsync

Otwiera dokument i zwraca token sesji, którego widget klienta 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 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 — to steruje wykrywaniem 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 przesłania
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 licencje są odrzucane (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 odwołuje 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)

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

DocOptions

Opcje niezależne od formatu, obowiązujące przy otwieraniu (namespace Doconut):

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

Klasa udostępnia również specjalistyczne właściwości, które są celowo poza normalnym trybem wyświetlania jednego hosta:

TypWłaściwośćDomyślnieOpis
boolIsWebFarmfalseOznacza operację otwarcia jako scenariusz farmy webowej. Używać tylko z odpowiednią architekturą współdzielonego magazynu/sesji.
stringWebFarmPath""Wspólna ścieżka używana w specjalistycznym przepływie pracy farmy webowej. Pusta w normalnym przeglądarce jednego hosta.
boolEditModefalseZarezerwowane dla oddzielnie dystrybuowanego przepływu pracy Edytora; 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 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
Wiodący ^^Opcjonalny układ na wszystkich rogach. Bez niego używane jest standardowe rozmieszczenie znaku wodnego.
TekstConfidentialTekst renderowany na każdej stronie. Nie może być pusty.
KolorRedNazwana kolor rozumiany przez warstwę rysowania.
RozmiarCzcionki24Rozmiar czcionki; nieprawidłowa wartość numeryczna powoduje użycie domyślnego rozmiaru renderera.
NazwaCzcionkiVerdanaŻądana rodzina czcionek. Upewnij się, że jest zainstalowana w środowisku wdrożeniowym.
Przezroczystość80Wartość bajtowa od 0 do 255. Musi zostać poprawnie sparsowana.
Kąt-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ą w SDK alternatywą Invalid Watermark 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
Aktywny tymczasowy/demonstracyjny podgląd bazowyNieCzysta strona podglądu bazowego
Aktywny tymczasowy/demonstracyjny podgląd bazowyTakNiestandardowy znak wodny, gdy obowiązuje czysta ścieżka podglądu bazowego
Brakująca, odrzucona, wygasła, nieprawidłowa wersja lub licencja nieprawidłowej domenyObieZnak wodny wymuszający/oceniający; wartość niestandardowa go nie nadpisuje
Renderowanie wtyczki zgodnie z zasadami ocenyObieZnak wodny oceny

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ą aplikacji objętą licencją, a nie sposobem na zastąpienie lub ukrycie znaku wodnego oceny.

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 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

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

Metoda istnieje dla zgodności API, ale przeglądarka DICOM .NET 6 nie może dostarczyć technicznych tagów. Zwraca null dla sesji DICOM i nie‑DICOM; w sesji DICOM dodatkowo zapisuje jednorazowe ostrzeżenie wyjaśniające ograniczenia platformy. Renderowanie stron, klatek i animacji pozostaje wspierane.

Pomocnicze zasoby — ReferenceCss / ReferenceScripts

Emituj 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 umożliwia, utrzymując interfejs 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 inne), 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 }))

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.

Dodano w wersji 26.9.0.

Czy ta strona była pomocna?