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ão, de modo que descartar o serviço nunca poderia encerrar um documento aberto (veja Conceitos Principais → Como o Viewer Funciona).
OpenDocumentAsync
Abre um documento e retorna o token de sessão que o widget cliente usa para todas as solicitações subsequentes. Cada abertura é assíncrona — não existe 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 |
// Abertura simples
string token = await viewer.OpenDocumentAsync(path);
// Com configuração e opções por formato
token = await viewer.OpenDocumentAsync(
path,
new PdfConfig { AllowSearch = true, AllowCopy = true },
new DocOptions { TimeOut = 30 });
// De um 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 necessita de uma capacidade de plugin que não é mais concedida. O vencimento do 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)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 — a expiração deslizante realiza a mesma limpeza — mas é recomendada para documentos grandes.
GetPageCount
int GetPageCount(string token)Total de páginas da sessão aberta. Lança exceção se o token for desconhecido ou expirado.
GetWorksheetNames
IReadOnlyList<string> GetWorksheetNames(string token)Retorna os nomes das planilhas de uma planilha aberta, na ordem da pasta de trabalho, ou uma lista vazia quando o documento aberto não é uma planilha.
Apenas as planilhas renderizadas são listadas: planilhas ocultas e vazias são excluídas, e quando ExcelConfig.SheetNames restringe a renderização, apenas essas planilhas aparecem. Uma planilha nem sempre corresponde a uma página — uma muito grande é renderizada em várias páginas. Lança exceção se o token for desconhecido ou expirado.
Adicionado em 26.9.0.
Bandeiras de capacidade
| Membro | Significado |
|---|---|
bool IsSearchEnabled | A licença atual concede Search |
bool IsAnnotationEnabled | A licença atual concede Annotation |
Use estes em uma visualização Razor para renderizar uma Ribbon licenciada somente quando o servidor realmente a servir — veja Início Rápido.
Opções de Documento
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 de formato). |
int | ImageResolution | 0 | Obsoleto. Mantido apenas para compatibilidade — defina ImageResolution na configuração de formato em vez disso. |
string | Watermark | "" | Texto de marca d'água personalizada desenhado nas páginas renderizadas. String de formato: "^Text~Color~FontSize~FontName~Opacity~Angle", por exemplo "^Sample Copy~Red~24~Verdana~80~-45". |
int | TimeOut | 60 | Expiração deslizante da sessão em minutos. |
bool | IsSecured | true | Não está atualmente em vigor — reservado. A vinculação de token é controlada globalmente por DoconutOptions.UnsafeMode (veja Conceitos Principais → Sessões e Segurança). |
A classe também expõe propriedades especializadas que estão intencionalmente fora do fluxo normal de visualização de 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 escrevia isso como IsWebfarm. |
string | WebFarmPath | "" | Caminho compartilhado usado por esse fluxo de trabalho. Anteriormente escrito como WebfarmPath. Vazio no visualizador de host único normal, 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; deixe 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 de 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 opcional de todos os cantos. Sem ele, a colocação normal da marca d'água é usada. |
| 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 fontes 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 de GIF animado é carimbada quadro a quadro. Uma marca d'água personalizada é, portanto, um recurso de aplicação licenciado, não uma forma 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) | Carregar anotações criadas em C# na sessão |
void LoadAnnotationData(string token, string annotationData) | Carregar anotações da página codificada/envelope Base64 retornado por AnnotationManager.GetAnnotationData() |
void LoadAnnotationXML(string token, XmlDocument annotationXml) | Carregar anotações a partir de XML |
XmlDocument GetAnnotationXML(string token) | Exportar 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 requer o token da sessão. O formato GetAnnotationManager(pageWidth, pageHeight) sem sessão da biblioteca anterior 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 Recursos — 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 apenas quando a licença os habilita, mantendo a interface do cliente consistente com o comportamento do servidor.
string ReferenceCss(CssConfig? config = null) // null → Bootstrap + visualizador + pesquisa + anotação
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 + divisor + 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?