Просмотрщик

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

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

В предыдущей библиотеке .NET Standard был публичный конструктор, принимающий кэш памяти, аксессор HTTP‑контекста и один или несколько путей к лицензиям. Этот конструктор удалён; граф сервисов поставляет эти зависимости.

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

OpenDocumentAsync

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

ПерегрузкаКогда использовать
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)

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

Capability flags

ЧленЗначение
bool IsSearchEnabledТекущая лицензия предоставляет Search
bool IsAnnotationEnabledТекущая лицензия предоставляет Annotation

Используйте эти свойства в Razor‑view, чтобы отрисовать лицензированную ленту только тогда, когда сервер действительно её обслуживает — см. Быстрый старт.

DocOptions

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

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

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

ТипСвойствоПо умолчаниюОписание
boolIsWebFarmfalseПомечает операцию открытия как сценарий с общим хранилищем. Обратите внимание на регистр — в предыдущей библиотеке это было IsWebfarm.
stringWebFarmPath""Общий путь, используемый в этом рабочем процессе. Раньше назывался WebfarmPath. Пусто в обычном однохостовом просмотрщике и не требуется для пути публикации, описанного в Распределённые развертывания.
boolEditModefalseЗарезервировано для отдельного распределённого рабочего процесса редактирования; оставьте false для стандартного просмотрщика.

Пользовательский водяной знак

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

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

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

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

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

API аннотаций

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

ЧленНазначение
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 по страницам с внедрёнными аннотациями

Каждый из этих методов принимает токен сессии. Форма без сессии из предыдущей библиотеки GetAnnotationManager(pageWidth, pageHeight) сохраняется для построения аннотаций вне сессии, но их загрузка всё равно требует токена.

Метаданные DICOM

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

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

Помощники ресурсов — ReferenceCss / ReferenceScripts

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

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

CssConfig флаги: IncludeBootstrapCss, IncludeViewerCss, IncludeSearchCss (search-gated), IncludeAnnotationCss (annotation-gated).

ScriptConfig флаги: IncludeJQuery (required by all others), IncludeBootstrap, IncludeViewerScripts (core: docViewer.js + splitter + links), IncludeSearchScripts and IncludeSearchBar (search-gated), IncludeAnnotationScripts and IncludeAnnotationBar (annotation-gated).

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

Эти помощники являются поддерживаемым способом доставки ресурсов браузера. Приложения, которые скопировали docViewer.js, documentLinks.js и docViewer.UI.js в wwwroot, должны удалить эти копии после того, как страница будет отрисована с помощью сгенерированных тегов.

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