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.
| Sobrecarga | Use 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 |
// 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.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 — expiração deslizante realiza a mesma limpeza — mas é recomendada 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.
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. Formato da string: "^Texto~Cor~TamanhoFonte~NomeFonte~Opacidade~Ângulo", por exemplo "^Cópia de Exemplo~Red~24~Verdana~80~-45". |
int | TimeOut | 60 | Expiração deslizante da sessão em minutos. |
bool | IsSecured | true | Nã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:
| Tipo | Propriedade | Padrão | Descrição |
|---|---|---|---|
bool | IsWebFarm | false | Marca a operação de abertura como um cenário de farm de web. Use apenas com a arquitetura de armazenamento/sessão compartilhada correspondente. |
string | WebFarmPath | "" | Caminho compartilhado usado pelo fluxo de trabalho especializado de farm de web. Vazio no visualizador de host único normal. |
bool | EditMode | false | Reservado 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:
^Texto~Cor~TamanhoFonte~NomeFonte~Opacidade~Ângulostring token = await viewer.OpenDocumentAsync(
path,
new PdfConfig(),
new DocOptions
{
Watermark = "^Confidencial~Red~24~Verdana~80~-45",
TimeOut = 30
});| Campo | Exemplo | Significado |
|---|---|---|
^ inicial | ^ | Layout opcional em todos os cantos. Sem ele, a posição padrão da marca d'água é usada. |
| Texto | Confidencial | Texto renderizado em cada página. Não pode estar vazio. |
| Cor | Red | Cor nomeada compreendida pela camada de desenho. |
| TamanhoFonte | 24 | Tamanho da fonte; entrada numérica inválida recai para o padrão do renderizador. |
| NomeFonte | Verdana | Família de fonte solicitada. Certifique-se de que esteja instalada no ambiente de implantação. |
| Opacidade | 80 | Valor 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ça | Valor customizado fornecido | Resultado renderizado |
|---|---|---|
| Licença paga de visualizador válida | Não | Página limpa |
| Licença paga de visualizador 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, versão errada ou domínio inválido | Qualquer | Marca d'água de aplicação/avaliação; o valor customizado 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 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 é:
| Membro | Propó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
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.
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).
@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?