Просмотрщик

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

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
// Простое открытие
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));

Exceptions to handle:

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

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

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

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

То же решение применяется к обслуживаемым изображениям страниц и экспорту аннотаций. Вывод анимированного 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)

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

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

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

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

GetWorksheetNames

text
IReadOnlyList<string> GetWorksheetNames(string token)

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

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

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