Wie rende ich den WebBrowser in den Gerätekontext ein?

9

Ich möchte eine Webseite (d. h. TWebBrowser ) in einen Gerätekontext rendern. Ich möchte die Layout-Engine von Internet Explorer verwenden, um Inhalt in einen Gerätekontext (d. h. Metadatei, PDF-Metadatei) zu rendern.

Ab Internet Explorer 9 wird die IHTMLElementRender -Schnittstelle nicht mehr unterstützt :

  

IHTMLElementRender-Schnittstelle

     

Verwenden Sie diese Schnittstelle, um den Inhalt eines Elements auf einen bestimmten Gerätekontext, normalerweise einen Drucker, zu zeichnen.

     

Mitglieder
  Die IHTMLElementRender -Schnittstelle erbt von der IUnknown Schnittstelle, aber keine zusätzlichen Mitglieder.

Bis zu dem Punkt, dass sie nicht mehr erwähnen, dass die Methode DrawToDC existiert sogar:

  

IHTMLElementRender :: DrawToDC-Methode

     

Veraltet. Zeichnet den Inhalt des Elements in den angegebenen Gerätekontext.

     

Syntax

%Vor%      

Parameter

     
  • hDC
       [in] Ein HDC , der das Gerät angibt, zu dem es erstellt werden soll, normalerweise ein Drucker.
  •   

Rückgabewert

     

Gibt bei Erfolg S_OK oder andernfalls einen Fehlerwert zurück.

     

Anmerkungen

     

Ab Windows Internet Explorer 9 ist diese Methode veraltet und sollte nicht verwendet werden.

     

Bei einigen Druckern kann das Ausführen von IHTMLElementRender :: DrawToDC zu Problemen führen. Sie können sicherstellen, dass IHTMLElementRender :: DrawToDC ordnungsgemäß auf allen Druckern funktioniert, indem Sie IHTMLElementRender :: SetDocumentPrinter -Methode zuerst und übergibt dann den geänderten Gerätekontext an IHTMLElementRender :: DrawToDC .

Hinweis : Ich zitiere die gesamte Dokumentation, damit sie immer noch gefunden werden kann, wenn Microsoft sie endgültig aus MSDN entfernt. Zusammen mit der Deklaration der Schnittstelle:

%Vor%

Verwenden Sie die Schnittstelle IViewObject

Ich habe versucht, die IViewObject (zB Wie HTML Element ohne Webbrowser zu rendern? ):

%Vor%

Das Problem mit diesem Code besteht darin, dass nur der sichtbare Bereich des Browsers gerendert wird (d. h. ohne gescrollten Inhalt):

Ich muss die gesamte Webseite rendern (z. B. zum Drucken).

Ich habe versucht, den Aspekt zu ändern von DVASPECT_CONTENT (wie dieses Beispiel ), DVASPECT_DOCPRINT :

  

DVASPECT_DOCPRINT
  Stellt eine Darstellung des Objekts auf dem Bildschirm bereit, als ob es mit dem Befehl Drucken aus dem Menü Datei auf einen Drucker gedruckt wurde. Die beschriebenen Daten können eine Folge von Seiten darstellen.

Mit dem gleichen Ergebnis; anstatt die Seite zu rendern, wird nur der sichtbare Teil gerendert:

Wie kann ich die IE9-Rendering-Engine zum Rendern auffordern?

Ich habe auch verschiedene Indizes zusammen mit DVASPECT_DOCPRINT verwendet. Obwohl IViewObject nicht dokumentiert ist, drucken Sie vielleicht verschiedene "Seiten" :

%Vor%

Aber der WebBrowser kümmert sich nicht darum, was der Index ist; nur das Rendern des aktuellen View (was bei Verwendung von IViewObject wahrscheinlich Sinn macht).

Wie rende ich einen Browser in einen Gerätekontext?

Hinweis : Die Frage ist mit delphi markiert, aber in dieser Frage gibt es nichts, was delphi spezifisch ist.

Update : Ich habe auch andere Kombinationen von Aspekt und Index ausprobiert:

%Vor%     
Ian Boyd 04.06.2012, 15:42
quelle

1 Antwort

1

Mit IViewObject können Sie einen Screenshot des aktuellen Ansichtsfensters erstellen. Ich benutze einen Trick, um einen Screenshot einer Webseite (ohne Rahmen) oder ein Rahmendokument zu erstellen.

  1. Berechnen Sie die vollständige Dokumentgröße mit scrollWidth / scrollHeight / scrollLeft / scrollTop (prüfen Sie die Schnittstellen IHhtmlDocument2 und IHtmlDocument3)
  2. Sperrfenster aktualisieren und das Dokument in voller Größe anpassen
  3. Verwenden Sie IViewObject, um einen Snapshot zu erstellen (Ihr Code oben scheint in Ordnung zu sein)
  4. Stellen Sie das Dokument auf seine Originalgröße wieder her und entsperren Sie das Fenster update

Beachten Sie, dass Sie darauf achten sollten, wenn das Dokument sehr groß ist.

    
stanleyxu2005 07.06.2012 12:56
quelle