Visionneuse
La classe principale du visionneur de documents
Viewer (namespace Doconut) est le point d’entrée public pour ouvrir des documents depuis les contrôleurs MVC, les pages Web Forms et les gestionnaires. C’est un service transient composé par DoconutHost.Initialize ; résolvez‑le là où vous l’utilisez :
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();new Viewer() fonctionne également une fois que DoconutHost.Initialize a été exécuté — il résout les mêmes services — ce qui permet de conserver le code migré depuis le package classique. Avant Initialize, il lève une InvalidOperationException.
Viewer ne conserve aucun état de document par requête et ne met pas en œuvre IDisposable : les sessions de document vivent indépendamment, de sorte que la libération d’un Viewer ne pourrait jamais fermer un document ouvert (voir Comment le Visionneur Fonctionne).
OpenDocumentAsync
Ouvre un document et renvoie le jeton de session utilisé par le widget pour chaque requête ultérieure. Lorsque UnsafeMode est false (valeur par défaut), le jeton est accordé à la session ASP.NET de la requête en cours — appelez‑le depuis une requête disposant d’un état de session (voir Sessions et Sécurité).
| Overload | Quand l'utiliser |
|---|---|
Task<string> OpenDocumentAsync(string filePath, DocOptions? options = null, CancellationToken ct = default) | Ouverture depuis le disque avec détection automatique du format et configuration par défaut du format |
Task<string> OpenDocumentAsync(string filePath, BaseConfig? config, DocOptions? options = null, CancellationToken ct = default) | Vous avez besoin d’options de rendu spécifiques au format (PdfConfig, WordConfig, …) |
Task<string> OpenDocumentAsync(Stream stream, FileInfo fileInfo, BaseConfig? config = null, DocOptions? options = null, CancellationToken ct = default) | Le document n’est pas un fichier sur le disque (un téléchargement, une base de données, un blob). fileInfo doit contenir la bonne extension — elle détermine le format |
// 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 (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)));
}Exceptions à gérer :
LicenseException— une licence a été trouvée mais rejetée (le message indique la raison), ou le format nécessite une capacité de plugin que la licence ne fournit pas.FormatNotSupportedException— aucun visionneur ne prend en charge l’extension du fichier.InvalidDataException— le contenu est corrompu ou ne correspond pas à son extension.
OpenDocument (synchronous)
Pour le code‑behind Web Forms et tout autre code qui n’utilise pas de pages asynchrones :
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)Chaque méthode renvoie le jeton et le stocke également dans viewer.Token. fileName doit contenir la bonne extension. Ces enveloppes sont sûres à appeler depuis une page Web Forms : le chemin d’ouverture ne reprend jamais le contexte de requête ASP.NET, de sorte qu’attendre son résultat ne peut pas provoquer de blocage. Ce n’est pas le cas de chaque API asynchrone Doconut — voir la section Web Forms du Plugin de Convertisseur.
FermerDocument
void CloseDocument(string token)Supprime la session (libérant immédiatement le moteur de document), supprime l'octroi du jeton de la session ASP.NET de la requête en cours, et révoque le jeton. Optionnel — l’expiration glissante effectue le même nettoyage — mais recommandé pour les gros documents.
Requêtes de session
| Membre | Renvoie |
|---|---|
int GetPageCount(string token) | Nombre total de pages du document ouvert |
(int Width, int Height) GetPageDimensions(string token, int page = 1) | Taille de page rendue par défaut à 100 % de zoom — l’espace de coordonnées pour les annotations intégré au code |
IReadOnlyList<string> GetWorksheetNames(string token) | Feuilles de calcul rendues, dans l’ordre du classeur ; vide pour les autres documents |
Chaque appel lève une exception si le jeton est inconnu ou expiré.
OptionsDoc
Options par ouverture, indépendantes du format (espace de noms Doconut) :
| Type | Propriété | Valeur par défaut | Description |
|---|---|---|---|
string | Password | "" | Mot de passe pour les documents protégés (copié automatiquement dans la configuration du format). |
string | Watermark | "" | Texte de filigrane personnalisé dessiné sur les pages rendues — voir ci‑dessous. |
int | TimeOut | 60 | Expiration glissante de la session, en minutes. |
string | BrowserId | "" | Fermes Web : le navigateur auquel un ticket signé est lié. Définissez‑le avec DoconutFarmBinding.EnsureBrowserId (voir Sessions & Security). |
string | UserId | "" | Fermes Web : l'utilisateur connecté auquel un ticket est lié, depuis DoconutFarmBinding.ResolveUserId. |
int | ImageResolution | 0 | Obsolète. Définissez ImageResolution dans la configuration du format à la place. |
bool | IsSecured | true | Réservé ; non appliqué. Le contrôle d'accès est DoconutOptions.UnsafeMode. |
bool | IsWebFarm / string WebFarmPath | false / "" | Conservé pour le code migré depuis le package classique. Ils ne basculent pas le mode ferme — AddDoconutDistributed le fait. |
bool | EditMode | false | Réservé pour l'éditeur distribué séparément ; laissez false. |
Filigrane personnalisé
DocOptions.Watermark accepte six champs séparés par des tildes. Un ^ optionnel en tête demande la disposition sur tous les coins :
^Text~Color~FontSize~FontName~Opacity~Anglestring token = await viewer.OpenDocumentAsync(
path,
new PdfConfig(),
new DocOptions
{
Watermark = "^Confidential~Red~24~Verdana~80~-45",
TimeOut = 30
});| Champ | Exemple | Signification |
|---|---|---|
^ initial | ^ | Disposition sur tous les coins optionnelle. Sans elle, le placement normal est utilisé. |
| Texte | Confidential | Texte dessiné sur chaque page. Il ne doit pas être vide. |
| Couleur | Red | Une couleur nommée. |
| TaillePolice | 24 | Taille de police ; une entrée numérique invalide revient à la valeur par défaut. |
| NomPolice | Verdana | Famille de police. Elle doit être installée sur le serveur — Windows Server possède moins de polices qu’un poste de travail. |
| Opacité | 80 | 0 à 255. Elle doit être analysable. |
| Angle | -45 | Rotation en degrés ; une entrée numérique invalide revient à la valeur par défaut. |
L’analyseur attend exactement six champs après le ^ optionnel. Une définition invalide est remplacée par le texte visible Invalid Watermark au lieu de disparaître silencieusement.
Décision de licence
| État de licence | Valeur personnalisée fournie | Résultat rendu |
|---|---|---|
| Licence de visualisation payante valide | Non | Page propre |
| Licence de visualisation payante valide | Oui | Filigrane personnalisé |
| Licence temporaire/démo active | Non | Page propre |
| Licence temporaire/démo active | Oui | Filigrane personnalisé |
| Licence manquante, rejetée, expirée, de mauvaise version ou de domaine invalide | Quelconque | Filigrane d'évaluation ; la valeur personnalisée ne le remplace pas |
La même décision s’applique aux pages servies et aux exportations d'annotations. Un filigrane personnalisé est une fonctionnalité d’une application sous licence, pas un moyen de remplacer le filigrane d’évaluation.
API d'annotations
Chargement et export d’annotations côté serveur. Le guide complet se trouve dans Annotations.
| Membre | Objectif |
|---|---|
AnnotationManager GetAnnotationManager(string token) | Gestionnaire lié aux dimensions de page de la session ouverte |
AnnotationManager GetAnnotationManager(string token, int pageWidth, int pageHeight) | Gestionnaire avec des dimensions de page explicites |
AnnotationManager GetAnnotationManager(int pageWidth, int pageHeight) | Gestionnaire indépendant de la session |
void LoadAnnotationData(string token, AnnotationManager manager) | Charge les annotations créées en C# dans la session |
void LoadAnnotationData(string token, string annotationData) | Charge l'enveloppe encodée renvoyée par AnnotationManager.GetAnnotationData() |
void LoadAnnotationXML(string token, XmlDocument annotationXml) | Charge les annotations depuis XML |
XmlDocument GetAnnotationXML(string token) | Exporte les annotations de la session au format XML |
Task<byte[]> ExportAnnotationsToPdfAsync(string token, int zoom = 100, CancellationToken ct = default) | PDF avec annotations intégrées |
Task<int> ExportAnnotationsToPngAsync(…) | Fichiers PNG avec annotations intégrées |
Task<byte[]> ExportAnnotationsToPngZipAsync(string token, int zoom = 100, CancellationToken ct = default) | ZIP de PNGs par page avec annotations intégrées |
Métadonnées DICOM
Task<DicomMetadata?> GetDicomMetadataAsync(string token, CancellationToken ct = default)Dans ce package, il renvoie toujours null, et la requête de métadonnées du widget répond 501 Not Implemented : la lecture des balises DICOM n’est pas disponible sur .NET Framework. Le rendu DICOM — pages, cadres et animation — fonctionne. Voir Plugin DICOM.
Assistants de ressources — ReferenceCss / ReferenceScripts
Émettez les balises <link> et <script> pour les ressources que le module de ressources fournit sous DoconutOptions.ResourcesPath, dans l’ordre de dépendance. Les fichiers des fonctionnalités soumises à licence (Recherche, Annotation) sont émis uniquement lorsque la licence les autorise.
string ReferenceCss(CssConfig? config = null) // null → Bootstrap + viewer + search + annotation
string ReferenceScripts(ScriptConfig? config = null)
bool IsSearchEnabled { get; } // license state, for guarding ribbon init code
bool IsAnnotationEnabled { get; }CssConfig flags: IncludeBootstrapCss, IncludeViewerCss, IncludeSearchCss (search-gated), IncludeAnnotationCss (annotation-gated).
ScriptConfig flags: IncludeJQuery (required by all others), IncludeBootstrap, IncludeViewerScripts (the core viewer scripts), IncludeSearchScripts and IncludeSearchBar (search-gated), IncludeAnnotationScripts and IncludeAnnotationBar (annotation-gated).
Les deux renvoient du HTML : écrivez‑les avec @Html.Raw(...) dans MVC 5 (produisez‑les dans le contrôleur — les vues n’ont pas de @inject) ou <%= %> dans Web Forms. Démarrage rapide montre les deux.
RenderViewer
string RenderViewer(string elementId, string token, ViewerConfig? config = null)Renvoie un bloc <script> qui initialise le widget sur l’élément dont l’identifiant est elementId et affiche le document : docViewer({...}) construit à partir du ViewerConfig (par défaut : BasePath: '/', ResPath: 'doconut-res/images'), puis .View(token). Placez‑le après les scripts du visualiseur. Le script généré ne conserve aucune référence à l’objet du visualiseur, ainsi une page disposant de sa propre barre d’outils doit initialiser le widget manuellement. Voir Configuration du visualiseur.
Ferme Web
string? AccessToken contient le ticket signé émis lors de la dernière ouverture lorsque le mode distribué est actif et que UnsafeMode est false ; il vaut null sur un serveur unique. Transmettez‑le au widget avec le jeton : objViewer.View(token, access).
Cette page était-elle utile ?