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. É sealed, registrado como um serviço transient por AddDoconut(), e resolvido via injeção de construtor — nunca o construa diretamente.
A biblioteca .NET Standard anterior expunha um construtor público que recebia o cache de memória, o acessador de contexto HTTP e um ou mais caminhos de licença. Esse construtor foi removido; o grafo de serviços fornece essas dependências.
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 componente cliente usa em todas as solicitações subsequentes. Cada abertura é assíncrona — não existe um OpenDocument síncrono.
| Sobrecarga | Quando usar |
|---|---|
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 |
// 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 contém o motivo da rejeição), ou o formato requer uma capacidade de plugin que não é 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.FormatNotSupportedException—Document format '<extension>' is not supported.InvalidDataException— o conteúdo do arquivo está corrompido ou não corresponde à sua extensão.
CloseDocument
void CloseDocument(string token)Remova a sessão do cache (descartando o motor de documento imediatamente), exclua o marcador de segurança e revogue a concessão de acesso. Opcional — a expiração deslizante realiza a mesma limpeza — mas recomendado para documentos grandes.
GetPageCount
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.
Capability flags
| Membro | Significado |
|---|---|
bool IsSearchEnabled | A licença atual concede Search |
bool IsAnnotationEnabled | A licença atual concede Annotation |
Use esses valores em uma visualização Razor para renderizar uma Ribbon licenciada somente quando o servidor realmente a disponibilizará — veja Início Rápido.
DocOptions
Opções independentes de formato, por abertura (namespace Doconut):
| Tipo | Propriedade | Padrão | Descrição |
|---|---|---|---|
string | Password | "" | Senha para documentos protegidos (copiada automaticamente para a configuração do formato). |
int | ImageResolution | 0 | Obsoleto. Mantido apenas por compatibilidade — defina ImageResolution na configuração do formato em vez disso. |
string | Watermark | "" | Texto de marca d'água personalizado desenhado nas páginas renderizadas. String de formato: "^Texto~Cor~TamanhoFonte~NomeFonte~Opacidade~Ângulo", por exemplo "^Cópia de Amostra~Red~24~Verdana~80~-45". |
int | TimeOut | 60 | Expiração deslizante da sessão em minutos. |
bool | IsSecured | true | Não aplicada atualmente — reservada. A vinculação de token é controlada 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 em host único:
| Tipo | Propriedade | Padrão | Descrição |
|---|---|---|---|
bool | IsWebFarm | false | Marca a operação de abertura como um cenário de armazenamento compartilhado. Observe a capitalização — a biblioteca anterior usava IsWebfarm. |
string | WebFarmPath | "" | Caminho compartilhado usado por esse fluxo de trabalho. Anteriormente escrito WebfarmPath. Vazio no visualizador padrão de host único e não necessário no caminho de publicação descrito em Implantações Distribuídas. |
bool | EditMode | false | Reservado para um fluxo de trabalho de edição 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~Color~FontSize~FontName~Opacity~Anglestring token = await viewer.OpenDocumentAsync(
path,
new PdfConfig(),
new DocOptions
{
Watermark = "^Confidential~Red~24~Verdana~80~-45",
TimeOut = 30
});| Campo | Exemplo | Significado |
|---|---|---|
Leading ^ | ^ | Layout em todos os cantos opcional. Sem ele, é usado o posicionamento normal da marca d'água. |
| Text | Confidential | Texto renderizado em cada página. Não pode estar vazio. |
| Color | Red | Cor nomeada compreendida pela camada de desenho. |
| FontSize | 24 | Tamanho da fonte; entrada numérica inválida recai para o padrão do renderizador. |
| FontName | Verdana | Família de fonte solicitada. Certifique‑se de que está instalada no ambiente de implantação. |
| Opacity | 80 | Valor de byte de 0 a 255. Deve ser analisado com sucesso. |
| Angle | -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 alternativa visível Invalid Watermark do SDK, em vez de desaparecer silenciosamente.
Decisão de licença
| Estado da licença | Valor personalizado fornecido | Resultado renderizado |
|---|---|---|
| Licença de visualizador paga válida | Não | Página limpa |
| Licença de visualizador paga válida | Sim | Marca d'água personalizada |
| Visualizador base Temporário/Demo ativo | Não | Página limpa do visualizador base |
| Visualizador base Temporário/Demo ativo | Sim | Marca d'água personalizada quando o caminho limpo do visualizador base se aplica |
| Licença ausente, rejeitada, expirada, de versão incorreta ou de domínio inválido | Qualquer | Marca d'água de aplicação/avaliação; o valor personalizado não a substitui |
| Renderização de plugin sob regras de avaliação | Qualquer | Marca 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 animado é carimbada quadro a quadro. Portanto, uma marca d'água personalizada é um recurso licenciado da aplicação, 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 é:
| Membro | Propósito |
|---|---|
AnnotationManager GetAnnotationManager(string token) | Gerenciador vinculado às dimensões da 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 |
Cada um desses recebe o token da sessão. A forma sem sessão da biblioteca anterior GetAnnotationManager(pageWidth, pageHeight) ainda existe para criar anotações fora de uma sessão, mas carregá‑las ainda requer um token.
Metadados DICOM
Task<DicomMetadata?> GetDicomMetadataAsync(string token, CancellationToken ct = default)O método está presente para alinhamento da API, mas este pacote não pode fornecer tags técnicas DICOM: o leitor de metadados é distribuído apenas em uma compilação .NET 8. Ele retorna null para sessões DICOM e não‑DICOM; em uma sessão DICOM ele também grava um aviso único explicando a limitação da plataforma. A renderização de página, quadro e animação continua suportada.
Auxiliares de recurso — ReferenceCss / ReferenceScripts
Emita as tags <link>/<script> para os recursos incorporados servidos por UseDoconutResources(), na ordem correta de dependência. Pacotes para recursos controlados por licença, como pesquisa e anotação, são emitidos somente quando a licença os habilita, mantendo a interface do cliente consistente com o comportamento do servidor.
string ReferenceCss(CssConfig? config = null) // null → Bootstrap + viewer + search + annotation
string ReferenceScripts(ScriptConfig? config = null)CssConfig flags: IncludeBootstrapCss, IncludeViewerCss, IncludeSearchCss (controlado por pesquisa), IncludeAnnotationCss (controlado por anotação).
ScriptConfig flags: IncludeJQuery (necessário para todos os demais), IncludeBootstrap, IncludeViewerScripts (núcleo: docViewer.js + splitter + links), IncludeSearchScripts e IncludeSearchBar (controlado por pesquisa), IncludeAnnotationScripts e IncludeAnnotationBar (controlado por anotação).
@inject Doconut.Viewer Viewer
@Html.Raw(Viewer.ReferenceCss(new CssConfig { IncludeBootstrapCss = true, IncludeViewerCss = true }))
@Html.Raw(Viewer.ReferenceScripts(new ScriptConfig { IncludeJQuery = true, IncludeViewerScripts = true }))Esses auxiliares são a forma suportada de fornecer os recursos do navegador. Aplicações que copiaram docViewer.js, documentLinks.js e docViewer.UI.js para wwwroot devem remover essas cópias assim que a página for renderizada a partir das tags emitidas.
Esta página foi útil?