HTML2BMP
-
Hi.
Ich habe paar HTML Seiten erstellt und möchte diese als Grafiken in meine PDF ablegen. Dazu möchte ich mir ein kleines Programm schreiben und mit Hilfe der CppWebBrowser Komponente eine HTML-Seite auf feste Breite und Höhe definieren und darstellen kann. Klappt auch alles.
Nun fehlt mir der entscheidende finale Schritt, wie bekomme ich nun die Ansicht als Grafik gespeichert und zwar die komplette, auch den Teil der erst beim scrollen erscheint.
Kann da wer Tipps geben?
-
Habe ein beispiel in Delphi gefunden: http://cc.borland.com/download.aspx?id=21429&file=article_bdn_4%2FufrmMain.pas&ln=1
Habe versucht dieses zu CBuilder umzuschreiben, bekomme leider paar Fehler.

void __fastcall TForm1::WebBrowser1DocumentComplete(TObject *Sender, LPDISPATCH pDisp, TVariant *URL) { IViewObject *viewObject; TRect arect; //we check that document is really loaded //by checking navComplete because OnDocumentComplete //may occur even if browser did not succesfully navigate to site if ((navComplete) && (WebBrowser1->Document!=NULL)) { //query interface for IViewObject WebBrowser1->Document->QueryInterface(IViewObject, viewObject); if (viewObject!=NULL) { //hide scroll bar of browser WebBrowser1->OleObject->Document->Body->Style->OverflowX = "hidden"; WebBrowser1->OleObject->Document->Body->Style->OverflowY = "hidden"; //set size of webbrowser as big as actual html size because //we want to capture ALL html if (WebBrowser1->ClientWidth < WebBrowser1->OleObject->Document->Body->ScrollWidth) { WebBrowser1->ClientWidth = WebBrowser1->OleObject->Document->Body->ScrollWidth; } if (WebBrowser1->ClientHeight < WebBrowser1->OleObject->Document->Body->ScrollHeight) { //4 is a little bit hack value! i'don't know why. the height is always cut few pixel at the bottom //can anybody tell me why? WebBrowser1->ClientHeight = WebBrowser1->OleObject->Document->Body->ScrollHeight+4; } //note:if your html height or width is too big this may cause //exception due to not enough resource or memory for bitmap TargetBitmap->Width = WebBrowser1->ClientWidth; TargetBitmap->Height = WebBrowser1->ClientHeight; arect = Rect(0, 0, WebBrowser1->ClientWidth, WebBrowser1->ClientHeight); //the actual draw viewObject->Draw(DVASPECT_CONTENT, 0, NULL, NULL, 0, TargetBitmap->Canvas->Handle, &arect, NULL, NULL, 0); //btnSaveBitmap->Enabled = true; viewObject->Release(); viewObject = NULL; } } }Habe die Fehlerzeilen an obige Anzeige angepasst
[[C++ Fehler] Unit1.cpp(13): E2108 Ungültige Verwendung von typedef 'IViewObject' [C++ Fehler] Unit1.cpp(13): E2034 Konvertierung von 'IViewObject *' nach 'void * *' nicht möglich [C++ Fehler] Unit1.cpp(13): E2342 Keine Übereinstimmung des Typs beim Parameter 'ppvObject' ('void * *' erwartet, 'IViewObject *' erhalten) [C++ Fehler] Unit1.cpp(17): E2288 Zeiger auf Struktur auf linker Seite von -> oder von ->* erforderlich [C++ Fehler] Unit1.cpp(18): E2288 Zeiger auf Struktur auf linker Seite von -> oder von ->* erforderlich ............. [C++ Fehler] Unit1.cpp(53): E2034 Konvertierung von 'TRect *' nach 'const _RECTL *' nicht möglich [C++ Fehler] Unit1.cpp(53): E2342 Keine Übereinstimmung des Typs beim Parameter 'lprcBounds' ('const _RECTL *' erwartet, 'TRect *' erhalten)Kann wer dazu helfen?

-
kann keiner helfen wie man aus
var viewObject:IViewObject; WebBrowser1.Document.QueryInterface(IViewObject,viewObject); Webbrowser1.OleObject.Document.Body.Style.OverflowX:='hidden';entsprechenden CBuilder Syntax macht?

-
Hallo
In meinem BCB5 gibt es jedenfalls kein Typ namens IViewObject oder TViewObject. Frag doch dort nach wo du den Quellcode her hast.
bis bald
akari
-
Das ist schon beim BCB (auch 5) dabei. sieh mal nach oleidl.h. Bei möglichen Anwendungen finde ich aber nur pascal oder MFC-Sachen.
-
CBuilder hat kein Problem mit "IViewObject *viewObject;" da geht er fehlerfrei drüber.
Aber die beiden Zeilen darunter mag er in dieser Form garnicht.WebBrowser1.Document.QueryInterface(IViewObject,viewObject); Webbrowser1.OleObject.Document.Body.Style.OverflowX:='hidden';WebBrowser1->Document->QueryInterface(IViewObject, viewObject); WebBrowser1->OleObject->Document->Body->Style->OverflowX = "hidden";Allein schon die Zeile macht 3 Fehler
WebBrowser1->Document->QueryInterface(IViewObject, viewObject); //E2108 Ungültige Verwendung von typedef 'IViewObject' //E2034 Konvertierung von 'IViewObject *' nach 'void * *' nicht möglich //E2342 Keine Übereinstimmung des Typs beim Parameter 'ppvObject' ('void * *' erwartet, 'IViewObject *' erhalten)
-
Dann würde ich das mal folgendermaßen ändern
WebBrowser1.Document.QueryInterface(__classid(IViewObject),reinterpret_cast<void**>(viewObject));
-
Danke! Aber das war es noch nicht ganz

WebBrowser1->Document->QueryInterface(__classid(IViewObject),reinterpret_cast<void**>(viewObject)); // E2242 Für __classid ist ein Klassentyp im VCL-Stil erforderlich.
-
Dann mußt du mal nachschauen was QueryInterface so verlangt. Der erste parameter soll ja wohl einen Typen darstellen. Da man in C++ aber keine Typen übergeben kann ist das hier bestimmt etwas anders gelöst. Bei der VCL nimmt man eben __classid. IViewObject ist aber ein OLE-Interface.
-
Ich hab gerade mal ein wenig nachgeschaut. evtl. geht das ja
WebBrowser1.Document.QueryInterface(IID_IViewObject,reinterpret_cast<void**>(viewObject));
-
Danke das hat super geholfen, zumindest geht der Compiler nun ohne mux drüber.

Den letzten Fehler den er nun noch meldet ist hinter "WebBrowser1->OleObject".
Eventuell eine Idee wie das ausschauen soll?
// DELPHI WebBrowser1.OleObject.Document->Body.Styl.OverflowX := 'hidden';// CBUILDER WebBrowser1->OleObject->Document->Body->Style->OverflowX = "hidden"; // E2288 Zeiger auf Struktur auf linker Seite von -> oder von ->* erforderlich
-
Habe mich mittlerweile totgegoogelt und finde keine Lösung, vielleicht jemand der schonmal mit geabreitet hat und weiss woran es liegt?
-
Hallo
Vermutlich darf mindestens einer der Punkt-Operatoren nicht in einen Pfeiloperator umgewandelt werden.
bis bald
akari
-
Na und selbst wenn, du hast bei der Implementation des CppWebbrowsers beim BCB einen entscheidenden Nachteil.
Du kannst nicht auf das OleObject zugreifen.
Vielleicht hilft dir das weiter:http://www.codeproject.com/KB/IP/htmlimagecapture.aspx?msg=783507
und
http://www.codeproject.com/KB/GDI-plus/WebPageSnapshot.aspx
-
Es gibt auch eine Komponente die das kann. Kostet allerdings 149$.
http://www.guangmingsoft.net/download.htm
-
Ja hast wohl recht, lässt sich mit dem CBuilder so nicht realisieren.
Vielleicht hilft ja jemand dieser Weg: http://www.bytesandmore.de/rad/index.htm?http://www.bytesandmore.de/rad/cpp/snipp/sc08019.phpSieht aber "korksig" aus und komplex. Delphi 1 Zeile und CBuilder 1 Seite.

-
Also ich würde da ganz anders heran gehen.
Ich würde mir eine Form erstellen in der in nur den CppWebBrwoser anzeigen lasse.
Im Idealfall als ohne Rahmen ect.pp.Dann schiebe ich die Form auf Left = -1000 (außerhalb des sichtbaren Bereichen)
Focus auf das Fenster legen und STRG+Druck-Taste auslösen lassen (Geht auch direkt über eine
Funktion -> siehe FAQ) runter scrollen lassen und nochmal. Das ganze dann aus der Zwischenablage
holen und als BMP speichern (-> siehe FAQ) und dann aufwendig wieder zusammen schnipseln.Wäre meine erste überlegung.
-
Die Überlegung hat nur den Nachteil, das er dann den Screenshot vom Bildschirm hat und nicht vom Fenster. Trotzdem müsste er auch noch an die Breite und die Höhe des angeigten Dokumentes kommen.