AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi 12: TEdgeBrowser PrintAsync

Ein Thema von looseleaf · begonnen am 18. Dez 2023 · letzter Beitrag vom 20. Dez 2023
Antwort Antwort
looseleaf

Registriert seit: 25. Mai 2011
58 Beiträge
 
#1

Delphi 12: TEdgeBrowser PrintAsync

  Alt 18. Dez 2023, 07:57
Delphi-Version: 12 Athens
Liebe Gemeinde!

Wir haben Delphi 12 gerade installiert und versuchen, den TEdgeBrowser dazu zu bringen, eine HTML Datei auszudrucken. mit e.ExecuteScript('window.print()'); geht das zwar, aber nicht ohne den Druckdialog. Und wenn das WebView gar nicht angezeigt wird, sondern wir nur ganz ohne UI eine HTML-datei drucken wollen, dann überhaupt nicht.
Es gäbe dafür lt. Microsoft-Doku PrintAsync als Methode, doch die ist in Winapi.WebView2 nicht ausgeführt.

Übersehe ich was oder hat jemand eine Idee, wie wir ihm das beibringen können?

Danke
Stefan

Geändert von TBx (21. Dez 2023 um 22:02 Uhr) Grund: Delphi Version angepasst
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#2

AW: DElphi 2: TEdgeBrowser PrintAsync

  Alt 18. Dez 2023, 08:36
Schau mal ins GetIt, da gibt es seit Kurzem etwas, wo nahezu die komplette WinAPI automatisiert übersetzt wurde.
"Windows API from WinMD"
Ich hätte es hier verlinkt, aber es wird im https://getitnow.embarcadero.com nicht gelistet.

Microsoft stellt dafür seit 'ner Weile passende Daten bereit. (gut, schon seit 3 Jahren und jetzt hatte Emba es endlich bemerkt/geschafft)
https://learn.microsoft.com/de-de/uw...ef/winmd-files
https://github.com/microsoft/win32metadata


Alternativ mal versuchen das Fenster dennoch anzuzeigen? (Wenn ich nicht sichtbar bin, würde ich auch faul sein und mich nicht malen wollen )
Außerhalb des Desktops, mit ShowWindows+SW_SHOWNOACTIVATE, anstatt Visible:=True oder Show. (aber vielleicht bemerkt es dann dennoch, dass es eigentlich nicht sichtbar ist)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (18. Dez 2023 um 08:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: DElphi 2: TEdgeBrowser PrintAsync

  Alt 18. Dez 2023, 09:56
Edge dürfte vermutlich nicht ohne gültigen Windows-Handle funktionieren.
Trick ist hier:
- Edge-Control auf ein nicht sichtbares Form legen
- Mit HandleNeeded dafür sorgen das alle Controls ein gültiges Handel haben (ohne angezeigt zu werden).
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
looseleaf

Registriert seit: 25. Mai 2011
58 Beiträge
 
#4

AW: DElphi 2: TEdgeBrowser PrintAsync

  Alt 20. Dez 2023, 07:03
Danke euch für die Rückmeldungen. Am schönsten fände ich es, wenn einfach die Interfaces da wären :/

Ich glaube, ich gehe zurück und mache eine Internet Exlorer Engine aus dem TWebBrowser, und verwende das bisherige Drucken...
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#5

AW: DElphi 2: TEdgeBrowser PrintAsync

  Alt 20. Dez 2023, 07:25
Ich glaube, ich gehe zurück und mache eine Internet Exlorer Engine aus dem TWebBrowser, und verwende das bisherige Drucken...
Das ist eher eine schlechte Idee. Das macht Dir das Leben in absehbarer Zeit nur noch schwieriger, insbesondere was das Layouting der Print-Sachen angeht.
Ich bin inzwischen dazu übergegangen, Printing nicht mehr in-App zu machen.

Gut, ich baue auch schon länger eher API-Backends und das UI ist im Prinzip seit 10+ Jahren immer schon eine Webanwendung, aber drucken mache ich über HTML -> Datei, Konsolenanwendung die HTML-Datei -> PDF baut und dann wird dem User entweder das PDF präsentiert oder ich sende das direkt an den Drucker.

Ja, man muss kurz auf einen externen Prozess warten, aber dafür kann ich das Ding in so ziemlich jeder Konstellation immer wieder zuverlässig verwenden.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: DElphi 2: TEdgeBrowser PrintAsync

  Alt 20. Dez 2023, 07:31
Konsolenanwendung die HTML-Datei -> PDF baut
Das ist ja der eigentlich interessante Schritt. Kannst du mehr dazu erzählen, wie genau, welche Technik du einsetzt?
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#7

AW: DElphi 2: TEdgeBrowser PrintAsync

  Alt 20. Dez 2023, 08:35
Das ist ja der eigentlich interessante Schritt. Kannst du mehr dazu erzählen, wie genau, welche Technik du einsetzt?
Klar, gerne

Ich habe da ein paar mögliche Tools:

Erstens: Einfach Chrome verwenden.
Code:
chrome --headless --print-to-pdf="c:\\{{path and file name}}.pdf" https://google.com
Du kannst hinten auch nen lokalen Pfad angeben. Nachteil: Formatting / Layouting ist ein wenig schwierig, insbesondere wenn es um Seitenumbrüche geht.
Was Du damit auch nicht sinnvoll hinbekommst sind Wechsel zwischen Hoch- und Querformatiken Seiten in einem Dokument.

Zum zweiten die kommerzielle und ehrlich gesagt am schmerzfreiesten Variante: PrinceXML.
Ja, Kommerziell. Ja, nicht ganz billig. Aber die Prince-Leute haben die Themen bedacht und bieten an mit speziellen CSS-Rules ein einigermassen sinnvolles Layouting hin zu bekommen. Nachteil hier: Die JS-Engine ist nicht komplett. Chart.js geht z.B., aber komplexere JS-Dinge wie komplette Angular-SPAs kannst Du in Prince leider nicht rendern.

Diese zwei Varianten funktionieren problemlos und auf Windows, Linux und Mac. Sie brauchen nur entweder Chrome oder das jeweilige Plattform-Spezifische Prince-Executable und that's it.

Kommen wir zu den etwas aufwändigeren aber auch mächtigeren Methoden:

Wenn Du node.js auf dem System hast oder haben kannst:
Puppeteer oder PhantomJS.

Puppeteer erlaubt es, einen Chrome zu steuern. PhantomJS ist eine andere Möglichkeit, einen Browser Headless (also ohne UI) fernzusteuern.
Beides wird gerne zum automatisierten Testen von Webseiten verwendet. Du hast in beiden Varianten einen kompletten Browser im Hintergrund.
Hiermit kannst Du z.B. Seiten einer SPA rendern, Eingaben simulieren, eine Berechnung in JS ausführen lassen und dann das Ergebnis drucken. Das ganze geht in ein Paar (meist < 100) Zeilen Javascript.

Am Ende rufst Du auch hier nur node.js DeinScript.js auf und übergibst ggf. Parameter für die Eingabe-Datei und die Ausgabe-Datei.
Die beiden Libraries abstrahieren den Browser so weit weg das man zu 99% keine breaking changes hat wenn man den Browser und damit die Libs aktualisiert.


Alles was darüber hinaus geht ist dann deutlich aufwändiger.
Hier habe ich mit CEF (Chromium Embedded Framework) gearbeitet, konkret CefSharp, um den Browser aus meinen .NET Anwendungen heraus zu steuern.
CEF selber ist aber C/C++ und kann aus nativen Anwendungen auch direkt heraus als DLL aufgerufen werden.

Aber da man hier direkt gegen die Chrome-API geht und das nicht von einem weg abstrahiert wird muss man bei einem Update schonmal mit breaking Changes rechnen und man muss wirklich jeden Call selber machen. Das ist dann in der eine Ebene tiefer als TEdgeBrowser, aber eben mit dem Vorteil das Du wirklich die komplette API zur Verfügung hast. Edge ist ja auch nur ein Chromium mit anderem UI drumrum.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz