Просмотрщик
Основной класс просмотрщика документов
Viewer (namespace Doconut) является публичной точкой входа для открытия документов из контроллеров MVC, страниц Web Forms и обработчиков. Это transient сервис, создаваемый DoconutHost.Initialize; получайте его там, где используете:
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();new Viewer() также работает после выполнения DoconutHost.Initialize — он разрешает те же сервисы — что позволяет сохранять совместимость кода, перенесённого из классического пакета. До вызова Initialize он бросает InvalidOperationException.
Viewer не хранит состояние документа на каждый запрос и намеренно не реализует IDisposable: сеансы документов существуют независимо от него, поэтому освобождение Viewer никогда не закроет открытый документ (см. Как работает Viewer).
OpenDocumentAsync
Открывает документ и возвращает токен сеанса, который виджет использует для всех последующих запросов. Когда UnsafeMode равно false (по умолчанию), токен привязывается к ASP.NET‑сессии текущего запроса — вызывайте его из запроса, имеющего состояние сессии (см. Сессии и безопасность).
| Перегрузка | Когда использовать |
|---|---|
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 должен содержать правильное расширение — оно определяет формат |
// 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 (HttpPostedFileBase in MVC; HttpPostedFile in Web Forms)
using (var ms = new MemoryStream())
{
await file.InputStream.CopyToAsync(ms);
ms.Position = 0;
token = await viewer.OpenDocumentAsync(ms, new FileInfo(Path.GetFileName(file.FileName)));
}Исключения, которые следует обрабатывать:
LicenseException— лицензия была найдена, но отклонена (сообщение содержит причину), либо формат требует возможности плагина, которой лицензия не предоставляет.FormatNotSupportedException— ни один просмотрщик не поддерживает расширение файла.InvalidDataException— содержимое повреждено или не соответствует его расширению.
OpenDocument (synchronous)
Для кода‑behind Web Forms и другого кода, который не использует асинхронные страницы:
string OpenDocument(string filePath, BaseConfig? config = null, DocOptions? options = null)
string OpenDocument(Stream stream, string fileName, BaseConfig? config = null, DocOptions? options = null)
string OpenDocument(byte[] bytes, string fileName, BaseConfig? config = null, DocOptions? options = null)Каждый из них возвращает токен и также сохраняет его в viewer.Token. fileName должен содержать правильное расширение. Эти обёртки безопасно вызывать из страницы Web Forms: путь открытия никогда не возобновляется в контексте запроса ASP.NET, поэтому ожидание не может привести к взаимной блокировке. То же самое не верно для всех асинхронных API Doconut — см. раздел Web Forms в Плагине конвертера.
CloseDocument
void CloseDocument(string token)Удаляет сессию (немедленно освобождая движок документа), удаляет предоставление токена из текущей ASP.NET‑сессии запроса и аннулирует токен. Необязательно — скользящее истечение времени выполняет ту же очистку — но рекомендуется для больших документов.
Запросы сессии
| Член | Возвращает |
|---|---|
int GetPageCount(string token) | Общее количество страниц открытого документа |
(int Width, int Height) GetPageDimensions(string token, int page = 1) | Размер страницы по умолчанию при 100 % масштабе — координатное пространство для аннотаций, построенных в коде |
IReadOnlyList<string> GetWorksheetNames(string token) | Отображаемые листы таблицы в порядке их расположения в книге; пусто для остальных типов документов |
Каждый метод бросает исключение, если токен неизвестен или истёк.
DocOptions
Параметры, независимые от формата, задаваемые при открытии (пространство имён Doconut):
| Тип | Свойство | По умолчанию | Описание |
|---|---|---|---|
string | Password | "" | Пароль для защищённых документов (автоматически копируется в конфигурацию формата). |
string | Watermark | "" | Пользовательский текст водяного знака, отображаемый на отрисованных страницах — см. ниже. |
int | TimeOut | 60 | Скользящее истечение сессии, в минутах. |
string | BrowserId | "" | В веб‑фермах: браузер, к которому привязан подписанный билет. Устанавливается через DoconutFarmBinding.EnsureBrowserId (см. Сессии и безопасность). |
string | UserId | "" | В веб‑фермах: пользователь, к которому привязан билет, получаемый через DoconutFarmBinding.ResolveUserId. |
int | ImageResolution | 0 | Устарело. Вместо этого задайте ImageResolution в конфигурации формата. |
bool | IsSecured | true | Зарезервировано; не принудительно. Управление доступом — DoconutOptions.UnsafeMode. |
bool | IsWebFarm / string WebFarmPath | false / "" | Оставлено для кода, перенесённого из классического пакета. Они не переключают режим фермы — это делает AddDoconutDistributed. |
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 | Семейство шрифта. Должно быть установлено на сервере — в Windows Server меньше шрифтов, чем на настольных системах. |
| Opacity | 80 | Значение от 0 до 255. Должно корректно парситься. |
| Angle | -45 | Поворот в градусах; при неверном числе используется значение по умолчанию. |
Парсер ожидает ровно шесть полей после необязательного ^. Некорректное определение заменяется видимым текстом Invalid Watermark вместо тихого исчезновения.
Решение по лицензии
| Состояние лицензии | Пользовательское значение указано | Результат отрисовки |
|---|---|---|
| Действительная платная лицензия просмотрщика | Нет | Чистая страница |
| Действительная платная лицензия просмотрщика | Да | Пользовательский водяной знак |
| Активная временная/демо‑лицензия | Нет | Чистая страница |
| Активная временная/демо‑лицензия | Да | Пользовательский водяной знак |
| Отсутствующая, отклонённая, просроченная, неверной версии или с неверным доменом лицензия | Любая | Оценочный водяной знак; пользовательское значение его не заменяет |
То же решение применяется к обслуживаемым страницам и к экспорту аннотаций. Пользовательский водяной знак — это функция лицензированного приложения, а не способ заменить оценочный знак.
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) | Загружает закодированный пакет, возвращённый 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)В этом пакете он всегда возвращает null, а запрос метаданных виджета отвечает 501 Not Implemented: чтение тегов DICOM недоступно в .NET Framework. Рендеринг DICOM — страницы, кадры и анимация — работает. См. Плагин DICOM.
Вспомогательные ресурсы — ReferenceCss / ReferenceScripts
Эмитирует теги <link> и <script> для ресурсов, которые модуль ресурсов обслуживает по пути DoconutOptions.ResourcesPath, в порядке зависимостей. Файлы функций, ограниченных лицензией (Search, Annotation), эмитируются только когда лицензия их предоставляет.
string ReferenceCss(CssConfig? config = null) // null → Bootstrap + viewer + search + annotation
string ReferenceScripts(ScriptConfig? config = null)
bool IsSearchEnabled { get; } // состояние лицензии, для защиты кода инициализации ленты
bool IsAnnotationEnabled { get; }Флаги CssConfig: IncludeBootstrapCss, IncludeViewerCss, IncludeSearchCss (ограничено поиском), IncludeAnnotationCss (ограничено аннотациями).
Флаги ScriptConfig: IncludeJQuery (требуется всем остальным), IncludeBootstrap, IncludeViewerScripts (основные скрипты просмотрщика), IncludeSearchScripts и IncludeSearchBar (ограничено поиском), IncludeAnnotationScripts и IncludeAnnotationBar (ограничено аннотациями).
Оба возвращают HTML: выводите их с помощью @Html.Raw(...) в MVC 5 (генерируйте в контроллере — в представлениях нет @inject) или <%= %> в Web Forms. Быстрый старт показывает оба варианта.
RenderViewer
string RenderViewer(string elementId, string token, ViewerConfig? config = null)Возвращает блок <script>, который инициализирует виджет в элементе с id elementId и отображает документ: docViewer({...}), построенный из ViewerConfig (по умолчанию: BasePath: '/', ResPath: 'doconut-res/images'), затем вызывается .View(token). Разместите его после скриптов просмотрщика. Сгенерированный скрипт не сохраняет ссылку на объект просмотрщика, поэтому страница со своей панелью инструментов должна инициализировать виджет вручную. См. ViewerConfig.
Веб-ферма
string? AccessToken хранит подписанный билет, выданный последним открытием при активном распределённом режиме и UnsafeMode = false; в односерверной конфигурации он null. Передайте его виджету вместе с токеном: objViewer.View(token, access).
Была ли эта страница полезной?