Visor

La clase principal del visor de documentos

Viewer (namespace Doconut) es el punto de entrada público para abrir documentos desde páginas Razor, controladores MVC, componentes Blazor o APIs mínimas. Es sellado, registrado como un servicio transitorio mediante AddDoconut(), y resuelto mediante inyección de constructor — nunca lo construyas directamente.

Viewer no mantiene estado por solicitud y deliberadamente no implementa IDisposable: las sesiones de documentos viven de forma independiente en la caché de sesiones, por lo que disponer del servicio nunca podría cerrar un documento abierto (ver Conceptos básicos → Cómo funciona el visor).

OpenDocumentAsync

Abre un documento y devuelve el token de sesión que el widget cliente utiliza para todas las solicitudes posteriores.

SobrecargaUso cuando
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 (carga, base de datos, blob). fileInfo debe contener la extensión correcta — es la que determina la detección de 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
await using var ms = new MemoryStream();
await file.CopyToAsync(ms);
ms.Position = 0;
token = await viewer.OpenDocumentAsync(ms, new FileInfo(file.FileName));

Excepciones a manejar:

  • LicenseException — una licencia encontrada es rechazada (el mensaje lleva la razón del rechazo), o el formato necesita una capacidad de complemento que ya no está concedida. La expiración del calendario sin mensaje de rechazo degrada a renderizado con marca de agua en lugar de lanzar una excepción.
  • FormatNotSupportedExceptionDocument format '<extension>' is not supported.
  • InvalidDataException — el contenido del archivo está corrupto o no coincide con su extensión.

CloseDocument

text
void CloseDocument(string token)

Elimina la sesión de la caché (disponiendo del motor de documentos inmediatamente), borra el marcador de seguridad y revoca la concesión de acceso. Opcional — la expiración deslizante realiza la misma limpieza — pero se recomienda para documentos grandes.

GetPageCount

text
int GetPageCount(string token)

Número total de páginas de la sesión abierta. Lanza una excepción si el token es desconocido o ha expirado.

DocOptions

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

TipoPropiedadValor predeterminadoDescripción
stringPassword""Contraseña para documentos protegidos (copiada automáticamente en la configuración del formato).
intImageResolution0Obsoleto. Conservado solo por compatibilidad — establezca ImageResolution en la configuración del formato en su lugar.
stringWatermark""Texto de marca de agua personalizado dibujado en las páginas renderizadas. Cadena de formato: "^Text~Color~FontSize~FontName~Opacity~Angle", p. ej. "^Sample Copy~Red~24~Verdana~80~-45".
intTimeOut60Expiración deslizante de la sesión en minutos.
boolIsSecuredtrueNo se aplica actualmente — reservado. La vinculación del token se controla globalmente mediante DoconutOptions.UnsafeMode (ver Conceptos básicos → Sesiones y Seguridad).

La clase también expone propiedades especializadas que están intencionalmente fuera del flujo normal de visualización de host único:

TipoPropiedadValor predeterminadoDescripción
boolIsWebFarmfalseMarca la operación de apertura como un escenario de granja web. Úsese solo con la arquitectura correspondiente de almacenamiento/ sesión compartida.
stringWebFarmPath""Ruta compartida utilizada por el flujo de trabajo especializado de granja web. Vacía en el visor de host único normal.
boolEditModefalseReservado para el flujo de trabajo del Editor distribuido por separado; deje false para el visor estándar.

Marca de agua personalizada

DocOptions.Watermark utiliza seis campos separados por tilde. Un ^ opcional al inicio solicita el diseño 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
Leading ^^Opcional diseño en todas las esquinas. Sin él, se usa la colocación normal de la marca de agua.
TextConfidentialTexto renderizado en cada página. No debe estar vacío.
ColorRedColor nombrado entendido por la capa de dibujo.
FontSize24Tamaño de fuente; una entrada numérica inválida recurre al valor predeterminado del renderizador.
FontNameVerdanaFamilia de fuentes solicitada. Asegúrese de que esté instalada en el entorno de despliegue.
Opacity80Valor de byte de 0 a 255. Debe analizarse correctamente.
Angle-45Ángulo de rotación en grados; una entrada numérica inválida recurre al valor predeterminado.

El analizador espera exactamente seis campos después del ^ opcional. Una definición inválida se reemplaza por el fallback visible Invalid Watermark del SDK 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álidaMarca de agua personalizada
Visor base Temporal/Demo activoNoPágina base del visor limpia
Visor base Temporal/Demo activoMarca de agua personalizada cuando se aplica la ruta limpia del visor base
Licencia faltante, rechazada, expirada, de versión incorrecta o de dominio inválidoEitherMarca de agua de imposición/evaluación; el valor personalizado no la reemplaza
Renderizado de complemento bajo reglas de evaluaciónEitherMarca de agua de evaluación

La misma decisión se aplica a las imágenes de página servidas y a las exportaciones de anotaciones. La salida GIF animada se marca cuadro por cuadro. Por lo tanto, una marca de agua personalizada es una característica de la aplicación bajo licencia, no una forma de reemplazar o suprimir la marca de agua de evaluación.

API de anotaciones

Carga y exportación de anotaciones del lado del servidor. La guía completa se encuentra en Guías → Anotaciones; la superficie es:

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 anotaciones desde la página codificada/envoltorio Base64 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 PNG por página con anotaciones incrustadas

Metadatos DICOM

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

Devuelve los metadatos de etiquetas DICOM para sesiones abiertas mediante el complemento DICOM; null para documentos que no son DICOM.

Ayudantes de recursos — ReferenceCss / ReferenceScripts

Emite las etiquetas <link>/<script> para los recursos incrustados servidos por UseDoconutResources(), en el orden correcto de dependencias. Los paquetes para funciones restringidas por licencia, como búsqueda y anotación, se emiten solo cuando la licencia las habilita, manteniendo la interfaz del cliente coherente con el comportamiento del servidor.

text
string ReferenceCss(CssConfig? config = null)      // null → Bootstrap + viewer + search + annotation
string ReferenceScripts(ScriptConfig? config = null)

Banderas de CssConfig: IncludeBootstrapCss, IncludeViewerCss, IncludeSearchCss (restringido a búsqueda), IncludeAnnotationCss (restringido a anotación).

Banderas de ScriptConfig: IncludeJQuery (requerido por todos los demás), IncludeBootstrap, IncludeViewerScripts (núcleo: docViewer.js + divisor + enlaces), IncludeSearchScripts y IncludeSearchBar (restringido a búsqueda), IncludeAnnotationScripts y IncludeAnnotationBar (restringido a anotación).

html
@inject Doconut.Viewer Viewer

@Html.Raw(Viewer.ReferenceCss(new CssConfig { IncludeBootstrapCss = true, IncludeViewerCss = true }))
@Html.Raw(Viewer.ReferenceScripts(new ScriptConfig { IncludeJQuery = true, IncludeViewerScripts = true }))

¿Fue útil esta página?