![]() |
TWebbrowser, PDF und Drucken
Hallo,
ich verwende Delphi7, den TWebbrowser, habe eine Acrobat Reader 6 und will Drucken. In meiner Anwendung habe ich einen Webbrowser mit eingebaut. Hierbei kann es auch vorkommen, dass der Benutzer ein PDF zu sehen bekommt. Da man bei einem PDF die Menüleiste ausschalten kann, muss ich mit einem Button meiner TWebbrowser-Komponente sagen, dass jetzt gedruckt werden soll. Im IE geht das, dort wird das Event auch an das AcroReader-Plugin weitergeleitet, aber wie mache ich das selbst??? Danke für die Hilfe. Gruß Walter |
Re: TWebbrowser, PDF und Drucken
Lösung gefunden!
Delphi-Quellcode:
Gruß Walter
procedure Print;
var Doc: IHtmlDocument2; begin Webbrowser1.Document.QueryInterface(IID_IHtmlDocument2, Doc); if Doc <> nil then begin doc.execCommand('Print', true, null); end; end; |
Re: TWebbrowser, PDF und Drucken
Zitat:
doc = nil -> nix passiert Welche Acrobat Reader Version bzw. welche IE Version verwendest Du ? Diese Lösung gibt zwar S_OK zurück, aber es gibt keinen DruckDialog, und es druckt auch nicht.
Delphi-Quellcode:
// Quelltext aus Delphi-Source Tipps Sammlung
// [url]http://www.dsdt.info/tipps/?id=171[/url] // Keine Autoren angegeben procedure PrintWebBrowser(WB: TWebBrowser); var OleCommandTarget: IOleCommandTarget; Command: TOleCmd; Success: HResult; begin if not Assigned(WB) then Exit; if not Assigned(WB.Document) then Exit; // Referenz auf IOleCommandTarget besorgen WB.Document.QueryInterface(IOleCommandTarget, OleCommandTarget); // Prüfen, ob Drucken momentan erlaubt Command.cmdID:= OLECMDID_PRINT; if OleCommandTarget.QueryStatus(Nil, 1, @Command, Nil) <> S_OK then begin ShowMessage('Drucken nicht möglich'); Exit; end; if (Command.cmdf and OLECMDF_ENABLED) <> 0 then begin // Drucken ausführen Success:= OleCommandTarget.Exec(Nil, OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER, EmptyParam, EmptyParam); case Success of S_OK: ; // Alles OK OLECMDERR_E_CANCELED: ShowMessage('Abbruch durch User'); else ShowMessage('Fehler!!!'); end; end else begin // Drucken momentan nicht erlaubt ShowMessage('Drucken nicht möglich'); Exit; end; end; |
Re: TWebbrowser, PDF und Drucken
Hallo,
wenn Zitat:
Delphi-Quellcode:
Ich hatte auch schon mit Assigned experimentiert, aber dann festgestellt, dass der Quelltext, genau so wie ich ihn geschrieben habe, funktioniert, sonst nix (aber vielleicht bin ich zu dumm)!
if Doc <> nil then
Mit TOleCmd kenne ich mich nicht aus, das habe ich noch nicht versucht. Ich verwende Win2000, IE6.0, AcroReader 5.0.5, D7 Gruß Walter |
Re: TWebbrowser, PDF und Drucken
Zitat:
(Ich seh es ja auf dem Bildschirm) Trozdem druckts mit deiner Funktion nicht. (Vieleicht bin ich ja auch nur zu blöd) Hast Du einen Hinweis für mich?
Delphi-Quellcode:
[edit]
...
procedure TForm1.wbNavigateComplete2(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); begin istFertig := True; end; ... wb := TWebBrowser.Create(ts); TControl(wb).Parent := ts; wb.Align := alClient; wb.OnNavigateComplete2 := wbNavigateComplete2; istFertig := False; wb.Navigate(ExpandFileName('Test.pdf')); while not istFertig do Application.ProcessMessages; wb.Document.QueryInterface(IID_IHtmlDocument2, Doc); if Doc <> nil then begin doc.execCommand('Print', true, null); end; ... Zitat:
[/edit] |
Re: TWebbrowser, PDF und Drucken
ja so leicht ist das auch nicht, ...
1. Wir hatten Probleme, wenn wir einen Webbrowser über den Code generieren, daher haben wir immer den Webbrowser im Designer erstellt, frag mich nicht warum. 2. Navigation: Navigate2 soll verwendet werden
Delphi-Quellcode:
3. Versuche jetzt einmal über einen "Druckerbutton" zu drucken, denn es kann sein, dass das Plugin noch nicht so weit ist und daher das Drucken fehlschlägt.
wb.Navigate2(aUrl);
while wb.ReadyState < 4 do begin application.ProcessMessages; end; Gruß Walter |
Re: TWebbrowser, PDF und Drucken
Zitat:
Warum auch immer habe ich onNavigationComplete benutzt. Ich verwende nun onDownloadComplete und warte danach noch eine Sekunde. Dann klappts mit der "procedure PrintWebBrowser(WB: TWebBrowser);" (siehe Post weiter oben) Es erscheint der Druckdialog. Das funktioniert aber nur, wenn der TWebBrowser sichtbar auf einem Form ist. :-( Ich habe das nun wie folgt gelöst: TWebBrowser ist nur 1 x 1 Pixel groß, aber sichtbar ;-)
Delphi-Quellcode:
procedure Wait(SleepTimeStr: string);
var EndTime : TDateTime; begin EndTime := Now + StrToTime(SleepTimeStr); while Now < EndTime do Application.ProcessMessages; end; procedure TForm1.Button4Click(Sender: TObject); var wb: TWebBrowser; begin dlgDrucken := TdlgDrucken.Create(Application); dlgDrucken.Show; wb := TWebBrowser.Create(dlgDrucken.Panel1); TControl(wb).Parent := dlgDrucken.Panel1; wb.Width := 1; wb.Height := 1; wb.OnDownloadComplete := WebBrowser1DownloadComplete; ok := False; wb.Navigate(ExpandfileName('test.pdf')); while not ok do Application.ProcessMessages; Wait('00:00:01'); PrintWebBrowser(wb); dlgDrucken.Free; dlgDrucken := nil; end; |
Re: TWebbrowser, PDF und Drucken
Zitat:
Delphi-Quellcode:
Es gibt dann eien Fehler. ReadOnly Eigenschaft kann nicht gesetzt werden :-(
wb := TWebBrowser.Create(Form1);
wb.Parent := Form1; Die Lösung ist eigentlich einfach: TWebBrowser ist von TControl abgeleitet, also kann auch der Parent gesetzt werden.
Delphi-Quellcode:
Das klappt super.
wb := TWebBrowser.Create(Form1);
TControl(wb).Parent := Form1; Zitat:
Ich habe die Möglichkeit eine URL anzugeben ( ![]() Online Hilfe von D7: Navigate (Methode von TWebBrowser) ... Hinweis: Wenn Sie die Ressource nicht als URL angeben können (z. B. bei einer Elementbezeichnerliste), verwenden Sie stattdessen die Methode Navigate2. Online Hilfe von D7: Navigate2 (Methode von TWebBrowser) ... URL gibt den UNC-Pfadnamen einer Datei, die URL einer Internet-Ressource oder einen Zeiger auf eine Elementbezeichnerliste (PIDL) an. ... Zitat:
TWebBrowser hatte das PDF noch nicht geladen als ich drucken wollte :-( |
Re: TWebbrowser, PDF und Drucken
Treffnix schrieb in einer PN Hallo, gerade gelesen, dass du im TWebbrowser am rumdrucken bist. Ich hab derzeit quasi das umgekehrte Problem. Ich versuch HTML in PDF zu konvertieren. Dazu muss ich aber den Ausdruck des Browsers auf nen PS-Drucker umbiegen. Vielleicht hast du ja zufällig was. Ich habs jetzt mit ExecWB, ExecCommand und der Printmethode von IHTMLWindow3 versucht, aber alle benutzen den Standarddrucker und ich hab noch nichts gefunden um das zu ändern. Und den Standarddrucker will ich nicht ändern. Das isn bissl unschön. Gruß Carsten Das Problem habe ich nicht gelöst, aber hier findest Du eine Möglichkeit in C++ ![]() Da ich nichts entsprechendes in Delphi gefunden habe, müssen meine Anwender mit den Druckdialog leben. (Druck auf Standard-Drucker habe ich wie folgt gelöst: :oops: )
Delphi-Quellcode:
Result := ShellExecute(Application.Handle, 'print', FileName, nil, nil, SW_SHOW) > 32;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz