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.php

    Sieht 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.


Anmelden zum Antworten