Просмотрщик
Основной класс просмотрщика документов
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 должен содержать правильное расширение — оно определяет формат |
// 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
void CloseDocument(string token)Удаляет сеанс из кэша (немедленно освобождая движок документа), удаляет маркер безопасности и отзывает предоставление доступа. Необязательно — скользящее истечение времени выполняет ту же очистку, но рекомендуется для больших документов.
GetPageCount
int GetPageCount(string token)Общее количество страниц открытого сеанса. Выбрасывает исключение, если токен неизвестен или истёк.
DocOptions
Параметры, независимые от формата, задаваемые при открытии (namespace Doconut):
| Тип | Свойство | По‑умолчанию | Описание |
|---|---|---|---|
string | Password | "" | Пароль для защищённых документов (автоматически копируется в конфигурацию формата). |
int | ImageResolution | 0 | Obsolete. Оставлен только для совместимости — устанавливайте ImageResolution в конфигурации формата. |
string | Watermark | "" | Пользовательский текст водяного знака, отображаемый на отрисованных страницах. Формат строки: "^Text~Color~FontSize~FontName~Opacity~Angle", например "^Sample Copy~Red~24~Verdana~80~-45". |
int | TimeOut | 60 | Скользящее истечение сеанса в минутах. |
bool | IsSecured | true | Not currently enforced — резерв. Привязка токена контролируется глобально через DoconutOptions.UnsafeMode (см. Core Concepts → Sessions & Security). |
Класс также предоставляет специализированные свойства, которые намеренно находятся вне обычного потока просмотра на одном хосте:
| Тип | Свойство | По‑умолчанию | Описание |
|---|---|---|---|
bool | IsWebFarm | false | Помечает операцию открытия как сценарий веб‑фермы. Используется только с соответствующей архитектурой общего хранилища/сеанса. |
string | WebFarmPath | "" | Общий путь, используемый в специализированном рабочем процессе веб‑фермы. Пусто в обычном однопользовательском просмотрщике. |
bool | EditMode | false | Зарезервировано для отдельного распределённого рабочего процесса Editor; оставьте false для стандартного просмотрщика. |
Custom watermark
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 вместо тихого исчезновения.
License decision
| Состояние лицензии | Пользовательское значение указано | Результат рендеринга |
|---|---|---|
| Действующая платная лицензия просмотрщика | Нет | Чистая страница |
| Действующая платная лицензия просмотрщика | Да | Пользовательский водяной знак |
| Активная временная/демо‑база просмотрщика | Нет | Чистая страница базового просмотрщика |
| Активная временная/демо‑база просмотрщика | Да | Пользовательский водяной знак, когда применяется путь чистого базового просмотрщика |
| Отсутствующая, отклонённая, просроченная, неверной версии или недействительная лицензия по домену | Любая | Водяной знак принудительного применения/оценки; пользовательское значение не переопределяет его |
| Рендеринг плагина в режиме оценки | Любая | Водяной знак оценки |
То же решение применяется к обслуживаемым изображениям страниц и экспортам аннотаций. Вывод анимированного GIF помечается кадр за кадром. Пользовательский водяной знак, следовательно, является функцией лицензированного приложения, а не способом заменить или подавить оценочный водяной знак.
Annotations API
Загрузка и экспорт аннотаций на стороне сервера. Полный пошаговый гид находится в Guides → Annotations; поверхностный 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) | Загружает аннотации из закодированного envelope 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 metadata
Task<DicomMetadata?> GetDicomMetadataAsync(string token, CancellationToken ct = default)Метод присутствует для согласованности API, но просмотрщик DICOM в .NET 6 не может предоставить технические теги. Он возвращает null для DICOM и недиоком‑сеансов; в DICOM‑сеансе также выводит одноразовое предупреждение о ограничениях платформы. Рендеринг страниц, кадров и анимаций остаётся поддерживаемым.
Resource helpers — ReferenceCss / ReferenceScripts
Генерирует теги <link>/<script> для встроенных ресурсов, обслуживаемых UseDoconutResources(), в правильном порядке зависимостей. Пакеты для функций, ограниченных лицензией (поиск, аннотации), выводятся только когда лицензия их включает, поддерживая согласованность UI клиента с поведением сервера.
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 (аннотации).
@inject Doconut.Viewer Viewer
@Html.Raw(Viewer.ReferenceCss(new CssConfig { IncludeBootstrapCss = true, IncludeViewerCss = true }))
@Html.Raw(Viewer.ReferenceScripts(new ScriptConfig { IncludeJQuery = true, IncludeViewerScripts = true }))Была ли эта страница полезной?