Просмотрщик

Основной класс просмотрщика документов

Viewer (namespace Doconut) является публичной точкой входа для открытия документов из Razor‑страниц, MVC‑контроллеров, компонентов Blazor или минимальных API. Он sealed, зарегистрирован как transient сервис через AddDoconut(), и разрешается через внедрение через конструктор — никогда не создавайте его напрямую.

Viewer не хранит состояние между запросами и намеренно не реализует IDisposable: сеансы документов живут независимо в кэше сеансов, поэтому освобождение сервиса никогда не может закрыть открытый документ (см. Core Concepts → How the Viewer Works).

OpenDocumentAsync

Открывает документ и возвращает токен сеанса, который клиентский виджет использует для всех последующих запросов.

ПерегрузкаКогда использовать
Task<string> OpenDocumentAsync(string filePath, DocOptions? options = null, CancellationToken ct = default)Открытие с диска с автоматическим определением формата и конфигурацией по умолчанию для данного формата
Task<string> OpenDocumentAsync(string filePath, BaseConfig? config, DocOptions? options = null, CancellationToken ct = default)Требуются параметры рендеринга для конкретного формата (PdfConfig, WordConfig, …)
Task<string> OpenDocumentAsync(Stream stream, FileInfo fileInfo, BaseConfig? config = null, DocOptions? options = null, CancellationToken ct = default)Документ не является файлом на диске (загрузка, база данных, blob). fileInfo должен содержать правильное расширение — оно определяет формат
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));

Исключения для обработки:

  • LicenseException — найденная лицензия отклонена (сообщение содержит причину отклонения) или формат требует возможности плагина, которая больше не предоставляется. Истечение срока лицензии без сообщения об отклонении приводит к водяному знаку вместо выброса исключения.
  • FormatNotSupportedException — Document format '<extension>' is not supported.
  • InvalidDataException — содержимое файла повреждено или не соответствует его расширению.

CloseDocument

text
void CloseDocument(string token)

Удаляет сеанс из кэша (немедленно освобождая движок документа), удаляет маркер безопасности и отзывает предоставление доступа. Необязательно — скользящее истечение времени выполняет ту же очистку, но рекомендуется для больших документов.

GetPageCount

text
int GetPageCount(string token)

Общее количество страниц открытого сеанса. Выбрасывает исключение, если токен неизвестен или истёк.

DocOptions

Параметры, независимые от формата, задаваемые при открытии (namespace Doconut):

ТипСвойствоПо‑умолчаниюОписание
stringPassword""Пароль для защищённых документов (автоматически копируется в конфигурацию формата).
intImageResolution0Obsolete. Оставлен только для совместимости — устанавливайте ImageResolution в конфигурации формата.
stringWatermark""Пользовательский текст водяного знака, отображаемый на отрисованных страницах. Формат строки: "^Text~Color~FontSize~FontName~Opacity~Angle", например "^Sample Copy~Red~24~Verdana~80~-45".
intTimeOut60Скользящее истечение сеанса в минутах.
boolIsSecuredtrueNot currently enforced — резерв. Привязка токена контролируется глобально через DoconutOptions.UnsafeMode (см. Core Concepts → Sessions & Security).

Класс также предоставляет специализированные свойства, которые намеренно находятся вне обычного потока просмотра на одном хосте:

ТипСвойствоПо‑умолчаниюОписание
boolIsWebFarmfalseПомечает операцию открытия как сценарий веб‑фермы. Используется только с соответствующей архитектурой общего хранилища/сеанса.
stringWebFarmPath""Общий путь, используемый в специализированном рабочем процессе веб‑фермы. Пусто в обычном однопользовательском просмотрщике.
boolEditModefalseЗарезервировано для отдельного распределённого рабочего процесса Editor; оставьте false для стандартного просмотрщика.

Custom watermark

DocOptions.Watermark использует шесть полей, разделённых тильдами. Необязательный начальный символ ^ запрашивает размещение по всем углам:

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
    });
ПолеПримерЗначение
Ведущий ^^Необязательное размещение по всем углам. Без него используется обычное размещение водяного знака.
TextConfidentialТекст, отображаемый на каждой странице. Не должен быть пустым.
ColorRedИменованный цвет, понятный слою отрисовки.
FontSize24Размер шрифта; при неверном числовом вводе используется значение по умолчанию рендерера.
FontNameVerdanaЗапрашиваемое семейство шрифтов. Убедитесь, что шрифт установлен в среде развертывания.
Opacity80Значение байта от 0 до 255. Должно успешно парситься.
Angle-45Угол вращения в градусах; при неверном вводе используется значение по умолчанию.

Парсер ожидает ровно шесть полей после необязательного ^. Неверное определение заменяется видимым в SDK Invalid Watermark вместо тихого исчезновения.

License decision

Состояние лицензииПользовательское значение указаноРезультат рендеринга
Действующая платная лицензия просмотрщикаНетЧистая страница
Действующая платная лицензия просмотрщикаДаПользовательский водяной знак
Активная временная/демо‑база просмотрщикаНетЧистая страница базового просмотрщика
Активная временная/демо‑база просмотрщикаДаПользовательский водяной знак, когда применяется путь чистого базового просмотрщика
Отсутствующая, отклонённая, просроченная, неверной версии или недействительная лицензия по доменуЛюбаяВодяной знак принудительного применения/оценки; пользовательское значение не переопределяет его
Рендеринг плагина в режиме оценкиЛюбаяВодяной знак оценки

То же решение применяется к обслуживаемым изображениям страниц и экспортам аннотаций. Вывод анимированного GIF помечается кадр за кадром. Пользовательский водяной знак, следовательно, является функцией лицензированного приложения, а не способом заменить или подавить оценочный водяной знак.

Annotations API

Загрузка и экспорт аннотаций на стороне сервера. Полный пошаговый гид находится в Guides → Annotations; поверхностный API выглядит так:

ЧленНазначение
AnnotationManager GetAnnotationManager(string token)Менеджер, привязанный к размерам страниц открытого сеанса
AnnotationManager GetAnnotationManager(string token, int pageWidth, int pageHeight)Менеджер с явно заданными размерами страниц
AnnotationManager GetAnnotationManager(int pageWidth, int pageHeight)Менеджер, независимый от сеанса
void LoadAnnotationData(string token, AnnotationManager manager)Загружает аннотации, построенные в C#, в сеанс
void LoadAnnotationData(string token, string annotationData)Загружает аннотации из закодированного envelope page/Base64, возвращённого AnnotationManager.GetAnnotationData()
void LoadAnnotationXML(string token, XmlDocument annotationXml)Загружает аннотации из XML
XmlDocument GetAnnotationXML(string token)Экспортирует аннотации сеанса в виде XML
Task<byte[]> ExportAnnotationsToPdfAsync(string token, int zoom = 100, CancellationToken ct = default)PDF с «вжженными» аннотациями
Task<int> ExportAnnotationsToPngAsync(…)PNG‑файлы с «вжженными» аннотациями
Task<byte[]> ExportAnnotationsToPngZipAsync(string token, int zoom = 100, CancellationToken ct = default)ZIP‑архив PNG‑страниц с «вжженными» аннотациями

DICOM metadata

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

Метод присутствует для согласованности API, но просмотрщик DICOM в .NET 6 не может предоставить технические теги. Он возвращает null для DICOM и недиоком‑сеансов; в DICOM‑сеансе также выводит одноразовое предупреждение о ограничениях платформы. Рендеринг страниц, кадров и анимаций остаётся поддерживаемым.

Resource helpers — ReferenceCss / ReferenceScripts

Генерирует теги <link>/<script> для встроенных ресурсов, обслуживаемых UseDoconutResources(), в правильном порядке зависимостей. Пакеты для функций, ограниченных лицензией (поиск, аннотации), выводятся только когда лицензия их включает, поддерживая согласованность UI клиента с поведением сервера.

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

Флаги CssConfig: IncludeBootstrapCss, IncludeViewerCss, IncludeSearchCss (поиск), IncludeAnnotationCss (аннотации).

Флаги ScriptConfig: IncludeJQuery (требуется всеми остальными), IncludeBootstrap, IncludeViewerScripts (ядро: docViewer.js + splitter + links), IncludeSearchScripts и IncludeSearchBar (поиск), IncludeAnnotationScripts и IncludeAnnotationBar (аннотации).

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

Была ли эта страница полезной?