Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TWebbrowser, PDF und Drucken (https://www.delphipraxis.net/33765-twebbrowser-pdf-und-drucken.html)

Wathlon 12. Nov 2004 10:25


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

Wathlon 12. Nov 2004 11:45

Re: TWebbrowser, PDF und Drucken
 
Lösung gefunden!

Delphi-Quellcode:
procedure Print;
var
  Doc: IHtmlDocument2;
begin
   Webbrowser1.Document.QueryInterface(IID_IHtmlDocument2, Doc);
   if Doc <> nil then
   begin
     doc.execCommand('Print', true, null);
   end;
end;
Gruß Walter

MaBuSE 13. Jan 2005 07:30

Re: TWebbrowser, PDF und Drucken
 
Zitat:

Zitat von Wathlon
Lösung gefunden!

Leider funktioniert diese Lösung bei mir nicht.
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;

Wathlon 13. Jan 2005 07:57

Re: TWebbrowser, PDF und Drucken
 
Hallo,

wenn

Zitat:

Zitat von MaBuSE
Delphi-Quellcode:
doc = nil -> nix passiert

dann soll ja auch nix geschehen, sondern nur wenn

Delphi-Quellcode:
if Doc <> nil then
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)!

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

MaBuSE 13. Jan 2005 08:06

Re: TWebbrowser, PDF und Drucken
 
Zitat:

Zitat von Wathlon
Hallo, wenn
Zitat:

Zitat von MaBuSE
Delphi-Quellcode:
doc = nil -> nix passiert

dann soll ja auch nix geschehen, sondern nur wenn
Delphi-Quellcode:
if Doc <> nil then

In dem TWebBrowser ist ein PDF geladen.
(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:
...
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;
...
[edit]
Zitat:

Zitat von Wathlon
Ich verwende Win2000, IE6.0, AcroReader 5.0.5, D7

Ich verwende WinXP, IE6.0, AcroReader 7.0.0, D7
[/edit]

Wathlon 13. Jan 2005 08:32

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:
    wb.Navigate2(aUrl);
    while wb.ReadyState < 4 do
    begin
      application.ProcessMessages;
    end;
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.

Gruß Walter

MaBuSE 19. Jan 2005 09:33

Re: TWebbrowser, PDF und Drucken
 
Zitat:

Zitat von MaBuSE
In dem TWebBrowser ist ein PDF geladen.
(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:
...
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;
...

Ich habe das Problem nun gelöst:

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;

MaBuSE 19. Jan 2005 09:43

Re: TWebbrowser, PDF und Drucken
 
Zitat:

Zitat von Wathlon
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.

Das liegt warscheinlich daran, das man den Parent nicht direkt zuweisen kann.
Delphi-Quellcode:
  wb := TWebBrowser.Create(Form1);
  wb.Parent := Form1;
Es gibt dann eien Fehler. ReadOnly Eigenschaft kann nicht gesetzt werden :-(
Die Lösung ist eigentlich einfach:
TWebBrowser ist von TControl abgeleitet, also kann auch der Parent gesetzt werden.
Delphi-Quellcode:
  wb := TWebBrowser.Create(Form1);
  TControl(wb).Parent := Form1;
Das klappt super.

Zitat:

Zitat von Wathlon
2. Navigation: Navigate2 soll verwendet werden
Delphi-Quellcode:
    wb.Navigate2(aUrl);
    while wb.ReadyState < 4 do
    begin
      application.ProcessMessages;
    end;

navigate2 wird nur gebraucht, wenn man keine URL angeben kann.
Ich habe die Möglichkeit eine URL anzugeben (http://www.blabla.de oder auch C:\TEMP\test.pdf)

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:

Zitat von Wathlon
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.

Das war mein eigentlicher Fehler.
TWebBrowser hatte das PDF noch nicht geladen als ich drucken wollte :-(

MaBuSE 19. Jan 2005 10:49

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++

http://msdn.microsoft.com/library/de.../reference.asp

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