Visor

La clase principal del visor de documentos

Viewer (namespace Doconut) es el punto de entrada público para abrir documentos desde controladores MVC, páginas Web Forms y manejadores. Es un servicio transitorio compuesto por DoconutHost.Initialize; resuélvelo donde lo uses:

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

new Viewer() también funciona una vez que DoconutHost.Initialize se ha ejecutado — resuelve los mismos servicios — lo que permite que el código migrado del paquete clásico siga compilando. Antes de Initialize, lanza InvalidOperationException.

Viewer no mantiene estado de documento por solicitud y deliberadamente no implementa IDisposable: las sesiones de documento viven independientemente de él, por lo que disponer un Viewer nunca podría cerrar un documento abierto (ver Cómo funciona el Visor).

OpenDocumentAsync

Abre un documento y devuelve el token de sesión que el widget utiliza para cada solicitud posterior. Cuando UnsafeMode es false (el valor predeterminado), el token se otorga a la sesión ASP.NET de la solicitud actual — llámalo desde una solicitud que tenga estado de sesión (ver Sesiones y Seguridad).

SobrecargaCuándo usar
Task<string> OpenDocumentAsync(string filePath, DocOptions? options = null, CancellationToken ct = default)Abrir desde disco con detección automática de formato y la configuración predeterminada del formato
Task<string> OpenDocumentAsync(string filePath, BaseConfig? config, DocOptions? options = null, CancellationToken ct = default)Necesitas opciones de renderizado por formato (PdfConfig, WordConfig, …)
Task<string> OpenDocumentAsync(Stream stream, FileInfo fileInfo, BaseConfig? config = null, DocOptions? options = null, CancellationToken ct = default)El documento no es un archivo en disco (una carga, una base de datos, un blob). fileInfo debe contener la extensión correcta — selecciona el formato
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)));
}

Excepciones a manejar:

  • LicenseException — se encontró una licencia pero fue rechazada (el mensaje contiene la razón), o el formato necesita una capacidad de complemento que la licencia no otorga.
  • FormatNotSupportedException — ningún visor maneja la extensión del archivo.
  • InvalidDataException — el contenido está corrupto o no coincide con su extensión.

OpenDocument (sincrónico)

Para el código behind de Web Forms y otro código que no utiliza páginas asíncronas:

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)

Cada una devuelve el token y también lo almacena en viewer.Token. fileName debe contener la extensión correcta. Estos envoltorios son seguros para llamar desde una página Web Forms: la ruta de apertura nunca se reanuda en el contexto de solicitud ASP.NET, por lo que esperar en ella no puede causar un bloqueo. Lo mismo no es cierto para todas las API asíncronas de Doconut — vea la sección de Web Forms de Complemento de Convertidor.

CerrarDocumento

text
void CloseDocument(string token)

Elimina la sesión (liberando el motor de documentos inmediatamente), elimina la concesión del token de la sesión ASP.NET de la solicitud actual y revoca el token. Opcional — la expiración deslizante realiza la misma limpieza — pero se recomienda para documentos grandes.

Consultas de sesión

MiembroDevuelve
int GetPageCount(string token)Páginas totales del documento abierto
(int Width, int Height) GetPageDimensions(string token, int page = 1)Tamaño de página renderizado por defecto al 100 % de zoom — el espacio de coordenadas para anotaciones construidas en código
IReadOnlyList<string> GetWorksheetNames(string token)Hojas de cálculo renderizadas, en orden del libro; vacío para otros documentos

Cada uno lanza una excepción si el token es desconocido o ha expirado.

OpcionesDoc

Opciones por apertura, independientes del formato (namespace Doconut):

TipoPropiedadPredeterminadoDescripción
stringPassword""Contraseña para documentos protegidos (copiada automáticamente en la configuración del formato).
stringWatermark""Texto de marca de agua personalizado dibujado en las páginas renderizadas — ver abajo.
intTimeOut60Expiración deslizante de la sesión, en minutos.
stringBrowserId""Granjas web: el navegador al que está vinculado un ticket firmado. Configúrelo con DoconutFarmBinding.EnsureBrowserId (ver Sesiones y Seguridad).
stringUserId""Granjas web: el usuario autenticado al que está vinculado un ticket, desde DoconutFarmBinding.ResolveUserId.
intImageResolution0Obsoleto. Establezca ImageResolution en la configuración del formato en su lugar.
boolIsSecuredtrueReservado; no se aplica. El control de acceso es DoconutOptions.UnsafeMode.
boolIsWebFarm / string WebFarmPathfalse / ""Conservado para código migrado del paquete clásico. No cambian el modo de granja — AddDoconutDistributed lo hace.
boolEditModefalseReservado para el editor distribuido por separado; deje false.

Marca de agua personalizada

DocOptions.Watermark acepta seis campos separados por tildes. Un ^ opcional al inicio solicita la disposición en todas las esquinas:

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
    });
CampoEjemploSignificado
^ inicial^Opcional disposición en todas las esquinas. Sin él, se usa la colocación normal.
TextConfidentialTexto dibujado en cada página. No debe estar vacío.
ColorRedUn color con nombre.
FontSize24Tamaño de fuente; una entrada numérica no válida vuelve al valor predeterminado.
FontNameVerdanaFamilia de fuentes. Debe estar instalada en el servidor — Windows Server tiene menos fuentes que un escritorio.
Opacity800 a 255. Debe poder parsearse.
Angle-45Rotación en grados; una entrada numérica no válida vuelve al valor predeterminado.

El analizador espera exactamente seis campos después del ^ opcional. Una definición no válida se reemplaza por un texto visible Invalid Watermark en lugar de desaparecer silenciosamente.

Decisión de licencia

Estado de licenciaValor personalizado suministradoResultado renderizado
Licencia de visor paga válidaNoPágina limpia
Licencia de visor paga válidaSíMarca de agua personalizada
Licencia Temporal/Demo activaNoPágina limpia
Licencia Temporal/Demo activaSíMarca de agua personalizada
Licencia faltante, rechazada, expirada, de versión incorrecta o de dominio inválidoCualquieraMarca de agua de evaluación; el valor personalizado no la reemplaza

La misma decisión se aplica a las páginas servidas y a las exportaciones de anotaciones. Una marca de agua personalizada es una característica de una aplicación con licencia, no una forma de sustituir la marca de agua de evaluación.

API de anotaciones

Carga y exportación de anotaciones del lado del servidor. La guía práctica está en Anotaciones.

MiembroPropósito
AnnotationManager GetAnnotationManager(string token)Administrador vinculado a las dimensiones de página de la sesión abierta
AnnotationManager GetAnnotationManager(string token, int pageWidth, int pageHeight)Administrador con dimensiones de página explícitas
AnnotationManager GetAnnotationManager(int pageWidth, int pageHeight)Administrador independiente de la sesión
void LoadAnnotationData(string token, AnnotationManager manager)Cargar anotaciones construidas en C# en la sesión
void LoadAnnotationData(string token, string annotationData)Cargar el sobre codificado devuelto por AnnotationManager.GetAnnotationData()
void LoadAnnotationXML(string token, XmlDocument annotationXml)Cargar anotaciones desde XML
XmlDocument GetAnnotationXML(string token)Exportar las anotaciones de la sesión como XML
Task<byte[]> ExportAnnotationsToPdfAsync(string token, int zoom = 100, CancellationToken ct = default)PDF con anotaciones incrustadas
Task<int> ExportAnnotationsToPngAsync(…)Archivos PNG con anotaciones incrustadas
Task<byte[]> ExportAnnotationsToPngZipAsync(string token, int zoom = 100, CancellationToken ct = default)ZIP de PNGs por página con anotaciones incrustadas

Metadatos DICOM

text
Task<DicomMetadata?> GetDicomMetadataAsync(string token, CancellationToken ct = default)

En este paquete siempre devuelve null, y la solicitud de metadatos del widget responde 501 Not Implemented: la lectura de etiquetas DICOM no está disponible en .NET Framework. El renderizado DICOM — páginas, fotogramas y animación — funciona. Ver Complemento DICOM.

Ayudantes de recursos — ReferenceCss / ReferenceScripts

Emite las etiquetas <link> y <script> para los recursos que el módulo de recursos sirve bajo DoconutOptions.ResourcesPath, en orden de dependencia. Los archivos de funciones limitadas por licencia (Search, Annotation) se emiten solo cuando la licencia los concede.

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 banderas: IncludeBootstrapCss, IncludeViewerCss, IncludeSearchCss (limitado por búsqueda), IncludeAnnotationCss (limitado por anotación).

ScriptConfig banderas: IncludeJQuery (required by all others), IncludeBootstrap, IncludeViewerScripts (the core viewer scripts), IncludeSearchScripts and IncludeSearchBar (search-gated), IncludeAnnotationScripts and IncludeAnnotationBar (annotation-gated).

Ambos devuelven HTML: escríbelos con @Html.Raw(...) en MVC 5 (genéralos en el controlador — las vistas no tienen @inject) o <%= %> en Web Forms. Ver Inicio rápido muestra ambos.

Renderizador de visor

text
string RenderViewer(string elementId, string token, ViewerConfig? config = null)

Devuelve un bloque <script> que inicializa el widget en el elemento con id elementId y muestra el documento: docViewer({...}) construido a partir del ViewerConfig (por defecto: BasePath: '/', ResPath: 'doconut-res/images'), luego .View(token). Escríbelo después de los scripts del visor. El script generado no mantiene referencia al objeto del visor, por lo que una página con su propia barra de herramientas debe inicializar el widget manualmente. Ver ViewerConfig.

Granja web

string? AccessToken contiene el ticket firmado emitido por la apertura más reciente cuando el modo distribuido está activo y UnsafeMode es false; es null en un solo servidor. Envíalo al widget con el token: objViewer.View(token, access).

¿Fue útil esta página?