Просмотрщик

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

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

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

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""Пароль для защищённых документов (автоматически копируется в конфигурацию формата).
intImageResolution0Устарело. Сохраняется только для совместимости — вместо этого задавайте ImageResolution в конфигурации формата.
stringWatermark""Пользовательский текст водяного знака, отображаемый на отрисованных страницах. Формат строки: \"^Text~Color~FontSize~FontName~Opacity~Angle\", например \"^Sample Copy~Red~24~Verdana~80~-45\".
intTimeOut60Скользящее истечение сеанса в минутах.
boolIsSecuredtrueВ настоящее время не применяется — зарезервировано. Привязка токена контролируется глобально параметром DoconutOptions.UnsafeMode (см. Основные концепции → Сеансы и безопасность).
ТипСвойствоЗначение по умолчаниюОписание
boolIsWebFarmfalseПомечает операцию открытия как сценарий web‑farm. Использовать только с соответствующей архитектурой общего хранилища/сеанса.
stringWebFarmPath""Общий путь, используемый в специализированном рабочем процессе web‑farm. Пусто в обычном однопользовательском просмотрщике.
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 вместо тихого исчезновения.

Решение по лицензии

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

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

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)Загружает аннотации из закодированного 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

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

Возвращает метаданные DICOM‑тегов для сеансов, открытых через плагин DICOM; null для недICOM‑документов.

Вспомогательные ресурсы — 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 }))

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