je viens chercher quelques conseils ou simplement des explications:
Je fait actuellement des POC pour une web app dans un secteur industriel... bref.
je passe par une BDD locale et y récupère des infos via un code en C#
je les affiche sur des pages web via radzen components
le tout codé dans VS Code.
Mon problème:
Je récupère un fichier PDF en BLOB dans ma BDD que je SELECT en HEX dans une variable string de mon code C#
je la convertit en byte[] puis en base 64 au choix.
et je souhaiterai afficher le fichier PDF en visualisation type aperçu ou simplement l'ouvrir, peu m'importe la manière:
- soit par un composant Radzen
- soit par une page web de consult
- soit par une fenêtre pop up radzen ou directement dans un form C#
Bref... j'ai un peu parcouru le web pour trouver des solutions et j'ai trouvé pas mal d'exemples...
Mon soucis c'est que je comprends tout simplement rien a ce que je trouve...
du coup, si je peux me permettre, j'aimerai une explication pédagogique des principes d'au moins une des solutions que j'appliquerai ensuite moi même,
mais au moins comprendre le principe d'utilisation de ma variable string byte base 64 ou autre
étant dans VS Code je suis allé voir des librairies mais la aussi c'est un peu la jungle pour les compatibilités de version et avant de partir dans toutes les directions j'aimerai comprendre la mécanique du truc...
c'est ce qui se rapproche le plus de ce que je veux faire mais je comprends pas les explications qu'on lui repond sur les exemples d'export...
Ensuite je me suis dit que je pouvait sortir des outils radzen pour un form de visualisation ca me gene pas trop donc j'ai pensé a un form ou une boite de dialogue qui peut juste afficher le contenu d'un PDF via une librairie
Donc je suis allé chercher des trucs comme
- Spire PDF viewer (je sais pas l'utiliser a priori pour trouver la commande qui va bien)
- Syncfusion (je trouve pas la version compatible avec je sais pas avec quoi ca doit etre compatible...)
si j'ai bien compris j'aurai forcement besoin d'un package avec des librairies pour appeler un "viewer" PDF... mais mon cote noob sur le sujet m'inquiete j'ai pas envie de telecharger 37 librairies inutiles sur ma machine pro...
c'est la que j'me suis dit "va demander conseil a des gens qui savent"
Il existe plusieurs façons d'afficher un fichier PDF à partir d'une variable enregistrée en tant que BLOB dans une base de données. Voici quelques exemples de solutions possibles :
Utiliser un composant Radzen : Radzen propose un composant "pdf-viewer" qui permet d'afficher des fichiers PDF à partir d'une URL ou d'un tableau d'octets (byte[]). Pour utiliser ce composant, vous devez d'abord convertir votre variable BLOB en tableau d'octets, puis passer ce tableau d'octets en tant que propriété "src" pour le composant pdf-viewer.
Afficher le fichier PDF dans une page web : Vous pouvez également afficher le fichier PDF en utilisant un élément HTML "iframe" ou "object" et en définissant la propriété "src" pour ces éléments avec la valeur de votre variable BLOB convertie en base64.
Ouvrir le fichier PDF dans une fenêtre pop-up : Vous pouvez utiliser JavaScript pour ouvrir une fenêtre pop-up contenant le fichier PDF en utilisant la méthode "window.open()" et en passant la valeur de votre variable BLOB convertie en base64 en tant que paramètre "src" pour cette méthode.
Afficher le fichier PDF dans un formulaire C# : vous pouvez utiliser un composant de visualisation de document pour afficher le fichier pdf dans un formulaire C#.
Il est important de noter que pour utiliser ces solutions, vous devez d'abord convertir votre variable BLOB en
>j'me rend bien compte que j'suis pas tres doué désolé
Vous êtes juste complètement perdu car vous posez le problème de manière trop "large".
C'est tout l'intérêt de faire des POC : vous faites des choix, pas forcément optimal, mais vous prouvez avec ces choix que ça fonctionne "raisonnablement" bien.
Si vous ne faites pas des choix "à priori" dans un domaine que vous ne maîtrisez pas, vous allez tourner en rond.
Pour qu'une personne expérimentée puis vous aider efficacement, vous devez être beaucoup plus précis sur vos "contraintes".
Dans le première article que vous donnez, c'est une personne qui a un besoin bien particulier qui ne semble pas directement implémenté par le framework "Radzen" (que je ne connais pas) et on lui indique qu'il faut utiliser la technologie sous-jacente, soit Angular soit ASP.NET.
Je ne suis pas sûr que vous ayez besoin de partir aussi profond dans votre POC car vous n'avez pas encore déterminer comment l'utilisateur final aura accès au PDF. Pour le PO du première article, c'était via un lecteur autonome, d'où la complexité de la chose.
Mais Radzen doit disposer d'un mécanisme d'affichage de document dans le navigateur, donc plus facile à utiliser.
Vous devez maîtriser un minimum le protocole HTTP, AJAX/jQuery (ou autre framework Javascript utilisé pour implémenter les fonctionnalités de "haut-niveau") ainsi que la technologie sous-jacente, si vous ne voulez pas de tout ce qu'offrent déjà votre/vos framework(s).
>j'ai pas envie de telecharger 37 librairies inutiles sur ma machine pro...
Heu, ça sert un peu à ça les POC, faire le tri dans ces librairies et voir leur simplicité d'utilisation, non ?
Pour le 2ème article, c'est une utilisation plutôt "basique" d'ASP.NET.
Il y a peut-être des mécanismes de plus haut-niveau dans Radzen pour faire cela plus simplement mais je ne connais pas ce framework.
D'un point de vu ASP.NET, le code utilise l'objet Session d'ASP.NET qui est partagé par toute les requêtes HTTP d'une même session.
Dans l'exemple, il y a 2 pages différentes (des .aspx vraisemblablement) mais qui utilisent le même objet Session.
La première page, dont le nom n'est pas indiqué contient un bouton "HTML" :
C'est un plus qu'un simple bouton "HTML" (cf. le runat="server"), le framework ASP.NET va associer du JavaScript à ce bouton qui sera exécuté au moment du click sur lui via le "OnClick".
Ce code Javascript va exécuter la méthode "OnView" de la page .apsx "principale"/"nom non fourni", qui se charge d’interroger la base de données et de remplir la valeur associée à la clé "Base64String" dans le tableau associatif Session avec le base64 du contenu de la base de données.
Lignes 19 à 26 de la version C#, la méthode injecte dans la page "principale" un script qui sera en charge d'ouvrir la page "PopUp.aspx" au moment du rechargement de la page "principale", qui fait suite à l'appel de la fonction "OnView".
Dans le code de la page "PopUp.aspx", on récupère le tableau associatif Session, on y récupère la chaîne de caractère associée à la clé "Base64String" (houais, c'est pas top comme "nom de variable") et on envoie cette chaîne comme réponse à la requête HTTP à la page "PopUp.aspx" à la place d'une page "text/html" d'une page web "classique". Le "application/pdf" dans l'en-tête "Content-Type" de la réponse informe le navigateur qu'il doit afficher le contenu envoyé comme si c'était un .pdf.
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
3 - la page bug avec un bandeau "reload" en bas et indique dans la console de débogage:
System.InvalidOperationException: Cannot provide a value for property 'Localizer' on type 'Syncfusion.Blazor.PdfViewer.SfPdfViewer'. There is no registered service of type 'Syncfusion.Blazor.ISyncfusionStringLocalizer'.
J'ai consulté un peu les solutions à ce problème sur le net et chez Syncfusion et a l'unanimité la solution serait de déclarer la ligne suivante dans mon Program.cs :
et la ce coup ci j'ai une exception de type cannot access a disposed object
j'ai bien une autre page codée pour la fenêtre de dialogue a ouvrir mais ca n'arrive pas jusque la, mon probleme d'objet "disposed" intervient avant d'ouvrir la page suivante (enfin je crois)
pendant que vous lisez mon désarroi je vais essayer d'autres solutions proposées par ChatGPT dans la premiere réponse de ce post:
- pas de composant Radzen Pdf-viewer malheureusement
- le iframe fait partie de ma 2eme solution si toutefois j'arrive a ouvrir ma fenetre de dialogue
- Javascript j'ai peur je connais pas du tout.
- formulaire C# j'ai cherché un peu comment en créer un et je ne trouve que des librairies et pas de cas concret
J'ai finalement réussi à intégrer une balise HTML simple et efficace sur l'expand de mon datagrid qui permet donc de voir l'aperçu du PDF de la ligne correspondante et je trouve que ca répond bien au besoin utilisateur:
la ligne se déplie et l'aperçu HTML permet pas mal de choses si les dimensions sont correctes.
Je n'aime pas trop laisser des problèmes sans résolution mais si je peux me passer de SyncFusion je préfère.
En revanche le fameux "disposed object" de la fenêtre de dialogue je galère à le résoudre et j'aurai besoin que ca fonctionne pour mes prochaines fenêtres.
Je vais me renseigner au bon endroit pour ce sujet.
Ayant réussi a afficher mon aperçu PDF ce topic peut être clos.
Merci pour vos réponses qui m'ont aidé à trouver ma solution,
Bon j'ai réglé mon problème de "disposed object"... j'appelai ma page avec un paramètre nommé différemment de celui que j'avais inscrit dans ma page de destination... et forcement l'objet n'existait pas...
@umfred : Le SelectedItem.clear vide ma variable mais laisse la ligne en "apparence" sélectionnée même si la variable ne contient plus rien, pour l'utilisateur ca peut prêter a confusion je pense... alors que le "null" vide ma variable et remet visuellement la ligne comme non sélectionnée.
Pour mon PDF tout fonctionne, j'ai une belle fenêtre pop up qui s'affiche avec le contenu de mon PDF avec en prime la ptite barre d'outil qui va bien...
Sauf que: cela ne fonctionne que pour des fichiers de moins de 1.6 mega
du coup j'ai essayé autre chose:
j'enregistre mon fichier dans un dossier bien précis de mon application qui va permettre a une balise "iframe" de l'ouvrir
je l'affiche assez simplement.
je le supprime a sa fermeture.
Ainsi un utilisateur ne créera sur le dossier "server" qu'un seul pdf a chaque fois qui sera ensuite supprimé etc...
Problème: l'on me dit que une fois déployée si j'ai 500 utilisateurs qui ouvrent chacun 1 PDF en même temps, je peux potentiellement surcharger le dossier server (temporairement)
De mon point de vue ca ne pose pas vraiment de problème...
Dans le pire des cas (qui n'arrivera jamais) je peux avoir 500 PDF de 4 méga ca me ferai 20 giga de pris sur le server ca devrai être largement supportable mais une fois de plus la probabilité qu'un tel évènement survienne est pour moi proche de zéro.
Mais en bref, et comme je fais des POC, j'essaye quand même de trouver une solution pour stocker ce PDF temporaire dans un dossier... temporaire
de type c:/Temp/NomDeLAppli dans lequel le contenu sera nettoyé a chaque fermeture du PDF
Soucis: si j'ai bien compris on ne peut pas exploiter de fichiers locaux avec une balise HTML ? (iframe ou object)
bref ici pas vraiment de question... juste savoir si un de vous pense a un cheminement de reflexion different qui me permettrait d'exploiter mon fichier temporaire local ?
et encore merci pour vos réponses qui ont su m'aiguiller jusque là
je sais pas vraiment, si j'ai tout compris l'utilisation d'une variable en base 64 pour un PDF dans un iframe HTML est elle même bridée en terme de taille en fonction du browser dans lequel c'est utilisé :/
en revanche quand j'ouvre le fichier enregistré sur le dossier server il n'y a aucun soucis de taille, il m'ouvre même mon plus gros pdf de 4mega...
j'ai estimé 1.6 car il m'ouvre un pdf de 1.5 et des brouettes
mais il bloque pour celui de 1.6 et des bananes ainsi que tous les autres plus gros
C'est le genre de truc qui doit être spécifié dans les normes.
Mais rien indique que votre contournement n'utilise pas un truc non spécifié dans une norme et ne fonctionne que "par chance".
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
afficher un PDF
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
"Kaizoku oni ore wa naru !"
"Kaizoku oni ore wa naru !"
"Kaizoku oni ore wa naru !"
"Kaizoku oni ore wa naru !"
"Kaizoku oni ore wa naru !"
"Kaizoku oni ore wa naru !"