C#- und Python-Bibliotheken zum Generieren von PDF-Seiten aus HTML/CSS mit Kopf-/Fußzeilen

Meine aktuelle Architektur:

  • Zwei Back-Ends – ein C# und ein Python/Flask – stellen JSON-basierte Daten für eine Front-End-Anwendung bereit.
  • Front-End-Anwendung geschrieben in AngularJS 1.6.
  • Berichte, die aus Angular-Ansichten generiert werden – dynamisch generiert mit der Datenbindung von AngularJS.
  • CSS-Hacks, die verwendet werden, um die Ausgabe für den Druck geeignet zu machen. (Die Bildschirmansicht ist jedoch ziemlich schlecht.)
  • Die Authentifizierung erfolgt über Bearer-Token mit OAuth – Anmeldeinformationen werden einem Backend-Endpunkt bereitgestellt, der ein Token generiert, das dann bei jeder Anfrage bereitgestellt wird.

Was ich machen möchte:

  • Übergang zu einem Modus, in dem Berichte generiert und dem Benutzer als PDF-Datei bereitgestellt werden. Dies könnte entweder am Frontend oder am Backend erfolgen, aber das Backend scheint ein geeigneterer Ort zu sein - ganz zu schweigen davon, dass die Ausführung am Frontend die gleichen Probleme mit sich bringen könnte, die ich bereits mit CSS-Hacks habe .
  • Die generierten PDF-Dateien müssen eine sich wiederholende Kopf- und Fußzeile haben können, die beide dynamische Daten enthalten können (z. B. Seitenzahlen in der Fußzeile, Kundenname in der Kopfzeile)
  • PDF-Downloads müssen authentifiziert werden. (Es sollte nicht möglich sein, ein PDF anzufordern, ohne dass Backend-Code ausgeführt wird, um sicherzustellen, dass die Anfrage genehmigt wird.)
  • Die PDF-Authentifizierung muss in die OAuth-Bearer-Token-Authentifizierung integriert werden können, die bereits von der App verwendet wird (C#-Back-End generiert ein Bearer-Token. Das Python-Back-End stellt derzeit nur nicht private Daten bereit, aber wir könnten ein Dual-Login-Szenario durchführen, bei dem beide APIs eigene Token generieren.)

Hier sind meine Herausforderungen:

  • Aus irgendeinem Grund unterstützen Browser kein @pageCSS, selbst wenn eine Webseite gedruckt wird. Daher kann ich keine Kopf- oder Fußzeilen einfügen. Ganz zu schweigen davon, dass jeder Browser den Inhalt etwas anders darstellen kann. Durch das Generieren von PDF im Backend werden die Berichte vereinheitlicht.
  • Da die Reports derzeit dynamisch auf dem Frontend mit AngularJS generiert werden, müsste ich dies wahrscheinlich ändern, damit das Backend PDF-Dateien selbst generieren kann. Ich bin mir nicht sicher, wo ich damit anfangen soll, außer vielleicht eine C#-Klasse zu schreiben, die den HTML-Code manuell generieren kann - Sie werden jedoch nicht alle Schönheiten der Angular-Datenbindung und die einfache Änderung der Vorlage nach Bedarf haben. Ich möchte, dass dieser Übergang so glatt wie vernünftigerweise möglich ist.

Meine Fragen:

  • Gibt es eine gute kostenlose Bibliothek (Open-Source vorzuziehen, Freeware OK, bezahlter letzter Ausweg und in angemessenem Rahmen, da dies ein persönliches Projekt ist, das nur von vielleicht 3 Personen verwendet wird), die PDF aus HTML/CSS im Backend generieren kann und das in meiner Umgebung der OAuth-Token-Authentifizierung funktionieren kann?
  • Was wäre der beste Ansatz, um den HTML-Code für Berichte im Backend ohne die Hilfe der AngularJS-Datenbindung zu generieren? Manuelle HTML-Generierung in CSS/Python? Ein anderes Datenbindungs-Framework, das für das Backend entwickelt wurde (nicht sicher, ob es das gibt)?
Vielleicht können Sie in dieser Stack Overflow-Frage etwas Nützliches finden . Es hört sich auch so an, als ob Sie bei der Konvertierung von HTML in PDF bleiben möchten, aber wenn Sie bereit sind, das PDF von Grund auf neu zu erstellen, eröffnet dies mehr Optionen (z. B. ReportLab in Python).
Ich bin nicht fest entschlossen, HTML in PDF zu konvertieren, nur dass ich viel Zeit damit verbracht habe, die Berichte mithilfe von HTML und CSS richtig aussehen zu lassen, und möchte nicht, dass all das verschwendet wird. Möglicherweise muss ich dies jedoch so oder so überdenken, da ich die AngularJS-Datenbindung nicht zum Generieren der Berichte verwenden kann, wenn ich einen Backend-HTML-> PDF-Renderer verwende ...

Antworten (1)

Syncfusion bietet Unterstützung für die serverseitige Konvertierung von URL/HTML-Strings in PDF mit C#, was für Ihre Anforderung geeignet sein kann. https://www.syncfusion.com/pdf-framework/net/html-to-pdf

1) Sie können den Medientyp des HTML zwischen Bildschirm und Druck umschalten . Weitere Informationen finden Sie unter dem folgenden Link https://help.syncfusion.com/file-formats/pdf/converting-html-to-pdf#mediatype

2) Die Konvertierung kann mithilfe von OAuth (Bearer-Token) mit dem folgenden Code-Snippet authentifiziert werden.

        //Initialize HTML to PDF converter 
        HtmlToPdfConverter htmlConverter = new HtmlToPdfConverter(HtmlRenderingEngine.WebKit);
        WebKitConverterSettings webKitSettings = new WebKitConverterSettings();

        //Add custom HTTP request headers
        webKitSettings.HttpRequestHeaders.Add("Authorization", "bearer LXifBuVJzV4Fp_200rPdTHj_...");

        //Assign WebKit settings to the converter
        htmlConverter.ConverterSettings = webKitSettings;

        //Convert url to pdf
        PdfDocument document = htmlConverter.Convert(url);  

        //Save the document.
        document.Save("Sample.pdf");
        document.Close();  

3) Verschiedene Kopf- und Fußzeilen können nach der HTML-zu-PDF-Konvertierung im PDF-Dokument hinzugefügt werden, siehe unten KB. https://www.syncfusion.com/kb/7797

4) Der Konverter lädt die Daten von der clientseitigen Datenbindung, da wie im Webbrowser angezeigt, das PDF gespeichert wird.

Die gesamte Suite von Steuerelementen ist kostenlos (auch kommerzielle Anwendungen) über das Community-Lizenzprogramm verfügbar, wenn Sie sich qualifizieren (weniger als 1 Million US-Dollar Umsatz). Die Community-Lizenz ist das vollständige Produkt ohne Einschränkungen oder Wasserzeichen.

Hinweis: Ich arbeite für Syncfusion.