Просмотрщик

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

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)Документ не является файлом на диске (загрузка, база данных, блоб). fileInfo должен содержать правильное расширение — оно определяет формат
csharp
// Простое открытие
string token = await viewer.OpenDocumentAsync(path);

// С конфигурацией и опциями для каждого формата
token = await viewer.OpenDocumentAsync(
    path,
    new PdfConfig { AllowSearch = true, AllowCopy = true },
    new DocOptions { TimeOut = 30 });

// Из загрузки
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)

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

GetWorksheetNames

text
IReadOnlyList<string> GetWorksheetNames(string token)

Возвращает имена листов открытой таблицы в порядке книги, либо пустой список, если открытый документ не является таблицей.

В список попадают только отрендеренные листы: скрытые и пустые листы исключаются, а когда ExcelConfig.SheetNames ограничивает рендеринг, отображаются только эти листы. Лист не всегда соответствует одной странице — очень большой лист рендерится на нескольких страницах. Выбрасывает исключение, если токен неизвестен или истёк.

Добавлено в версии 26.9.0.

Флаги возможностей

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

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

DocOptions

Опции, независимые от формата, применяемые при каждом открытии (пространство имён 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
    });
ПолеПримерЗначение
Ведущий ^^Необязательное расположение во всех углах. Без него используется обычное размещение водяного знака.
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)Загружать аннотации из закодированной страницы/конверта 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 сессий; в DICOM‑сессии также выводит одноразовое предупреждение, объясняющее ограничение платформы. Отрисовка страниц, кадров и анимаций остаётся поддерживаемой.

Вспомогательные ресурсы — ReferenceCss / ReferenceScripts

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

text
string ReferenceCss(CssConfig? config = null)      // null → Bootstrap + просмотр + поиск + аннотация
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 }))

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

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