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 :

csharp
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é).

OverloadQuand 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
csharp
// 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 :

text
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

text
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

MembreRenvoie
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) :

TypePropriétéValeur par défautDescription
stringPassword""Mot de passe pour les documents protégés (copié automatiquement dans la configuration du format).
stringWatermark""Texte de filigrane personnalisé dessiné sur les pages rendues — voir ci‑dessous.
intTimeOut60Expiration glissante de la session, en minutes.
stringBrowserId""Fermes Web : le navigateur auquel un ticket signé est lié. Définissez‑le avec DoconutFarmBinding.EnsureBrowserId (voir Sessions & Security).
stringUserId""Fermes Web : l'utilisateur connecté auquel un ticket est lié, depuis DoconutFarmBinding.ResolveUserId.
intImageResolution0Obsolète. Définissez ImageResolution dans la configuration du format à la place.
boolIsSecuredtrueRéservé ; non appliqué. Le contrôle d'accès est DoconutOptions.UnsafeMode.
boolIsWebFarm / string WebFarmPathfalse / ""Conservé pour le code migré depuis le package classique. Ils ne basculent pas le mode ferme — AddDoconutDistributed le fait.
boolEditModefalseRé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
^Text~Color~FontSize~FontName~Opacity~Angle
csharp
string token = await viewer.OpenDocumentAsync(
    path,
    new PdfConfig(),
    new DocOptions
    {
        Watermark = "^Confidential~Red~24~Verdana~80~-45",
        TimeOut = 30
    });
ChampExempleSignification
^ initial^Disposition sur tous les coins optionnelle. Sans elle, le placement normal est utilisé.
TexteConfidentialTexte dessiné sur chaque page. Il ne doit pas être vide.
CouleurRedUne couleur nommée.
TaillePolice24Taille de police ; une entrée numérique invalide revient à la valeur par défaut.
NomPoliceVerdanaFamille de police. Elle doit être installée sur le serveur — Windows Server possède moins de polices qu’un poste de travail.
Opacité800 à 255. Elle doit être analysable.
Angle-45Rotation 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 licenceValeur personnalisée fournieRésultat rendu
Licence de visualisation payante valideNonPage propre
Licence de visualisation payante valideOuiFiligrane personnalisé
Licence temporaire/démo activeNonPage propre
Licence temporaire/démo activeOuiFiligrane personnalisé
Licence manquante, rejetée, expirée, de mauvaise version ou de domaine invalideQuelconqueFiligrane 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.

MembreObjectif
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

text
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.

text
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

text
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 ?