Visionneuse

La classe principale de visualisation de documents

Viewer (namespace Doconut) est le point d'entrée public pour ouvrir des documents depuis les pages Razor, les contrôleurs MVC, les composants Blazor ou les API minimalistes. Il est sealed, enregistré comme service transient par AddDoconut(), et résolu via l'injection de constructeur — ne le construisez jamais directement.

La bibliothèque .NET Standard précédente exposait un constructeur public prenant le cache mémoire, l'accès au contexte HTTP et un ou plusieurs chemins de licence. Ce constructeur a disparu ; le graphe de services fournit ces dépendances.

Viewer ne conserve aucun état par requête et ne pas implémente intentionnellement IDisposable : les sessions de documents vivent indépendamment dans le cache de session, de sorte que la suppression du service ne pourrait jamais fermer un document ouvert (voir Concepts de base → Comment la Visionneuse fonctionne).

OpenDocumentAsync

Ouvre un document et renvoie le jeton de session que le widget client utilise pour toutes les requêtes ultérieures. Chaque ouverture est asynchrone — il n'existe aucun OpenDocument synchrone.

SurchargeUtilisation
Task<string> OpenDocumentAsync(string filePath, DocOptions? options = null, CancellationToken ct = default)Ouverture depuis le disque avec détection automatique du format et la 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 par 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 (téléversement, base de données, blob). fileInfo doit contenir la bonne extension — elle détermine la détection du format
csharp
// Ouverture simple
string token = await viewer.OpenDocumentAsync(path);

// Avec configuration et options par format
token = await viewer.OpenDocumentAsync(
    path,
    new PdfConfig { AllowSearch = true, AllowCopy = true },
    new DocOptions { TimeOut = 30 });

// Depuis un téléchargement
await using var ms = new MemoryStream();
await file.CopyToAsync(ms);
ms.Position = 0;
token = await viewer.OpenDocumentAsync(ms, new FileInfo(file.FileName));

Exceptions à gérer :

  • LicenseException — une licence trouvée est rejetée (le message indique la raison du rejet), ou le format nécessite une capacité de plugin qui n'est plus accordée. L'expiration du calendrier sans message de rejet se traduit par un rendu filigrané au lieu de lever une exception.
  • FormatNotSupportedException — Document format '<extension>' is not supported.
  • InvalidDataException — le contenu du fichier est corrompu ou ne correspond pas à son extension.

CloseDocument

text
void CloseDocument(string token)

Supprime la session du cache (en disposant immédiatement le moteur de document), supprime le marqueur de sécurité et révoque l'autorisation d'accès. Optionnel — l'expiration glissante effectue le même nettoyage — mais recommandé pour les gros documents.

GetPageCount

text
int GetPageCount(string token)

Nombre total de pages de la session ouverte. Lève une exception si le jeton est inconnu ou expiré.

GetWorksheetNames

text
IReadOnlyList<string> GetWorksheetNames(string token)

Renvoie les noms des feuilles de calcul d'une feuille de calcul ouverte, dans l'ordre du classeur, ou une liste vide lorsque le document ouvert n'est pas une feuille de calcul.

Seules les feuilles de calcul rendues sont listées : les feuilles cachées et vides sont exclues, et lorsque ExcelConfig.SheetNames restreint le rendu, seules ces feuilles apparaissent. Une feuille de calcul n'occupe pas toujours une seule page — une très grande est rendue sur plusieurs pages. Lève une exception si le jeton est inconnu ou expiré.

Ajouté dans la version 26.9.0.

Drapeaux de capacité

MembreSignification
bool IsSearchEnabledLa licence actuelle accorde Search
bool IsAnnotationEnabledLa licence actuelle accorde Annotation

Utilisez‑les dans une vue Razor pour rendre un ruban sous licence uniquement lorsque le serveur le fournira réellement — voir Démarrage rapide.

DocOptions

Options indépendantes du format, par ouverture (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).
intImageResolution0Obsolète. Conservé uniquement pour la compatibilité — définissez ImageResolution dans la configuration du format à la place.
stringWatermark""Texte du filigrane personnalisé dessiné sur les pages rendues. Chaîne de format : "^Text~Color~FontSize~FontName~Opacity~Angle", par ex. "^Sample Copy~Red~24~Verdana~80~-45".
intTimeOut60Expiration glissante de la session en minutes.
boolIsSecuredtruePas actuellement appliqué — réservé. La liaison de jeton est contrôlée globalement par DoconutOptions.UnsafeMode (voir Concepts de base → Sessions & Sécurité).

La classe expose également des propriétés spécialisées qui sont intentionnellement en dehors du flux de visualisation normal à un seul hôte :

TypePropriétéValeur par défautDescription
boolIsWebFarmfalseMarque l'opération d'ouverture comme un scénario de stockage partagé. Notez la casse — la bibliothèque précédente orthographiait cela IsWebfarm.
stringWebFarmPath""Chemin partagé utilisé par ce flux de travail. Orthographié auparavant WebfarmPath. Vide dans le visualiseur à hôte unique normal, et non requis sur le chemin de publication décrit dans Déploiements distribués.
boolEditModefalseRéservé à un flux de travail d'édition distribué séparément ; laissez false pour le visualiseur standard.

Filigrane personnalisé

DocOptions.Watermark utilise six champs séparés par des tildes. Un ^ optionnel en tête demande la disposition « 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
Préfixe ^^Disposition « tous les coins » optionnelle. Sans elle, le placement normal du filigrane est utilisé.
TexteConfidentialTexte rendu sur chaque page. Il ne doit pas être vide.
CouleurRedCouleur nommée comprise par la couche de dessin.
FontSize24Taille de police ; une entrée numérique invalide revient à la valeur par défaut du rendu.
FontNameVerdanaFamille de police demandée. Assurez‑vous qu’elle est installée dans l’environnement de déploiement.
Opacité80Valeur d’octet de 0 à 255. Elle doit être analysée avec succès.
Angle-45Angle de 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 fallback visible Invalid Watermark du SDK au lieu de disparaître silencieusement.

Décision de licence

État de licenceValeur personnalisée fournieRésultat rendu
Licence de visualiseur payante valideNonPage propre
Licence de visualiseur payante valideOuiFiligrane personnalisé
Visualiseur de base Temporaire/Démo actifNonPage de visualiseur de base propre
Visualiseur de base Temporaire/Démo actifOuiFiligrane personnalisé lorsque le chemin du visualiseur de base propre s'applique
Licence manquante, rejetée, expirée, de mauvaise version ou de domaine invalideL'un ou l'autreFiligrane d'application/évaluation ; la valeur personnalisée ne le remplace pas
Rendu du plugin sous les règles d'évaluationL'un ou l'autreFiligrane d'évaluation

La même décision s'applique aux images de pages servies et aux exportations d'annotations. La sortie GIF animée est marquée image par image. Un filigrane personnalisé est donc une fonctionnalité d'application sous licence, et non un moyen de remplacer ou de supprimer le filigrane d'évaluation.

API d'annotations

Chargement et export d'annotations côté serveur. Le guide complet se trouve dans Guides → Annotations ; l’interface est :

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)Charger les annotations créées en C# dans la session
void LoadAnnotationData(string token, string annotationData)Charger les annotations depuis la page encodée/Base64 renvoyée par AnnotationManager.GetAnnotationData()
void LoadAnnotationXML(string token, XmlDocument annotationXml)Charger les annotations depuis XML
XmlDocument GetAnnotationXML(string token)Exporter les annotations de la session au format XML
Task<byte[]> ExportAnnotationsToPdfAsync(string token, int zoom = 100, CancellationToken ct = default)PDF avec annotations incorporées
Task<int> ExportAnnotationsToPngAsync(…)Fichiers PNG avec annotations incorporées
Task<byte[]> ExportAnnotationsToPngZipAsync(string token, int zoom = 100, CancellationToken ct = default)ZIP de PNG par page avec annotations incorporées

Chacun de ceux‑ci prend le jeton de session. La forme GetAnnotationManager(pageWidth, pageHeight) sans session de la bibliothèque précédente subsiste pour créer des annotations en dehors d’une session, mais leur chargement nécessite toujours un jeton.

Métadonnées DICOM

text
Task<DicomMetadata?> GetDicomMetadataAsync(string token, CancellationToken ct = default)

La méthode est présente pour l’alignement de l’API, mais ce paquet ne peut pas fournir les balises techniques DICOM : le lecteur de métadonnées n’est disponible qu’avec une version .NET 8. Il renvoie null pour les sessions DICOM et non‑DICOM ; sur une session DICOM il écrit également un avertissement unique expliquant la limitation de la plateforme. Le rendu des pages, des images‑cadres et des animations reste pris en charge.

Assistants de ressources — ReferenceCss / ReferenceScripts

Émettez les balises <link>/<script> pour les ressources intégrées servies par UseDoconutResources(), dans le bon ordre de dépendance. Les paquets pour les fonctionnalités soumises à licence, telles que la recherche et l’annotation, sont émis uniquement lorsque la licence les active, maintenant ainsi l’interface client cohérente avec le comportement du serveur.

text
string ReferenceCss(CssConfig? config = null)      // null → Bootstrap + visualiseur + recherche + annotation
string ReferenceScripts(ScriptConfig? config = null)

CssConfig drapeaux : IncludeBootstrapCss, IncludeViewerCss, IncludeSearchCss (déclenché par la recherche), IncludeAnnotationCss (déclenché par l’annotation).

ScriptConfig drapeaux : IncludeJQuery (requis par tous les autres), IncludeBootstrap, IncludeViewerScripts (noyau : docViewer.js + séparateur + liens), IncludeSearchScripts et IncludeSearchBar (déclenché par la recherche), IncludeAnnotationScripts et IncludeAnnotationBar (déclenché par l’annotation).

html
@inject Doconut.Viewer Viewer

@Html.Raw(Viewer.ReferenceCss(new CssConfig { IncludeBootstrapCss = true, IncludeViewerCss = true }))
@Html.Raw(Viewer.ReferenceScripts(new ScriptConfig { IncludeJQuery = true, IncludeViewerScripts = true }))

Ces assistants sont la méthode prise en charge pour fournir les ressources du navigateur. Les applications qui ont copié docViewer.js, documentLinks.js et docViewer.UI.js dans wwwroot devraient supprimer ces copies une fois que la page est rendue à partir des balises émises.

Cette page était-elle utile ?