Просмотрщик
Основной класс просмотра документов
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 должен содержать правильное расширение — оно определяет формат |
// Простое открытие
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)Общее количество страниц открытого сеанса. Выбрасывает исключение, если токен неизвестен или истёк.
DocOptions
Параметры, независимые от формата, задаваемые при открытии (namespace 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 | Отмечает операцию открытия как сценарий веб‑фермы. Использовать только с соответствующей архитектурой общего хранилища/сеанса. |
string | WebFarmPath | "" | Общий путь, используемый в специализированном рабочем процессе веб‑фермы. Пусто в обычном одностороннем просмотрщике. |
bool | EditMode | false | Зарезервировано для отдельного рабочего процесса Editor; оставьте 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
});| Поле | Пример | Значение |
|---|---|---|
Leading ^ | ^ | Необязательное расположение по всем углам. Без него используется обычное размещение водяного знака. |
| Text | Confidential | Текст, отображаемый на каждой странице. Он не должен быть пустым. |
| Color | Red | Именованный цвет, понятный слою рисования. |
| FontSize | 24 | Размер шрифта; неверный числовой ввод приводит к использованию значения по умолчанию рендерера. |
| FontName | Verdana | Запрашиваемое семейство шрифтов. Убедитесь, что оно установлено в среде развертывания. |
| Opacity | 80 | Значение байта от 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
Task<DicomMetadata?> GetDicomMetadataAsync(string token, CancellationToken ct = default)Возвращает метаданные тегов DICOM для сессий, открытых через плагин DICOM; null для недICOM‑документов.
Вспомогательные ресурсы — ReferenceCss / ReferenceScripts
Вставьте теги <link>/<script> для встроенных ресурсов, обслуживаемых UseDoconutResources(), в правильном порядке зависимостей. Пакеты для функций, ограниченных лицензией, таких как поиск и аннотации, генерируются только когда лицензия их разрешает, поддерживая согласованность пользовательского интерфейса клиента с поведением сервера.
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 }))ПолучитьИменаЛистов
IReadOnlyList<string> GetWorksheetNames(string token)Возвращает имена листов открытой таблицы в порядке книги, либо пустой список, если открытый документ не является таблицей.
Добавлено в 26.9.0.
Была ли эта страница полезной?