Просмотрщик

Основной класс просмотрщика документов

Viewer (namespace Doconut) является публичной точкой входа для открытия документов из контроллеров MVC, страниц Web Forms и обработчиков. Это transient сервис, создаваемый DoconutHost.Initialize; получайте его там, где используете:

csharp
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 должен содержать правильное расширение — оно определяет формат
csharp
// 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 и другого кода, который не использует асинхронные страницы:

text
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

text
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):

ТипСвойствоПо умолчаниюОписание
stringPassword""Пароль для защищённых документов (автоматически копируется в конфигурацию формата).
stringWatermark""Пользовательский текст водяного знака, отображаемый на отрисованных страницах — см. ниже.
intTimeOut60Скользящее истечение сессии, в минутах.
stringBrowserId""В веб‑фермах: браузер, к которому привязан подписанный билет. Устанавливается через DoconutFarmBinding.EnsureBrowserId (см. Сессии и безопасность).
stringUserId""В веб‑фермах: пользователь, к которому привязан билет, получаемый через DoconutFarmBinding.ResolveUserId.
intImageResolution0Устарело. Вместо этого задайте ImageResolution в конфигурации формата.
boolIsSecuredtrueЗарезервировано; не принудительно. Управление доступом — DoconutOptions.UnsafeMode.
boolIsWebFarm / string WebFarmPathfalse / ""Оставлено для кода, перенесённого из классического пакета. Они не переключают режим фермы — это делает AddDoconutDistributed.
boolEditModefalseЗарезервировано для отдельного редактора; оставьте false.

Пользовательский водяной знак

DocOptions.Watermark принимает шесть полей, разделённых тильдами. Необязательный начальный символ ^ запрашивает размещение по всем углам:

text
^Text~Color~FontSize~FontName~Opacity~Angle
csharp
string token = await viewer.OpenDocumentAsync(
    path,
    new PdfConfig(),
    new DocOptions
    {
        Watermark = "^Confidential~Red~24~Verdana~80~-45",
        TimeOut = 30
    });
ПолеПримерЗначение
Ведущий ^^Необязательное размещение по всем углам. Если отсутствует, используется обычное позиционирование.
TextConfidentialТекст, выводимый на каждой странице. Не должен быть пустым.
ColorRedИменованный цвет.
FontSize24Размер шрифта; при неверном числовом значении используется значение по умолчанию.
FontNameVerdanaСемейство шрифта. Должно быть установлено на сервере — в Windows Server меньше шрифтов, чем на настольных системах.
Opacity80Значение от 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

text
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), эмитируются только когда лицензия их предоставляет.

text
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

text
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).

Была ли эта страница полезной?