Просмотрщик
Основной класс просмотра документов
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) | Документ не является файлом на диске (загрузка, база данных, 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)Общее количество страниц открытого сеанса. Выбрасывает исключение, если токен неизвестен или истёк.
Capability flags
| Член | Значение |
|---|---|
bool IsSearchEnabled | Текущая лицензия предоставляет Search |
bool IsAnnotationEnabled | Текущая лицензия предоставляет Annotation |
Используйте эти свойства в Razor‑view, чтобы отрисовать лицензированную ленту только тогда, когда сервер действительно её обслуживает — см. Быстрый старт.
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 | Помечает операцию открытия как сценарий с общим хранилищем. Обратите внимание на регистр — в предыдущей библиотеке это было 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
});| Поле | Пример | Значение |
|---|---|---|
Начальный ^ | ^ | Необязательное размещение по всем углам. Без него используется обычное размещение водяного знака. |
| Текст | Confidential | Текст, отображаемый на каждой странице. Не должен быть пустым. |
| Цвет | Red | Именованный цвет, понятный слою отрисовки. |
| Размер шрифта | 24 | Размер шрифта; неверный числовой ввод приводит к использованию значения по умолчанию рендерера. |
| Имя шрифта | Verdana | Запрошенное семейство шрифтов. Убедитесь, что оно установлено в среде развертывания. |
| Непрозрачность | 80 | Значение байта от 0 до 255. Должно успешно парситься. |
| Угол | -45 | Угол вращения в градусах; неверный числовой ввод приводит к использованию значения по умолчанию. |
Парсер ожидает ровно шесть полей после необязательного ^. Неверное определение заменяется видимым в SDK запасным вариантом Invalid Watermark вместо того, чтобы исчезнуть без предупреждения.
Решение по лицензии
| Состояние лицензии | Пользовательское значение предоставлено | Отображаемый результат |
|---|---|---|
| Действительная платная лицензия просмотрщика | Нет | Чистая страница |
| Действительная платная лицензия просмотрщика | Да | Пользовательский водяной знак |
| Активный временный/демо базовый просмотрщик | Нет | Чистая страница базового просмотрщика |
| Активный временный/демо базовый просмотрщик | Да | Пользовательский водяной знак, когда применяется путь чистого базового просмотрщика |
| Отсутствующая, отклонённая, просроченная, неверной версии или с неверным доменом лицензия | Любое | Водяной знак принудительного/оценочного режима; пользовательское значение не переопределяет его |
| Отрисовка плагина по правилам оценки | Любое | Оценочный водяной знак |
То же решение применяется к обслуживаемым изображениям страниц и экспортам аннотаций. При выводе анимированного 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) | Загружает аннотации из закодированного 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 по страницам с внедрёнными аннотациями |
Каждый из этих методов принимает токен сессии. Форма без сессии из предыдущей библиотеки GetAnnotationManager(pageWidth, pageHeight) сохраняется для построения аннотаций вне сессии, но их загрузка всё равно требует токена.
Метаданные DICOM
Task<DicomMetadata?> GetDicomMetadataAsync(string token, CancellationToken ct = default)Метод присутствует для согласования API, но данный пакет не может предоставить технические теги DICOM: читатель метаданных поставляется только в сборке .NET 8. Он возвращает null для DICOM и недиоковых сессий; в DICOM‑сессии также выводит одноразовое предупреждение, объясняющее ограничение платформы. Отображение страниц, кадров и анимаций остаётся поддерживаемым.
Помощники ресурсов — ReferenceCss / ReferenceScripts
Эмитировать теги <link>/<script> для встроенных ресурсов, обслуживаемых UseDoconutResources(), в правильном порядке зависимостей. Пакеты для функций, ограниченных лицензией, таких как поиск и аннотация, эмитируются только когда лицензия их разрешает, поддерживая согласованность пользовательского интерфейса клиента с поведением сервера.
string ReferenceCss(CssConfig? config = null) // null → Bootstrap + viewer + search + annotation
string ReferenceScripts(ScriptConfig? config = null)CssConfig флаги: IncludeBootstrapCss, IncludeViewerCss, IncludeSearchCss (search-gated), IncludeAnnotationCss (annotation-gated).
ScriptConfig флаги: IncludeJQuery (required by all others), IncludeBootstrap, IncludeViewerScripts (core: docViewer.js + splitter + links), IncludeSearchScripts and IncludeSearchBar (search-gated), IncludeAnnotationScripts and IncludeAnnotationBar (annotation-gated).
@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, должны удалить эти копии после того, как страница будет отрисована с помощью сгенерированных тегов.
Была ли эта страница полезной?