Einzelnen Beitrag anzeigen

Benutzerbild von Phoenix
Phoenix
(Moderator)

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

AW: DElphi 2: TEdgeBrowser PrintAsync

  Alt 20. Dez 2023, 09: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