IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Comment capturer une page TWebBrowser en mode paysage ?


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 287
    Points : 164
    Points
    164
    Billets dans le blog
    1
    Par défaut Comment capturer une page TWebBrowser en mode paysage ?
    Je réalise une vaste DLL de service en Delphi 6 Personal Edition, pour un usage par un autre langage (un clône de Basic, en fait).

    Dans cette DLL, j'ai une série de fonctions gérant un WebBrowser créé dynamiquement. Et je veux y ajouter une fonction de capture, non pas dela partie visible à l'écran, mais de la page web entière, même ce qui est hors champs. J'ai pas map cheché sur internet, et j'ai trouvé comment faire. Je capte la totalité du canvas et le dépose dans une TBitmap crée dynamiquement cet effet. Ensuite, en fonction de la sortie choisie, je l'envoie sur l'imprimante par défaut du système, sur une imprimante choisie dans la liste des imprimantes du système ou dans le presse-papier. Et dans ce dernier cas, je l'envoie également dans un TPicture pour vérification.

    Cela marche parfaitement pour des pages en mode paysage (hauteur plus grande que largeur). En tout cas, pour la plupart d'entre elles. Certaines résistent. Et cela ne marche pas pour des pages en mode paysage (largeur plus grande que hauteur). Là, l'adaptation à taille du canvas de sortie ne se fait pas, tout simplement, et je ne comprends pas pourquoi.

    J'ai fait un petit projet de démo dont je poste le zip en pièce jointe. Le fichier EXE est joint et il fonctionne pour mettre en évidence le problème. Il montre deux forms:
    la form principale a une combo avec la liste des imprimantes installées, et l'imprimante par défaut est sélectionnée. Une autre combo donen deux URLs, dont la première est sélectionnée: une page en mode portait pour lequel le programme fonctionne et montre ce qui devrait se passer. Un bouton "Charger URL" charge cette RL dans le TWebBrowser de la form secondaire. Une checkbox pour afficher ou non les dimensions des canvas et bitmaps au cours du processus. Puis 3 boutons d'impression en fonction des 3 modes d'impression prévus dans mon code. La partie "impression" fonctionne bien dans tous les cas.

    Voici une capture d'écran avec impression dans le presse-papier avec l'URL en mode portrait:
    Nom : aa1.png
Affichages : 87
Taille : 119,3 Ko

    Certes, je sais: il y a un problème de déformation car je n'ai pas encore veillé à la proportionnalité des dimensions lors du changement de taille. Cela viendra, mais ce n'est pas l'objet de ma demande. Il est prévu de passer en édition multi-page si l'image ne tient pas dans la page sans déformations, ce qui est assez facile à faire en prenant pour chaque page la partie concernée du canvas de la bitmap récupérer. L'affichage dans le PICTURE est secondaire et ne sert qu'à vérifier qu'on a bien récupéré le canvas total de la page contenue dans le WebBrowser. L'important, c'est que l'image complète soit dans le presse-papier.

    La seconde capture montre le problème, à l'aide de la seoconde URL dans la combo URL:
    Nom : aa2.png
Affichages : 79
Taille : 55,0 Ko
    Subitement, il n'y a plus de changement de dimension de l'image. Pourquoi ?

    Le projet complet est en pièce jointe. Merci d'avance pour votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 287
    Points : 164
    Points
    164
    Billets dans le blog
    1
    Par défaut
    Entretemps, dans mon projet DLL, j'ai ajouté la possibilité d'édition multi-pages tout en gérant les marges du papier (en cas de sortie sur imprimante, bien sur - pas dans le cas su presse-papier !). Ceci est opérationnel pour les pages en mode portrait, tout en projettant la largeur de la bitmap du browser sur la largeur de la page utile (largeur de page physique moins les deux marges latérales), pouvant ainsi imprimer sans déformations des proportions. Je ne l'ajoute pas dans le petit projet posté plus haut pour ne pas compliquer inutilement, car le problème n'est pas là. Il se situe en réalite dans le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        with browser.ControlInterface do begin
          HtmlElement := (Document as IHTMLDocument3).documentElement as IHTMLElement2;
        end;
     
        PageHeight := HtmlElement.scrollHeight;
        PageWidth  := HtmlElement.scrollWidth;
    Les valeurs de HtmlElement.scrollHeight et HtmlElement.scrollWidth dans la fonction generateImageFromBrowser sont fausses. Ainsi, les calculs suivants sont biaisés.

    Ceci est mis en évidence par la seconde URL dans la combo des URLs.Et je ne comprends pas...

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Dans cette discussion je me basais sur la hauteur du body en fonction d'une largeur définie.

    Reporté dans ta procédure, ça donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    function generateImageFromBrowser(browser: TWebBrowser): TBitmap;
    var
      Doc  :IHTMLDocument2;
      View :IViewObject;
      Rect :TRect;
     
    begin
      Result := TBitmap.Create;
     
      Doc := browser.Document as IHTMLDocument2;
     
      if Assigned(Doc.Body) then
      begin
        //Largeur du WebBrowser à la largeur de l'écran et
        //récupération de la hauteur nécessaire
        browser.Width  := Screen.Width;
        browser.Height := (Doc.Body as IHTMLElement2).ScrollHeight;
     
        Result.Width  := browser.Width;
        Result.Height := browser.Height;
        Rect          := Bounds(0, 0, Result.Width-1, Result.Height-1);
     
        Doc.QueryInterface(IViewObject, View);
        View.Draw(DVASPECT_CONTENT, 1, nil, nil, Application.Handle, Result.Canvas.Handle, @Rect, nil, nil, 0);
      end;
    end;

  4. #4
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 287
    Points : 164
    Points
    164
    Billets dans le blog
    1
    Par défaut
    Merci beaucoup, Andnotor. Cela marche parfaitement, pour les deux URLs dans la combo des URLs. En plus, le code est BEAUCOUP plus simple que le mien. Chapeau !

    Cependant, je reste un peu sur ma faim, concernant la compréhension du problème, étant donné ue tu as utilisé une approche différente. Je ne sais toujours pas pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        PageHeight := HtmlElement.scrollHeight;
        PageWidth  := HtmlElement.scrollWidth;
    dans ma fonction generateImageFromBrowser ne retournent pas les bonnes valeurs pour la seconde URL dans la liste (celle dont la page est en mode paysage).

    Mais enfin, mon problème est résolu. Un grand MERCI !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/11/2011, 08h34
  2. Comment forcer l'ouverture d'une page html en mode "AGRANDI" ?
    Par theos37 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 28/10/2010, 16h36
  3. Comment modifier une page affichée dans un TWebBrowser ?
    Par dreamincoco dans le forum Composants VCL
    Réponses: 7
    Dernier message: 24/03/2005, 14h07
  4. ouvrir une page Web en mode texte
    Par Halleck dans le forum Windows
    Réponses: 7
    Dernier message: 03/03/2004, 15h08
  5. [VB.Net] Comment generer une page html dynamiquement ?
    Par Anonymous dans le forum ASP.NET
    Réponses: 3
    Dernier message: 13/03/2003, 10h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo