Viewer
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. Está sellado, registrado como un servicio transitorio por AddDoconut(), y se resuelve mediante inyección de constructor — nunca lo construyas directamente.
Viewer no mantiene estado por solicitud y deliberadamente no implementa IDisposable: las sesiones de documento viven independientemente en la caché de sesión, por lo que disponer del servicio nunca podría cerrar un documento abierto (ver Conceptos básicos → Cómo funciona el Viewer).
OpenDocumentAsync
Abre un documento y devuelve el token de sesión que el widget cliente usa para todas las solicitudes posteriores.
| Sobrecarga | Usar cuando |
|---|---|
Task<string> OpenDocumentAsync(string filePath, DocOptions? options = null, CancellationToken ct = default) | Al 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 específicas 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 lo que impulsa la detección de formato |
// Apertura simple
string token = await viewer.OpenDocumentAsync(path);
// Con configuración y opciones por formato
token = await viewer.OpenDocumentAsync(
path,
new PdfConfig { AllowSearch = true, AllowCopy = true },
new DocOptions { TimeOut = 30 });
// Desde una carga
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.FormatNotSupportedException—Document format '<extension>' is not supported.InvalidDataException— el contenido del archivo está corrupto o no coincide con su extensión.
CloseDocument
void CloseDocument(string token)Elimina la sesión de la caché (disponiendo del motor de documento 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
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):
| Tipo | Propiedad | Predeterminado | Descripción |
|---|---|---|---|
string | Password | "" | Contraseña para documentos protegidos (copiada automáticamente en la configuración del formato). |
int | ImageResolution | 0 | Obsoleto. Conservado solo por compatibilidad — establezca ImageResolution en la configuración del formato en su lugar. |
string | Watermark | "" | Texto personalizado de marca de agua dibujado en las páginas renderizadas. Cadena de formato: "^Text~Color~FontSize~FontName~Opacity~Angle", p. ej. "^Sample Copy~Red~24~Verdana~80~-45". |
int | TimeOut | 60 | Expiración deslizante de la sesión en minutos. |
bool | IsSecured | true | No 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 de visualización normal de un solo host:
| Tipo | Propiedad | Predeterminado | Descripción |
|---|---|---|---|
bool | IsWebFarm | false | Marca la operación de apertura como un escenario de granja web. Úsese solo con la arquitectura de almacenamiento/sesión compartida correspondiente. |
string | WebFarmPath | "" | Ruta compartida utilizada por el flujo de trabajo especializado de granja web. Vacía en el visor normal de un solo host. |
bool | EditMode | false | Reservado para el flujo de trabajo del Editor distribuido por separado; deje false para el visor estándar. |
Marca de agua personalizada
DocOptions.Watermark usa seis campos separados por tildes. Un ^ opcional al inicio solicita el diseño de todas las esquinas:
^Text~Color~FontSize~FontName~Opacity~Anglestring token = await viewer.OpenDocumentAsync(
path,
new PdfConfig(),
new DocOptions
{
Watermark = "^Confidential~Red~24~Verdana~80~-45",
TimeOut = 30
});| Campo | Ejemplo | Significado |
|---|---|---|
Inicial ^ | ^ | Diseño opcional de todas las esquinas. Sin él, se usa la colocación normal de la marca de agua. |
| Texto | Confidential | Texto renderizado en cada página. No debe estar vacío. |
| Color | Red | Color nombrado entendido por la capa de dibujo. |
| Tamaño de fuente | 24 | Tamaño de fuente; la entrada numérica no válida recurre al valor predeterminado del renderizador. |
| Nombre de fuente | Verdana | Familia de fuente solicitada. Asegúrese de que esté instalada en el entorno de despliegue. |
| Opacidad | 80 | Valor de byte de 0 a 255. Debe analizarse correctamente. |
| Ángulo | -45 | Ángulo de rotación en grados; la entrada numérica no válida recurre al valor predeterminado. |
El analizador espera exactamente seis campos después del ^ opcional. Una definición no válida se reemplaza por el fallback visible Invalid Watermark del SDK en lugar de desaparecer silenciosamente.
Decisión de licencia
| Estado de licencia | Valor personalizado suministrado | Resultado renderizado |
|---|---|---|
| Licencia de visor pagado válida | No | Página limpia |
| Licencia de visor pagado válida | Sí | Marca de agua personalizada |
| Visor base Temporal/Demo activo | No | Página de visor base limpia |
| Visor base Temporal/Demo activo | Sí | Marca de agua personalizada cuando se aplica la ruta del visor base limpio |
| Licencia faltante, rechazada, expirada, de versión incorrecta o de dominio inválido | Cualquiera | Marca de agua de aplicación/evaluación; el valor personalizado no la sobrescribe |
| Renderizado de plugin bajo reglas de evaluación | Cualquiera | Marca 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 fotograma a fotograma. Por lo tanto, una marca de agua personalizada es una característica de aplicación con 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. El tutorial completo está en Guías → Anotaciones; la superficie es:
| Miembro | Propó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 PNGs por página con anotaciones incrustadas |
Metadatos DICOM
Task<DicomMetadata?> GetDicomMetadataAsync(string token, CancellationToken ct = default)Devuelve metadatos de etiquetas DICOM para sesiones abiertas a través del plugin DICOM; null para documentos no DICOM.
Ayudantes de recursos — ReferenceCss / ReferenceScripts
Emita las etiquetas <link>/<script> para los recursos incrustados servidos por UseDoconutResources(), en el orden de dependencia correcto. 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.
string ReferenceCss(CssConfig? config = null) // null → Bootstrap + visor + búsqueda + anotación
string ReferenceScripts(ScriptConfig? config = null)CssConfig flags: IncludeBootstrapCss, IncludeViewerCss, IncludeSearchCss (restringido por búsqueda), IncludeAnnotationCss (restringido por anotación).
ScriptConfig flags: IncludeJQuery (requerido por todos los demás), IncludeBootstrap, IncludeViewerScripts (núcleo: docViewer.js + divisor + enlaces), IncludeSearchScripts y IncludeSearchBar (restringido por búsqueda), IncludeAnnotationScripts y IncludeAnnotationBar (restringido por anotación).
@inject Doconut.Viewer Viewer
@Html.Raw(Viewer.ReferenceCss(new CssConfig { IncludeBootstrapCss = true, IncludeViewerCss = true }))
@Html.Raw(Viewer.ReferenceScripts(new ScriptConfig { IncludeJQuery = true, IncludeViewerScripts = true }))GetWorksheetNames
IReadOnlyList<string> GetWorksheetNames(string token)Devuelve los nombres de las hojas de cálculo de una hoja de cálculo abierta, en el orden del libro, o una lista vacía cuando el documento abierto no es una hoja de cálculo.
Añadido en 26.9.0.
¿Fue útil esta página?