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
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.643 Beiträge
 
#1

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.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

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.643 Beiträge
 
#3

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 21:46 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