Переглядач

Головний клас переглядача документів

Viewer (namespace Doconut) є публічною точкою входу для відкриття документів з контролерів MVC, сторінок Web Forms та обробників. Це транзієнтна служба, створена DoconutHost.Initialize; отримайте її там, де використовуєте:

csharp
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();

new Viewer() також працює після запуску DoconutHost.Initialize — він вирішує ті самі служби — що дозволяє зберегти сумісність коду, мігруваного з класичного пакету. До Initialize викликає InvalidOperationException.

Viewer не зберігає стан документа на запит і навмисно не реалізує IDisposable: сеанси документів живуть незалежно від нього, тому знищення 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)Документ не є файлом на диску (завантаження, база даних, blob). 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 (синхронний)

Для коду‑бекенду 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 Plugin.

Помічники ресурсів — 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; }                       // license state, for guarding ribbon init code
bool IsAnnotationEnabled { get; }

CssConfig прапорці: IncludeBootstrapCss, IncludeViewerCss, IncludeSearchCss (search-gated), IncludeAnnotationCss (annotation-gated).

ScriptConfig прапорці: IncludeJQuery (потрібний усім іншим), IncludeBootstrap, IncludeViewerScripts (основні скрипти переглядача), IncludeSearchScripts і IncludeSearchBar (search-gated), IncludeAnnotationScripts і IncludeAnnotationBar (annotation-gated).

Обидва повертають HTML: пишіть їх за допомогою @Html.Raw(...) у MVC 5 (генеруйте їх у контролері — у представленнях немає @inject) або <%= %> у Web Forms. Quick Start показує обидва.

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

Чи була ця сторінка корисною?