Visualizador

A classe principal de visualização de documentos

Viewer (namespace Doconut) é o ponto de entrada público para abrir documentos a partir de páginas Razor, controladores MVC, componentes Blazor ou APIs mínimas. Ele é selado, registrado como um serviço transiente por AddDoconut(), e resolvido via injeção de construtor — nunca o construa diretamente.

Viewer não mantém estado por requisição e intencionalmente não implementa IDisposable: as sessões de documento vivem independentemente no cache de sessões, de modo que descartar o serviço nunca poderia encerrar um documento aberto (veja Conceitos Principais → Como o Visualizador Funciona).

OpenDocumentAsync

Abre um documento e devolve o token de sessão que o widget cliente usa para todas as solicitações subsequentes.

SobrecargaUse quando
Task<string> OpenDocumentAsync(string filePath, DocOptions? options = null, CancellationToken ct = default)Abrindo a partir do disco com detecção automática de formato e a configuração padrão do formato
Task<string> OpenDocumentAsync(string filePath, BaseConfig? config, DocOptions? options = null, CancellationToken ct = default)Você precisa de opções de renderização por formato (PdfConfig, WordConfig, …)
Task<string> OpenDocumentAsync(Stream stream, FileInfo fileInfo, BaseConfig? config = null, DocOptions? options = null, CancellationToken ct = default)O documento não é um arquivo no disco (upload, banco de dados, blob). fileInfo deve conter a extensão correta — ela orienta a detecção 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));

Exceções a tratar:

  • LicenseException — uma licença encontrada é rejeitada (a mensagem traz o motivo da rejeição), ou o formato requer uma capacidade de plugin que não está mais concedida. Expiração de calendário sem mensagem de rejeição reverte para renderização com marca d'água em vez de lançar exceção.
  • FormatNotSupportedExceptionDocument format '<extension>' is not supported.
  • InvalidDataException — o conteúdo do arquivo está corrompido ou não corresponde à sua extensão.

CloseDocument

text
void CloseDocument(string token)

Remove a sessão do cache (descartando o motor de documento imediatamente), exclui o marcador de segurança e revoga a concessão de acesso. Opcional — expiração deslizante realiza a mesma limpeza — mas é recomendada para documentos grandes.

GetPageCount

text
int GetPageCount(string token)

Número total de páginas da sessão aberta. Lança exceção se o token for desconhecido ou expirado.

DocOptions

Opções independentes de formato por abertura (namespace Doconut):

TipoPropriedadePadrãoDescrição
stringPassword""Senha para documentos protegidos (copiada automaticamente para a configuração do formato).
intImageResolution0Obsoleto. Mantido apenas por compatibilidade — defina ImageResolution na configuração do formato em vez disso.
stringWatermark""Texto de marca d'água personalizado desenhado nas páginas renderizadas. Formato da string: "^Texto~Cor~TamanhoFonte~NomeFonte~Opacidade~Ângulo", por exemplo "^Cópia de Exemplo~Red~24~Verdana~80~-45".
intTimeOut60Expiração deslizante da sessão em minutos.
boolIsSecuredtrueNão aplicada atualmente — reservada. O vínculo do token é controlado globalmente por DoconutOptions.UnsafeMode (veja Conceitos Principais → Sessões & Segurança).

A classe também expõe propriedades especializadas que estão intencionalmente fora do fluxo normal de visualização de host único:

TipoPropriedadePadrãoDescrição
boolIsWebFarmfalseMarca a operação de abertura como um cenário de farm de web. Use apenas com a arquitetura de armazenamento/sessão compartilhada correspondente.
stringWebFarmPath""Caminho compartilhado usado pelo fluxo de trabalho especializado de farm de web. Vazio no visualizador de host único normal.
boolEditModefalseReservado para o fluxo de trabalho do Editor distribuído separadamente; mantenha false para o visualizador padrão.

Marca d'água personalizada

DocOptions.Watermark usa seis campos separados por til (~). Um ^ opcional no início solicita o layout em todos os cantos:

text
^Texto~Cor~TamanhoFonte~NomeFonte~Opacidade~Ângulo
csharp
string token = await viewer.OpenDocumentAsync(
    path,
    new PdfConfig(),
    new DocOptions
    {
        Watermark = "^Confidencial~Red~24~Verdana~80~-45",
        TimeOut = 30
    });
CampoExemploSignificado
^ inicial^Layout opcional em todos os cantos. Sem ele, a posição padrão da marca d'água é usada.
TextoConfidencialTexto renderizado em cada página. Não pode estar vazio.
CorRedCor nomeada compreendida pela camada de desenho.
TamanhoFonte24Tamanho da fonte; entrada numérica inválida recai para o padrão do renderizador.
NomeFonteVerdanaFamília de fonte solicitada. Certifique-se de que esteja instalada no ambiente de implantação.
Opacidade80Valor de byte de 0 a 255. Deve ser analisado com sucesso.
Ângulo-45Ângulo de rotação em graus; entrada numérica inválida recai para o padrão.

O analisador espera exatamente seis campos após o ^ opcional. Uma definição inválida é substituída pela marca d'água visível Invalid Watermark do SDK, em vez de desaparecer silenciosamente.

Decisão de Licença

Estado da licençaValor customizado fornecidoResultado renderizado
Licença paga de visualizador válidaNãoPágina limpa
Licença paga de visualizador válidaSimMarca d'água personalizada
Visualizador base Temporário/Demo ativoNãoPágina limpa do visualizador base
Visualizador base Temporário/Demo ativoSimMarca d'água personalizada quando o caminho limpo do visualizador base se aplica
Licença ausente, rejeitada, expirada, versão errada ou domínio inválidoQualquerMarca d'água de aplicação/avaliação; o valor customizado não a substitui
Renderização de plugin sob regras de avaliaçãoQualquerMarca d'água de avaliação

A mesma decisão é aplicada às imagens de página servidas e às exportações de anotações. A saída GIF animada recebe marca d'água quadro a quadro. Portanto, uma marca d'água personalizada é um recurso licenciado, não um meio de substituir ou suprimir a marca d'água de avaliação.

API de Anotações

Carregamento e exportação de anotações no lado do servidor. O tutorial completo está em Guias → Anotações; a superfície é:

MembroPropósito
AnnotationManager GetAnnotationManager(string token)Gerenciador vinculado às dimensões de página da sessão aberta
AnnotationManager GetAnnotationManager(string token, int pageWidth, int pageHeight)Gerenciador com dimensões de página explícitas
AnnotationManager GetAnnotationManager(int pageWidth, int pageHeight)Gerenciador independente de sessão
void LoadAnnotationData(string token, AnnotationManager manager)Carrega anotações construídas em C# na sessão
void LoadAnnotationData(string token, string annotationData)Carrega anotações a partir do envelope codificado em página/Base64 retornado por AnnotationManager.GetAnnotationData()
void LoadAnnotationXML(string token, XmlDocument annotationXml)Carrega anotações a partir de XML
XmlDocument GetAnnotationXML(string token)Exporta as anotações da sessão como XML
Task<byte[]> ExportAnnotationsToPdfAsync(string token, int zoom = 100, CancellationToken ct = default)PDF com anotações incorporadas
Task<int> ExportAnnotationsToPngAsync(…)Arquivos PNG com anotações incorporadas
Task<byte[]> ExportAnnotationsToPngZipAsync(string token, int zoom = 100, CancellationToken ct = default)ZIP de PNGs por página com anotações incorporadas

Metadados DICOM

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

O método está presente para alinhamento de API, mas o visualizador DICOM .NET 6 não pode fornecer tags técnicas. Ele devolve null para sessões DICOM e não‑DICOM; em uma sessão DICOM também grava um aviso único explicando a limitação da plataforma. Renderização de página, quadro e animação continuam suportadas.

Auxiliares de recurso — ReferenceCss / ReferenceScripts

Emite as tags <link>/<script> para os recursos incorporados servidos por UseDoconutResources(), na ordem correta de dependência. Pacotes para recursos condicionados por licença, como busca e anotação, são emitidos somente quando a licença os habilita, mantendo a UI do cliente consistente com o comportamento do servidor.

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

**Flags de CssConfig:** IncludeBootstrapCss, IncludeViewerCss, IncludeSearchCss(condicionado por busca),IncludeAnnotationCss` (condicionado por anotação).

**Flags de ScriptConfig:** IncludeJQuery(necessário para todos os demais),IncludeBootstrap, IncludeViewerScripts(núcleo:docViewer.js+ splitter + links),IncludeSearchScriptseIncludeSearchBar(condicionado por busca),IncludeAnnotationScriptseIncludeAnnotationBar` (condicionado por anotação).

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

Esta página foi útil?