J'ai une application Web qui permet aux utilisateurs de télécharger des fichiers .html entiers sur mon serveur. Je souhaite "détecter" la largeur/hauteur du html téléchargé et le stocker dans ma base de données.

Jusqu'à présent, j'ai essayé sans succès d'utiliser le contrôle System.Windows.Forms.WebBrowser - en lisant le fichier dans une chaîne, en le chargeant dans le browser.document :

 _browser = new WebBrowser();
 _browser.Navigate("about:Blank");
 _browser.Document.OpenNew(true);
 _browser.Document.Write(html);

L'inspection des différentes propriétés de l'objet _browser (document, fenêtre, etc.) semble toujours par défaut la taille à 250x250.

J'ai essayé de mettre diverses déclarations de taille CSS dans le fichier .html et toujours la même chose.

  • La seule option pour inspecter la chaîne html et les propriétés CSS correspondent-elles à l'expression régulière ?
  • Comment détermineriez-vous de manière fiable quelle serait la largeur/hauteur rendue du document en question ?

Rappelez-vous, le fichier .html peut ou non contenir des propriétés css. Peut-être que l'utilisateur utilise des balises plus anciennes et obsolètes telles que

<body width="500">

Contre

<style>
 body{ width: 400px; }
<body>

Etc.

1
dmose 7 oct. 2009 à 01:55
Pourquoi? Que veux-tu faire de la taille ?
 – 
SLaks
7 oct. 2009 à 02:21
Histoire courte - Sproutcore utilise des positions absolues pour tout
 – 
dmose
7 oct. 2009 à 17:48

3 réponses

Meilleure réponse

Comme vous l'avez découvert, vous ne pourrez pas utiliser un contrôle WebBrowser car la hauteur et la largeur indiquées sont la hauteur et la largeur du contrôle lui-même, et non le document à l'intérieur du contrôle.

Ce que vous auriez vraiment besoin de faire, c'est d'écrire votre propre moteur d'analyse HTML pour le calculer vous-même. Vous devrez calculer toutes les lignes, déterminer la hauteur de la ligne, etc.

Est-ce que cela en vaut vraiment la peine ? Vous auriez besoin de faire tellement d'hypothèses qu'un tel calcul serait à peu près sans valeur... Différences de rendu par différents navigateurs, clients dont la taille de texte est définie sur autre chose que la valeur par défaut, et probablement des dizaines d'autres. Même la résolution de l'écran serait importante car, comme vous pouvez le voir dans ce paragraphe, le texte a tendance à s'enrouler. Vous devez calculer l'emplacement du texte afin de calculer le nombre de lignes de texte qui s'afficheront. Vous devez tenir compte de la taille des polices...

Cela dit, en théorie, cela devrait être faisable, et les mécanismes de calcul de tout cela seraient les mêmes concepts que ceux que vous utiliseriez pour imprimer sur une imprimante. Le calcul de la hauteur de la page et la détermination de l'endroit où vous vous trouvez sur la page sont des procédures d'exploitation standard lors de l'impression manuelle.

Voici un article qui explique les bases. Ce sera à vous de voir si cela en vaut la peine.

http://msdn.microsoft.com/en-us/magazine/cc188767.aspx

1
David 7 oct. 2009 à 02:14

Même si vous pouviez capturer la largeur déclarée en inspectant les spécifications des balises CSS et/ou HTML, il est peu probable que vous obteniez la largeur rendue. La hauteur sera encore pire, car le texte s'enroule.

Je pense que vous voudrez peut-être envisager une approche différente. As-tu vraiment besoin de ça ? Quelle exigence essayez-vous de satisfaire ? Peut-on le faire différemment ?

2
Randolpho 7 oct. 2009 à 02:10
2
Bons points, et certaines pages Web ajusteront même la mise en page de manière dynamique à la largeur de la toile. Comment géreriez-vous cela?
 – 
Dirk Vollmar
7 oct. 2009 à 02:15

Vous ne pourrez pas trouver les dimensions à l'aide d'expressions régulières - rappelez-vous qu'il n'y en a peut-être pas, auquel cas vous devrez mesurer manuellement les éléments dans le document, nécessitant un moteur de rendu HTML complet.

Le faire avec Interhet Explorer soulève des problèmes de sécurité ; assurez-vous qu'IE est toujours à jour sur votre serveur et que ses paramètres de sécurité dans le compte ASP .Net sont aussi stricts que possible. (je ne sais pas comment faire)

Essayez _browser.Document.Body.OffsetRectangle.Size.

EDIT : Notez que, comme d'autres personnes l'ont souligné, la hauteur dépendra également de la largeur, en raison de l'habillage du texte, etc., vous devez donc définir la largeur du contrôle IE sur une valeur appropriée.

1
SLaks 7 oct. 2009 à 02:20