Просмотрщик

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

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)Документ не является файлом на диске (загрузка, база данных, блоб). 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)

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

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

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

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

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

То же решение применяется к обслуживаемым изображениям страниц и экспорту аннотаций. Вывод анимированного 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)Загрузить аннотации из закодированной страницы/конверта 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(), в правильном порядке зависимостей. Пакеты для функций, ограниченных лицензией, таких как поиск и аннотации, генерируются только когда лицензия их разрешает, поддерживая согласованность пользовательского интерфейса клиента с поведением сервера.

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

ПолучитьИменаЛистов

text
IReadOnlyList<string> GetWorksheetNames(string token)

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

Добавлено в 26.9.0.

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