Просмотрщик
Основной класс просмотра документов
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 должен содержать правильное расширение — оно определяет формат |
// Простое открытие
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
void CloseDocument(string token)Удаляет сеанс из кэша (немедленно освобождая движок документа), удаляет маркер безопасности и отзывает предоставление доступа. Необязательно — скользящее истечение времени выполняет ту же очистку — но рекомендуется для больших документов.
GetPageCount
int GetPageCount(string token)Общее количество страниц открытого сеанса. Выбрасывает исключение, если токен неизвестен или истёк.
GetWorksheetNames
IReadOnlyList<string> GetWorksheetNames(string token)Возвращает имена листов открытой таблицы в порядке книги, либо пустой список, если открытый документ не является таблицей.
В список попадают только отрендеренные листы: скрытые и пустые листы исключаются, а когда ExcelConfig.SheetNames ограничивает рендеринг, отображаются только эти листы. Лист не всегда соответствует одной странице — очень большой лист рендерится на нескольких страницах. Выбрасывает исключение, если токен неизвестен или истёк.
Добавлено в версии 26.9.0.
Флаги возможностей
| Член | Значение |
|---|---|
bool IsSearchEnabled | Текущая лицензия предоставляет Search |
bool IsAnnotationEnabled | Текущая лицензия предоставляет Annotation |
Используйте их в представлении Razor, чтобы отобразить лицензированную ленту только когда сервер действительно будет её обслуживать — см. Быстрый старт.
DocOptions
Опции, независимые от формата, применяемые при каждом открытии (пространство имён Doconut):
| Тип | Свойство | Значение по умолчанию | Описание |
|---|---|---|---|
string | Password | "" | Пароль для защищённых документов (автоматически копируется в конфигурацию формата). |
int | ImageResolution | 0 | Устарело. Оставлено только для совместимости — вместо этого установите ImageResolution в конфигурации формата. |
string | Watermark | "" | Пользовательский текст водяного знака, отображаемый на отрисованных страницах. Формат строки: "^Text~Color~FontSize~FontName~Opacity~Angle", например "^Sample Copy~Red~24~Verdana~80~-45". |
int | TimeOut | 60 | Скользящее истечение сессии в минутах. |
bool | IsSecured | true | В настоящее время не применяется — зарезервировано. Привязка токенов контролируется глобально через DoconutOptions.UnsafeMode (см. Core Concepts → Sessions & Security). |
Класс также предоставляет специализированные свойства, которые намеренно находятся вне обычного потока просмотра на одном хосте:
| Тип | Свойство | Значение по умолчанию | Описание |
|---|---|---|---|
bool | IsWebFarm | false | Помечает операцию открытия как сценарий совместного хранилища. Обратите внимание на регистр — в предыдущей библиотеке это было написано как IsWebfarm. |
string | WebFarmPath | "" | Общий путь, используемый в этом рабочем процессе. Ранее записывался как WebfarmPath. Пустой в обычном просмотрщике на одном хосте и не требуется в пути публикации, описанном в Распределённые развертывания. |
bool | EditMode | false | Зарезервировано для отдельного распределённого рабочего процесса редактирования; оставьте false для стандартного просмотрщика. |
Пользовательский водяной знак
DocOptions.Watermark использует шесть полей, разделённых тильдами. Необязательный начальный ^ запрашивает расположение во всех углах:
^Text~Color~FontSize~FontName~Opacity~Anglestring token = await viewer.OpenDocumentAsync(
path,
new PdfConfig(),
new DocOptions
{
Watermark = "^Confidential~Red~24~Verdana~80~-45",
TimeOut = 30
});| Поле | Пример | Значение |
|---|---|---|
Ведущий ^ | ^ | Необязательное расположение во всех углах. Без него используется обычное размещение водяного знака. |
| Text | Confidential | Текст, отображаемый на каждой странице. Не должен быть пустым. |
| Color | Red | Именованный цвет, понятный слою рисования. |
| FontSize | 24 | Размер шрифта; при неверном числовом вводе используется значение по умолчанию рендерера. |
| FontName | Verdana | Запрашиваемое семейство шрифтов. Убедитесь, что оно установлено в среде развертывания. |
| Opacity | 80 | Значение байта от 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
Task<DicomMetadata?> GetDicomMetadataAsync(string token, CancellationToken ct = default)Метод присутствует для согласования API, но этот пакет не может предоставить технические теги DICOM: читатель метаданных поставляется только в сборке .NET 8. Он возвращает null для DICOM и не‑DICOM сессий; в DICOM‑сессии также выводит одноразовое предупреждение, объясняющее ограничение платформы. Отрисовка страниц, кадров и анимаций остаётся поддерживаемой.
Вспомогательные ресурсы — ReferenceCss / ReferenceScripts
Выводите теги <link>/<script> для встроенных ресурсов, обслуживаемых UseDoconutResources(), в правильном порядке зависимостей. Пакеты для функций, ограниченных лицензией, таких как поиск и аннотация, выводятся только когда лицензия их активирует, поддерживая согласованность пользовательского интерфейса клиента с поведением сервера.
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 (ограничено аннотацией).
@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, должны удалить эти копии после того, как страница отобразится с помощью выведенных тегов.
Была ли эта страница полезной?