Visualizzatore
La classe principale del visualizzatore di documenti
Viewer (namespace Doconut) è il punto di ingresso pubblico per aprire documenti da controller MVC, pagine Web Forms e gestori. È un servizio transient composto da DoconutHost.Initialize; risolvilo dove lo utilizzi:
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();new Viewer() funziona anche una volta che DoconutHost.Initialize è stato eseguito — risolve gli stessi servizi — il che mantiene il codice migrato dal pacchetto classico compilabile. Prima di Initialize, genera InvalidOperationException.
Viewer non mantiene alcuno stato del documento per richiesta e intenzionalmente non implementa IDisposable: le sessioni dei documenti vivono indipendentemente da esso, quindi la disposizione di un Viewer non potrebbe mai chiudere un documento aperto (vedi Come funziona il visualizzatore).
OpenDocumentAsync
Apre un documento e restituisce il token di sessione che il widget utilizza per ogni successiva richiesta. Quando UnsafeMode è false (impostazione predefinita), il token viene assegnato alla sessione ASP.NET della richiesta corrente — chiamalo da una richiesta che dispone di stato di sessione (vedi Sessioni e sicurezza).
| Sovraccarico | Quando usarlo |
|---|---|
Task<string> OpenDocumentAsync(string filePath, DocOptions? options = null, CancellationToken ct = default) | Apertura da disco con rilevamento automatico del formato e configurazione predefinita del formato |
Task<string> OpenDocumentAsync(string filePath, BaseConfig? config, DocOptions? options = null, CancellationToken ct = default) | Hai bisogno di opzioni di rendering per formato (PdfConfig, WordConfig, …) |
Task<string> OpenDocumentAsync(Stream stream, FileInfo fileInfo, BaseConfig? config = null, DocOptions? options = null, CancellationToken ct = default) | Il documento non è un file su disco (un upload, un database, un blob). fileInfo deve contenere l'estensione corretta — seleziona il formato |
// Apertura semplice
string token = await viewer.OpenDocumentAsync(path);
// Con configurazione e opzioni per formato
token = await viewer.OpenDocumentAsync(
path,
new PdfConfig { AllowSearch = true, AllowCopy = true },
new DocOptions { TimeOut = 30 });
// Da un caricamento (HttpPostedFileBase in MVC; HttpPostedFile in Web Forms)
using (var ms = new MemoryStream())
{
await file.InputStream.CopyToAsync(ms);
ms.Position = 0;
token = await viewer.OpenDocumentAsync(ms, new FileInfo(Path.GetFileName(file.FileName)));
}Eccezioni da gestire:
LicenseException— è stata trovata una licenza ma è stata rifiutata (il messaggio contiene il motivo), o il formato richiede una funzionalità plugin che la licenza non concede.FormatNotSupportedException— nessun visualizzatore gestisce l'estensione del file.InvalidDataException— il contenuto è corrotto o non corrisponde alla sua estensione.
OpenDocument (sincrono)
Per il code-behind di Web Forms e altro codice che non utilizza pagine asincrone:
string OpenDocument(string filePath, BaseConfig? config = null, DocOptions? options = null)
string OpenDocument(Stream stream, string fileName, BaseConfig? config = null, DocOptions? options = null)
string OpenDocument(byte[] bytes, string fileName, BaseConfig? config = null, DocOptions? options = null)Ciascuno restituisce il token e lo memorizza anche in viewer.Token. fileName deve contenere l'estensione corretta. Questi wrapper sono sicuri da chiamare da una pagina Web Forms: il percorso di apertura non riprende mai sul contesto di richiesta ASP.NET, quindi attendere su di esso non può causare deadlock. Lo stesso non è vero per tutte le API asincrone Doconut — vedi la sezione Web Forms di Plugin di conversione.
CloseDocument
void CloseDocument(string token)Rimuove la sessione (rilasciando immediatamente il motore del documento), rimuove il grant del token dalla sessione ASP.NET della richiesta corrente e revoca il token. Opzionale — la scadenza scorrevole esegue la stessa pulizia — ma è consigliata per documenti di grandi dimensioni.
Query di sessione
| Membro | Restituisce |
|---|---|
int GetPageCount(string token) | Numero totale di pagine del documento aperto |
(int Width, int Height) GetPageDimensions(string token, int page = 1) | Dimensione predefinita della pagina renderizzata al 100% di zoom — lo spazio di coordinate per le annotazioni integrate nel codice |
IReadOnlyList<string> GetWorksheetNames(string token) | Fogli di lavoro renderizzati di un foglio di calcolo, nell'ordine della cartella di lavoro; vuoto per altri documenti |
Ogni metodo genera un'eccezione se il token è sconosciuto o scaduto.
DocOptions
Opzioni per apertura, indipendenti dal formato (namespace Doconut):
| Tipo | Proprietà | Predefinito | Descrizione |
|---|---|---|---|
string | Password | "" | Password per documenti protetti (copiata automaticamente nella configurazione del formato). |
string | Watermark | "" | Testo personalizzato della filigrana disegnato sulle pagine renderizzate — vedi sotto. |
int | TimeOut | 60 | Scadenza scorrevole della sessione, in minuti. |
string | BrowserId | "" | Web farm: il browser a cui è legato un ticket firmato. Impostalo con DoconutFarmBinding.EnsureBrowserId (vedi Sessioni e Sicurezza). |
string | UserId | "" | Web farm: l'utente autenticato a cui è legato un ticket, da DoconutFarmBinding.ResolveUserId. |
int | ImageResolution | 0 | Obsoleto. Imposta ImageResolution nella configurazione del formato invece. |
bool | IsSecured | true | Riservato; non applicato. Il controllo degli accessi è DoconutOptions.UnsafeMode. |
bool | IsWebFarm / string WebFarmPath | false / "" | Mantenuto per codice migrato dal pacchetto classico. Non attivano la modalità farm — lo fa AddDoconutDistributed. |
bool | EditMode | false | Riservato per l'editor distribuito separatamente; lascia false. |
Filigrana personalizzata
DocOptions.Watermark accetta sei campi separati da tilde. Un ^ opzionale all'inizio richiede il layout a tutti gli angoli:
^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 | Esempio | Significato |
|---|---|---|
Leading ^ | ^ | Layout opzionale a tutti gli angoli. Senza di esso, viene usata la posizione normale. |
| Text | Confidential | Testo disegnato su ogni pagina. Non deve essere vuoto. |
| Color | Red | Un colore denominato. |
| FontSize | 24 | Dimensione del carattere; input numerico non valido ripiega al valore predefinito. |
| FontName | Verdana | Famiglia di caratteri. Deve essere installata sul server — Windows Server ha meno font rispetto a un desktop. |
| Opacity | 80 | Da 0 a 255. Deve essere analizzabile. |
| Angle | -45 | Rotazione in gradi; input numerico non valido ripiega al valore predefinito. |
L'analizzatore si aspetta esattamente sei campi dopo il ^ opzionale. Una definizione non valida viene sostituita da un testo Invalid Watermark visibile invece di scomparire silenziosamente.
Decisione di licenza
| Stato della licenza | Valore personalizzato fornito | Risultato renderizzato |
|---|---|---|
| Licenza viewer a pagamento valida | No | Pagina pulita |
| Licenza viewer a pagamento valida | Sì | Filigrana personalizzata |
| Licenza Temporanea/Demo attiva | No | Pagina pulita |
| Licenza Temporanea/Demo attiva | Sì | Filigrana personalizzata |
| Licenza mancante, rifiutata, scaduta, versione errata o dominio non valido | Entrambi | Filigrana di valutazione; il valore personalizzato non la sostituisce |
La stessa decisione si applica alle pagine servite e alle esportazioni di annotazioni. Una filigrana personalizzata è una funzionalità di un'applicazione con licenza, non un modo per sostituire la filigrana di valutazione.
API delle Annotazioni
Caricamento e esportazione di annotazioni lato server. La guida è in Annotazioni.
| Membro | Scopo |
|---|---|
AnnotationManager GetAnnotationManager(string token) | Manager legato alle dimensioni della pagina della sessione aperta |
AnnotationManager GetAnnotationManager(string token, int pageWidth, int pageHeight) | Manager con dimensioni della pagina esplicite |
AnnotationManager GetAnnotationManager(int pageWidth, int pageHeight) | Manager indipendente dalla sessione |
void LoadAnnotationData(string token, AnnotationManager manager) | Carica annotazioni integrate in C# nella sessione |
void LoadAnnotationData(string token, string annotationData) | Carica l'involucro codificato restituito da AnnotationManager.GetAnnotationData() |
void LoadAnnotationXML(string token, XmlDocument annotationXml) | Carica annotazioni da XML |
XmlDocument GetAnnotationXML(string token) | Esporta le annotazioni della sessione come XML |
Task<byte[]> ExportAnnotationsToPdfAsync(string token, int zoom = 100, CancellationToken ct = default) | PDF con annotazioni incorporate |
Task<int> ExportAnnotationsToPngAsync(…) | File PNG con annotazioni incorporate |
Task<byte[]> ExportAnnotationsToPngZipAsync(string token, int zoom = 100, CancellationToken ct = default) | ZIP di PNG per pagina con annotazioni incorporate |
DICOM metadata
Task<DicomMetadata?> GetDicomMetadataAsync(string token, CancellationToken ct = default)In questo pacchetto restituisce sempre null, e la richiesta di metadati del widget risponde 501 Not Implemented: la lettura dei tag DICOM non è disponibile su .NET Framework. Il rendering DICOM — pagine, fotogrammi e animazione — funziona. Vedi DICOM Plugin.
Helper di risorse — ReferenceCss / ReferenceScripts
Emetti i tag <link> e <script> per le risorse che il modulo di risorse serve sotto DoconutOptions.ResourcesPath, in ordine di dipendenza. I file per le funzionalità soggette a licenza (Search, Annotation) vengono emessi solo quando la licenza le concede.
string ReferenceCss(CssConfig? config = null) // null → Bootstrap + visualizzatore + ricerca + annotazione
string ReferenceScripts(ScriptConfig? config = null)
bool IsSearchEnabled { get; } // stato della licenza, per proteggere il codice di inizializzazione del ribbon
bool IsAnnotationEnabled { get; }CssConfig flag: IncludeBootstrapCss, IncludeViewerCss, IncludeSearchCss (search-gated), IncludeAnnotationCss (annotation-gated).
ScriptConfig flag: IncludeJQuery (richiesto da tutti gli altri), IncludeBootstrap, IncludeViewerScripts (gli script principali del visualizzatore), IncludeSearchScripts e IncludeSearchBar (search-gated), IncludeAnnotationScripts e IncludeAnnotationBar (annotation-gated).
Entrambi restituiscono HTML: scrivili con @Html.Raw(...) in MVC 5 (generali nel controller — le view non hanno @inject) o <%= %> in Web Forms. Quick Start mostra entrambi.
RenderViewer
string RenderViewer(string elementId, string token, ViewerConfig? config = null)Restituisce un blocco <script> che inizializza il widget sull'elemento con id elementId e mostra il documento: docViewer({...}) costruito dal ViewerConfig (predefinito: BasePath: '/', ResPath: 'doconut-res/images'), poi .View(token). Scrivilo dopo gli script del visualizzatore. Lo script generato non mantiene alcun riferimento all'oggetto del visualizzatore, quindi una pagina con la propria barra degli strumenti dovrebbe inizializzare il widget manualmente. Vedi ViewerConfig.
Web farm
string? AccessToken contiene il ticket firmato emesso dall'ultima apertura quando la modalità distribuita è attiva e UnsafeMode è false; è null su un singolo server. Invialo al widget con il token: objViewer.View(token, access).
Questa pagina è stata utile?