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