{"id":8072,"date":"2021-09-29T05:12:44","date_gmt":"2021-09-29T05:12:44","guid":{"rendered":"https:\/\/berg-software.com\/einblicke\/benutzerdefiniertes-reporting-tool-von-html-zu-pdf-flexibel-einfach-und-gesetzeskonform\/"},"modified":"2021-09-29T05:14:23","modified_gmt":"2021-09-29T05:14:23","slug":"benutzerdefiniertes-reporting-tool-von-html-zu-pdf","status":"publish","type":"post","link":"https:\/\/www.berg-software.com\/de\/benutzerdefiniertes-reporting-tool-von-html-zu-pdf\/","title":{"rendered":"Benutzerdefiniertes Reporting-Tool von HTML zu PDF: flexibel, einfach und gesetzeskonform"},"content":{"rendered":"\n[et_pb_section fb_built=&#8220;1&#8243; fullwidth=&#8220;on&#8220; _builder_version=&#8220;4.4.1&#8243;][et_pb_fullwidth_post_title meta=&#8220;off&#8220; featured_placement=&#8220;background&#8220; _builder_version=&#8220;4.6.6&#8243; title_font=&#8220;||||||||&#8220; title_text_color=&#8220;#ff6317&#8243; title_font_size=&#8220;3.5em&#8220; meta_font=&#8220;|300|||||||&#8220; meta_text_color=&#8220;#ffffff&#8220; meta_font_size=&#8220;1em&#8220; background_enable_color=&#8220;off&#8220; use_background_color_gradient=&#8220;on&#8220; background_color_gradient_start=&#8220;rgba(248,248,248,0.85)&#8220; background_color_gradient_end=&#8220;rgba(248,248,248,0.75)&#8220; background_color_gradient_overlays_image=&#8220;on&#8220; min_height=&#8220;20vh&#8220; height=&#8220;400px&#8220; custom_padding=&#8220;6vh||6vh||false|false&#8220; global_module=&#8220;403&#8243; locked=&#8220;off&#8220;][\/et_pb_fullwidth_post_title][\/et_pb_section][et_pb_section fb_built=&#8220;1&#8243; admin_label=&#8220;intro&#8220; _builder_version=&#8220;4.4.6&#8243; custom_padding=&#8220;|||0px||&#8220; locked=&#8220;off&#8220;][et_pb_row use_custom_gutter=&#8220;on&#8220; _builder_version=&#8220;4.4.6&#8243; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;6vh||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220;][et_pb_column type=&#8220;4_4&#8243; _builder_version=&#8220;4.4.1&#8243;][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; hover_enabled=&#8220;0&#8243; border_color_left=&#8220;#ff6317&#8243; sticky_enabled=&#8220;0&#8243;]<p>In der Gesch\u00e4ftswelt ist Reporting ein notwendiges \u00dcbel: Es wird akzeptiert bzw. muss gemacht werden, um ein besseres Ergebnis zu erzielen (z. B. organisatorische \u00dcbersicht, Standardisierung, Disziplin). Und als ob der Druck nicht so schon gro\u00df genug w\u00e4re, schreiben Aufsichtsbeh\u00f6rden immer mehr Auflagen vor.<\/p>\n<p>Ein gutes Beispiel daf\u00fcr ist die europ\u00e4ische Zahlungsdiensterichtlinie 2015\/2366 (siehe <a href=\"https:\/\/ec.europa.eu\/info\/law\/payment-services-psd-2-directive-eu-2015-2366_en\" target=\"_blank\" rel=\"noopener noreferrer\">die offizielle Seite<\/a>, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Payment_Services_Directive\" target=\"_blank\" rel=\"noopener noreferrer\">die Wikipedia-Seite<\/a> und den <a href=\"https:\/\/joinup.ec.europa.eu\/collection\/rolling-plan-ict-standardisation\/retail-payments\">offiziellen Umsetzungsplan der EU<\/a>): Aufgrund des technologischen Wandels im Zahlungsverkehr zielt sie darauf ab\u201e<em>die Verbraucher besser zu sch\u00fctzen, wenn sie online bezahlen, die Entwicklung und Nutzung innovativer Online- und mobiler Zahlungen zu f\u00f6rdern und grenz\u00fcberschreitende europ\u00e4ische Zahlungsdienste sicherer zu machen<\/em>.\u201c Im Klartext bedeutet dies, dass \u201e<em>ein einheitlicher, offener und sicherer europ\u00e4ischer technischer Standard f\u00fcr QR-Codes [that] entwickelt und umgesetzt werden soll, der die Akzeptanz und Interoperabilit\u00e4t von Sofortzahlungen f\u00f6rdern w\u00fcrde<\/em>.\u201c Die endg\u00fcltige Frist f\u00fcr die Umsetzung: 14. September 2019 (inoffiziell \u201ewegen der Pandemie\u201c verl\u00e4ngert).<\/p>\n<p>F\u00fcr praktisch alle B2C-Unternehmen bedeutet dies, dass sie auf allen Rechnungen standardisierte Sicherheitsmerkmale (z. B. QR-Codes) anbringen m\u00fcssen. Dar\u00fcber hinaus bedeutet dies, dass die Zahlungssoftware aktualisiert werden muss, um den gesetzlichen Anforderungen gerecht zu werden und ein schlankeres Reporting zu erstellen, das den internen Anforderungen entspricht. Aber manche (sehr) alte Software l\u00e4sst sich nicht einfach aktualisieren, und man muss wieder ganz von vorne anfangen.<\/p>\n<p><strong>F\u00fcr einen Kunden aus dem Einzelhandelssektor haben wir ein ma\u00dfgeschneidertes Reporting-Tool entwickelt<\/strong>, das:<\/p>\n<ul>\n<li><strong>gesetzeskonform<\/strong> ist: Es enth\u00e4lt alle Sicherheitselemente, die in der EU-Richtlinie 2015\/2366 gefordert werden; und<\/li>\n<li><strong>programmatisch<\/strong> ist: Es definiert die Struktur aller ben\u00f6tigten Berichte, erstellt ihre Vorlagen und f\u00fcllt sie dann automatisch aus, sobald ein Bericht ben\u00f6tigt wird.<\/li>\n<\/ul>\n[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row use_custom_gutter=&#8220;on&#8220; _builder_version=&#8220;4.7.7&#8243; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;6vh||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220;][et_pb_column type=&#8220;4_4&#8243; _builder_version=&#8220;4.4.1&#8243;][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;2em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||10px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h2 id=\"why_build_your_own_reports\">Warum eigene Reports erstellen, wenn es auch fertige Reportgeneratoren gibt?<\/h2>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Zun\u00e4chst einmal braucht man Zeit, um den Umgang mit einem Reportgenerator und vor allem die Kommunikation mit dessen APIs zu erlernen. Daraus ergibt sich ein hoher Installationsaufwand (und m\u00f6glicherweise aufwendiges Warten zwischendurch).<\/p>\n<p>Au\u00dferdem fallen die Kosten f\u00fcr einen wirklich guten, leistungsstarken Reportgenerator kaum h\u00f6her aus als die Kosten f\u00fcr ein benutzerdefiniertes Reporting-Tool.<\/p>\n<p>Wenn Sie Ihr eigenes Tool entwickeln, k\u00f6nnen Sie sich auf Ihre spezifischen Anforderungen konzentrieren, ohne den Aufwand mit einer Komplettl\u00f6sung von der Stange zu haben. Dies f\u00fchrt zu h\u00f6herer Flexibilit\u00e4t (bei Design, Datenquellen usw.) und unvergleichlicher Leistungsf\u00e4higkeit.<\/p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row use_custom_gutter=&#8220;on&#8220; _builder_version=&#8220;4.7.7&#8243; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;6vh||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220;][et_pb_column type=&#8220;4_4&#8243; _builder_version=&#8220;4.4.1&#8243;][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;2em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||10px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h2 id=\"our_reporting_solution\">Unsere L\u00f6sung<\/h2>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>F\u00fcr den betreffenden Kunden hatten wir bereits ein Cashbox-Modul als ersten Teil eines gr\u00f6\u00dferen ERP-Systems entwickelt. Die Reporting-Funktionen waren eine nat\u00fcrliche Erweiterung in Form eines zus\u00e4tzlichen Microservices, der auch von anderen Modulen genutzt werden konnte.<\/p>\n<p>F\u00fcr jeden ben\u00f6tigten Report haben wir einen dreistufigen Prozess entwickelt:<\/p>\n<ul>\n<li>Erstellung einer statischen HTML-Vorlage<\/li>\n<li>Einf\u00fcgen dynamischer Daten<\/li>\n<li>Konvertierung des HTML in .pdf<\/li>\n<\/ul>[\/et_pb_text][et_pb_gallery gallery_ids=&#8220;8062&#8243; fullwidth=&#8220;on&#8220; hover_icon=&#8220;%%186%%&#8220; _builder_version=&#8220;4.7.7&#8243; _module_preset=&#8220;default&#8220; max_width=&#8220;45%&#8220; module_alignment=&#8220;left&#8220; max_height=&#8220;45%&#8220; custom_padding=&#8220;||35px||false|false&#8220;][\/et_pb_gallery][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Zun\u00e4chst haben wir die Layouts mit HTML definiert, da dies die g\u00e4ngigste Sprache f\u00fcr die Beschreibung von Layouts ist. F\u00fcr jeden Reporttyp ben\u00f6tigten wir drei HTML-Dateien: einen Hauptteil, eine Kopfzeile und eine Fu\u00dfzeile. (Der Grund daf\u00fcr ist, dass die verschiedenen Reports des Kunden alle unterschiedliche Kopfzeilen, Textk\u00f6rper und Fu\u00dfzeilen ben\u00f6tigten.) Wir konnten die Report-Modelle leicht allein in HTML erstellen und \u00e4ndern, um bereits in der Anfangsphase n\u00fctzliches Feedback vom Kunden einzuholen.<\/p>\n<p>Nachdem wir das Layout definiert hatten, bestand der n\u00e4chste Schritt darin, die dynamischen Daten einzuf\u00fcgen. Wir verwendeten eine heterogene Datenquelle (SQL-Tabellen, json-Dateien und In-Memory-Daten). Als die Daten zur Verf\u00fcgung standen, haben wir Razor als Template-Engine verwendet, um die Daten in HTML einzubinden.<\/p>\n<p>Um Razor in unsere Software zu integrieren, haben wir das NuGet-Paket verwendet und RazorEngine 3.10.0 installiert. Unten sehen Sie ein Beispiel daf\u00fcr, wie Razor in einer HTML-Datei verwendet wird. In diesem Beispiel erstellt der Code eine Artikeltabelle mit drei Spalten, der Position des Artikels, dem Code des Artikels und dem Preis.<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family: monospace;\">&lt;table&gt;\n    @foreach(var article in @Model.Items){\n    &lt;tr&gt;\n        &lt;td&gt;\n            &lt;span&gt; @article.Position&lt;\/span&gt;\n            &lt;span&gt; @article.Code&lt;\/span&gt;\n        &lt;\/td&gt;\n        &lt;td&gt;\n            &lt;span&gt; @article.Price \u20ac&lt;\/span&gt;\n        &lt;\/td&gt;\n    &lt;\/tr&gt;\n    }\n&lt;\/table&gt;<\/pre>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>@Model stellt die Wurzel des Modells dar, in der Razor die Daten sucht. Im Code weisen wir Razor an, das angepasste ReportModel, C#-Objekt als @Model zu verwenden.<\/p>\n<p>Wir nennen die Razor-Methode RunCompile mit den folgenden Parametern:<\/p>\n<ul>\n<li>Inhalt der HTML-Vorlage als String<\/li>\n<li>Template-Identifikator zur Unterscheidung eines Template-Typs von einem anderen<\/li>\n<li>Typ des Datenmodells<\/li>\n<li>Instanz des Datenmodells<\/li>\n<\/ul>\n<p>Diese Methode liefert den HTML-String mit den eingespeisten Daten als endg\u00fcltiges HTML-Ergebnis.<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">    var result = Engine.Razor.RunCompile(File.ReadAllText(htmlPath), templateIdentifier,typeof(ReportModel), reportModel);<\/pre>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]ReportModel sieht wie folgt aus:[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">public class ReportModel\n{\n&nbsp;\n    public List&lt;Item&gt; Items {get; set;}\n}\n&nbsp;\npublic class Item\n{\n    public int Position {get; set;}\n    public double Price {get; set;}\n    public string Code {get; set;}\n}<\/pre>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Das Ergebnis dieser Arbeitsschritte ist eine vollst\u00e4ndige HTML-Datei, die im letzten Schritt in einen PDF-Report umgewandelt wird.<\/p>\n<p>Die Umwandlung von HTML in PDF mag wie ein einfacher Vorgang klingen, und das Internet bietet eine Menge kostenloser Tools, die genau das tun. Aber ein Report ist nicht einfach nur eine PDF-Datei, sondern viel mehr als das. Er verf\u00fcgt \u00fcber Funktionen wie das Hinzuf\u00fcgen von Kopf- und Fu\u00dfzeilen, Paginierung und Druckunterst\u00fctzung.<\/p>\n<p>Also fingen wir an, kommerzielle HTML-zu-PDF-Bibliotheken zu evaluieren, die unsere Anforderungen an professionelle Reports erf\u00fcllen k\u00f6nnten. Wir probierten IronPDF, Spire.PDF und <a href=\"https:\/\/www.evopdf.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">EVO PDF<\/a> aus, die allesamt ein vergleichbares Preisniveau haben (etwa 500 \u20ac\/Instance).<\/p>\n<p>Schlie\u00dflich entschieden wir uns f\u00fcr EVO PDF, weil (A) die generierte .pdf-Datei wie gew\u00fcnscht aussah, mit integrierter Kopf- und Fu\u00dfzeile (auch beim Drucken), und (B) die Dokumentation auf dem neuesten Stand und einfach zu bedienen war (<strong>sehr<\/strong> wichtig). Ein weiterer Pluspunkt: Man muss EVO PDF in der Entwicklungsphase nicht kaufen, da es eine voll funktionsf\u00e4hige kostenlose Version gibt, die lediglich ein rotes Wasserzeichen in den Report einf\u00fcgt.<\/p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row use_custom_gutter=&#8220;on&#8220; _builder_version=&#8220;4.7.7&#8243; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;6vh||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220;][et_pb_column type=&#8220;4_4&#8243; _builder_version=&#8220;4.4.1&#8243;][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;2em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||10px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h2 id=\"how_to_use_evo_pdf\">So verwenden Sie EVO PDF <\/h2>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Zun\u00e4chst mussten wir EVO PDF als NuGet-Paket in unser Projekt integrieren. EVO PDF bietet \u00fcbrigens Installationsoptionen f\u00fcr mehrere Plattformen wie .NET, .NET CORE, Java und andere.<\/p>\n<p>Einmal installiert, ist die Verwendung des Pakets einfach und <a href=\"https:\/\/www.evopdf.com\/html-to-pdf-converter.aspx\" target=\"_blank\" rel=\"noopener noreferrer\">gut dokumentiert<\/a>.<\/p>\n<p>Hier ist ein Beispielcode aus unserer Implementierung:<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">    var htmlToPdfConverter = new HtmlToPdfConverter(); \n\/\/ next 5 settings are to optimize the size of the pdf file\n    htmlToPdfConverter.ConversionDelay = 0;\n    htmlToPdfConverter.PdfDocumentOptions.EmbedFonts = true;\n    htmlToPdfConverter.PdfDocumentOptions.CompressCrossReference = true;\n    htmlToPdfConverter.PdfDocumentOptions.PdfCompressionLevel = PdfCompressionLevel.Best;\n    htmlToPdfConverter.PdfDocumentOptions.ImagesScalingEnabled = true;\n&nbsp;\n\/\/ Razor method is the same that we explained above\n\/\/ injecting dynamic data in header \n    var headerPathAfterRazor = _razorService.Razor(headerPath, templatesDirectoryPath, reportModel); \n\/\/ injecting dynamic data in footer\n    var footerPathAfterRazor = _razorService.Razor(footerPath,\n&nbsp;\n    var headerHtml = new HtmlToPdfElement(headerPathAfterRazor);\n    var footerHtml = new HtmlToPdfElement(footerPathAfterRazor);\n    htmlToPdfConverter.PdfDocumentOptions.ShowHeader = true;\n    htmlToPdfConverter.PdfDocumentOptions.ShowFooter = true;\n&nbsp;\n\/\/ setting the desired height for header \/ footer\n    htmlToPdfConverter.PdfHeaderOptions.HeaderHeight = 100;  \n    htmlToPdfConverter.PdfFooterOptions.FooterHeight = 110;\n    headerHtml.FitHeight = true;\n    footerHtml.FitHeight = true;\n\/\/ adding the header and the footer to the pdf report\n    htmlToPdfConverter.PdfHeaderOptions.AddElement(headerHtml);  \n    htmlToPdfConverter.PdfHeaderOptions.AddElement(footerHtml);  \n&nbsp;\n\/\/ injecting dynamic data in body \n    var bodyPathAfterRazor = _razorService.RazorbodyPath,                templatesDirectoryPath, reportModel);      \n\/\/ converting html to pdf\n  var pdfAsBytes = htmlToPdfConverter.ConvertUrl(bodyPathAfterRazor);\n&nbsp;<\/pre>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]Nach der Erstellung des PDF-Dokuments war der Standard-Windows-Befehl f\u00fcr die Druckfunktion zuverl\u00e4ssig und entsprach gut genug unseren Anforderungen.[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">print \/d: C:\\inetpub\\reportsservice\\myReport.pdf <\/pre>[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row use_custom_gutter=&#8220;on&#8220; _builder_version=&#8220;4.7.7&#8243; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;6vh||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220;][et_pb_column type=&#8220;4_4&#8243; _builder_version=&#8220;4.4.1&#8243;][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;2em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||10px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h2 id=\"encountered_problems\">Aufgetretene Probleme<\/h2>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||35px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Reports k\u00f6nnen schnell sehr gro\u00df werden, selbst bei einfachen Seiten. Die Gr\u00f6\u00dfe kann Hunderte von Kilobytes erreichen, vor allem wenn gro\u00dfe Bilder oder spezielle Schriftarten verwendet werden.<\/p>\n<p>Au\u00dferdem kann es einige Zeit dauern, bis Razor eine Vorlage zum ersten Mal generiert hat. Deshalb ist es besser, die Vorlage im Voraus zu erstellen und nicht w\u00e4hrend der Entstehung des eigentlichen Reports. In dieser Phase ist das Report-Modell leer, da es hier keine Rolle spielt. Nach der Erstellung der Vorlage wird die n\u00e4chste Erstellung der gleichen Vorlage automatisch erfolgen.<\/p>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;|300|||||||&#8220; text_font_size=&#8220;1em&#8220; text_line_height=&#8220;1.3em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;1em&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; background_color=&#8220;#f8f8f8&#8243; custom_margin=&#8220;||35px|20px|false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220; border_style_left=&#8220;none&#8220; locked=&#8220;off&#8220;]<pre class=\"text\" style=\"font-family:monospace;\">    var result = Engine.Razor.RunCompile(File.ReadAllText(htmlPath), templateIdentifier,typeof(ReportModel), dummyReportModel);<\/pre>[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row use_custom_gutter=&#8220;on&#8220; _builder_version=&#8220;4.7.7&#8243; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;6vh||0px||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220;][et_pb_column type=&#8220;4_4&#8243; _builder_version=&#8220;4.4.1&#8243;][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;2em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||10px||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<h2>Fazit<\/h2>[\/et_pb_text][et_pb_text _builder_version=&#8220;4.7.7&#8243; text_font=&#8220;||||||||&#8220; text_font_size=&#8220;1.1em&#8220; text_line_height=&#8220;1.6em&#8220; quote_font=&#8220;|700|||||||&#8220; quote_text_align=&#8220;left&#8220; quote_font_size=&#8220;16px&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;1.5em&#8220; header_2_line_height=&#8220;0.9em&#8220; header_3_font_size=&#8220;23px&#8220; header_4_font=&#8220;||||||||&#8220; header_4_font_size=&#8220;16px&#8220; header_4_line_height=&#8220;1.5em&#8220; header_5_font_size=&#8220;14px&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;||||false|false&#8220; border_color_left=&#8220;#ff6317&#8243;]<p>Bei einer ma\u00dfgeschneiderten L\u00f6sung sind Reporting-Tools nicht mehr nur notwendiges \u00dcbel, denn sie<\/p>\n<ul>\n<li>passen sich an den spezifischen Kontext und die Bed\u00fcrfnisse der Kunden an<\/li>\n<li>sind relativ einfach zu entwickeln und zu implementieren<\/li>\n<li>k\u00f6nnen sehr flexibel auf \u00c4nderungen der Vorschriften und\/oder der Kundenspezifika reagieren.<\/li>\n<\/ul>\n<p>\u2014<br> Wenn Sie weitere Informationen oder Anregungen f\u00fcr die Entwicklung Ihrer eigenen Reporting-Tools erhalten m\u00f6chten, <a href=\"mailto:contact@bergsoftprod.wpengine.com\">wenden Sie sich bitte an uns<\/a>.<\/p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=&#8220;1&#8243; _builder_version=&#8220;4.4.1&#8243; custom_padding=&#8220;|||0px||&#8220; locked=&#8220;off&#8220;][et_pb_row use_custom_gutter=&#8220;on&#8220; gutter_width=&#8220;3&#8243; admin_label=&#8220;\uff3f&#8220; _builder_version=&#8220;4.4.6&#8243; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;4vh||8vh||false|false&#8220; border_color_left=&#8220;rgba(0,0,0,0)&#8220;][et_pb_column type=&#8220;4_4&#8243; _builder_version=&#8220;4.4.6&#8243;][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=&#8220;1&#8243; _builder_version=&#8220;3.22&#8243; background_color=&#8220;#eeeeee&#8220; custom_padding=&#8220;50px||50px||false|false&#8220; border_color_top=&#8220;#ff6317&#8243; global_module=&#8220;1642&#8243;][et_pb_row column_structure=&#8220;1_3,1_3,1_3&#8243; _builder_version=&#8220;4.4.1&#8243; custom_padding=&#8220;0px|||||&#8220; locked=&#8220;off&#8220;][et_pb_column type=&#8220;1_3&#8243; _builder_version=&#8220;4.4.1&#8243;][et_pb_social_media_follow _builder_version=&#8220;4.4.4&#8243; text_orientation=&#8220;left&#8220;][et_pb_social_media_follow_network social_network=&#8220;linkedin&#8220; url=&#8220;https:\/\/www.linkedin.com\/company\/berg-computers-srl\/&#8220; _builder_version=&#8220;4.4.4&#8243; background_color=&#8220;#007bb6&#8243; follow_button=&#8220;off&#8220; url_new_window=&#8220;on&#8220;]linkedin[\/et_pb_social_media_follow_network] [et_pb_social_media_follow_network social_network=&#8220;twitter&#8220; url=&#8220;https:\/\/twitter.com\/berg_software&#8220; _builder_version=&#8220;4.4.4&#8243; background_color=&#8220;#00aced&#8220; follow_button=&#8220;off&#8220; url_new_window=&#8220;on&#8220;]twitter[\/et_pb_social_media_follow_network] [et_pb_social_media_follow_network social_network=&#8220;facebook&#8220; url=&#8220;https:\/\/www.facebook.com\/bergCOMPUTERS&#8220; _builder_version=&#8220;4.4.4&#8243; background_color=&#8220;#3b5998&#8243; follow_button=&#8220;off&#8220; url_new_window=&#8220;on&#8220;]facebook[\/et_pb_social_media_follow_network] [et_pb_social_media_follow_network social_network=&#8220;instagram&#8220; url=&#8220;https:\/\/www.instagram.com\/berg_software\/&#8220; _builder_version=&#8220;4.4.4&#8243; background_color=&#8220;#ea2c59&#8243; follow_button=&#8220;off&#8220; url_new_window=&#8220;on&#8220;]instagram[\/et_pb_social_media_follow_network][\/et_pb_social_media_follow][\/et_pb_column][et_pb_column type=&#8220;1_3&#8243; _builder_version=&#8220;4.4.1&#8243;][et_pb_post_nav in_same_term=&#8220;on&#8220; show_next=&#8220;off&#8220; _builder_version=&#8220;4.4.1&#8243; title_text_color=&#8220;#ff6317&#8243; custom_padding=&#8220;|25px|||false|false&#8220;][\/et_pb_post_nav][\/et_pb_column][et_pb_column type=&#8220;1_3&#8243; _builder_version=&#8220;4.4.1&#8243;][et_pb_post_nav in_same_term=&#8220;on&#8220; show_prev=&#8220;off&#8220; _builder_version=&#8220;4.4.1&#8243; title_text_color=&#8220;#ff6317&#8243; custom_padding=&#8220;|||25px|false|false&#8220;][\/et_pb_post_nav][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=&#8220;1&#8243; admin_label=&#8220;CONTACT&#8220; _builder_version=&#8220;4.4.1&#8243; background_color=&#8220;#d2d2d2&#8243; custom_padding=&#8220;75px||75px||false|false&#8220; global_module=&#8220;1544&#8243;][et_pb_row column_structure=&#8220;1_4,3_4&#8243; admin_label=&#8220;Service Section Title&#8220; _builder_version=&#8220;4.4.1&#8243; custom_padding=&#8220;||25px||false|false&#8220; animation_direction=&#8220;top&#8220; locked=&#8220;off&#8220;][et_pb_column type=&#8220;1_4&#8243; _builder_version=&#8220;3.25&#8243; custom_padding=&#8220;|||&#8220; custom_padding__hover=&#8220;|||&#8220;][\/et_pb_column][et_pb_column type=&#8220;3_4&#8243; _builder_version=&#8220;3.25&#8243; custom_padding=&#8220;|||&#8220; custom_padding__hover=&#8220;|||&#8220;][et_pb_text _builder_version=&#8220;4.4.1&#8243; text_font=&#8220;|300|||||||&#8220; text_text_color=&#8220;#ffffff&#8220; text_line_height=&#8220;1.1em&#8220; header_5_font=&#8220;|600|||||||&#8220; header_5_text_color=&#8220;#ffffff&#8220; header_5_font_size=&#8220;14px&#8220; header_5_line_height=&#8220;1.5em&#8220; custom_margin=&#8220;||||false|false&#8220;]29 Jahre im Gesch\u00e4ft | 2700 Software-Projekte | 760 Kunden | 24 L\u00e4nder<\/p>\n<h5>Wir verwandeln Ideen in Software. Wie lautet Ihre Idee?<\/h5>[\/et_pb_text][et_pb_text admin_label=&#8220;Title&#8220; _builder_version=&#8220;4.4.6&#8243; header_text_align=&#8220;center&#8220; header_2_font=&#8220;|300|||||||&#8220; header_2_text_align=&#8220;left&#8220; header_2_text_color=&#8220;#ff6317&#8243; header_2_font_size=&#8220;50px&#8220; header_2_line_height=&#8220;0.9em&#8220; custom_margin=&#8220;||||false|false&#8220; custom_padding=&#8220;25px||25px||false|false&#8220;]<h2 id=\"Getintouch\">Kontakt aufnehmen<\/h2>[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8220;1_4,3_4&#8243; _builder_version=&#8220;4.4.4&#8243;][et_pb_column type=&#8220;1_4&#8243; _builder_version=&#8220;4.4.4&#8243;][\/et_pb_column][et_pb_column type=&#8220;3_4&#8243; _builder_version=&#8220;4.4.4&#8243;][et_pb_contact_form email=&#8220;contact@bergsoftprod.wpengine.com&#8220; custom_message=&#8220;WEBFORM MESSAGE||et_pb_line_break_holder||\uff3f||et_pb_line_break_holder||FROM: %%Name%%||et_pb_line_break_holder||EMAIL: %%Email%%||et_pb_line_break_holder||PHONE NUMBER: %%Phone_number%%||et_pb_line_break_holder||COMPANY: %%Company_name%%||et_pb_line_break_holder||TERMS &amp; CONDITIONS: %%Terms_and_Conditions%%||et_pb_line_break_holder||DATA PRIVACY POLICY: %%Data_Privacy_Policy%%||et_pb_line_break_holder||\uff3f||et_pb_line_break_holder||MESSAGE:||et_pb_line_break_holder||%%Message%%&#8220; success_message=&#8220;Thank you for reaching out! Your message was sent. We will get back to you right away.&#8220; _builder_version=&#8220;4.7.7&#8243; form_field_background_color=&#8220;#d2d2d2&#8243; form_field_text_color=&#8220;#ffffff&#8220; form_field_focus_background_color=&#8220;#ffffff&#8220; form_field_focus_text_color=&#8220;#000000&#8243; title_level=&#8220;h2&#8243; title_font=&#8220;|300|||||||&#8220; title_text_color=&#8220;#ff6317&#8243; title_font_size=&#8220;30px&#8220; form_field_line_height=&#8220;1.5em&#8220; custom_button=&#8220;on&#8220; button_text_size=&#8220;14px&#8220; button_text_color=&#8220;#ffffff&#8220; button_bg_color=&#8220;#ff6317&#8243; button_border_width=&#8220;0px&#8220; button_border_radius=&#8220;0px&#8220; button_icon=&#8220;%%3%%&#8220; button_on_hover=&#8220;off&#8220; border_color_all=&#8220;#ffffff&#8220; border_width_bottom=&#8220;1px&#8220;][et_pb_contact_field field_id=&#8220;Name&#8220; field_title=&#8220;Name *&#8220; fullwidth_field=&#8220;on&#8220; _builder_version=&#8220;4.4.4&#8243; form_field_background_color=&#8220;#d2d2d2&#8243; form_field_text_color=&#8220;#ffffff&#8220; form_field_focus_background_color=&#8220;#ffffff&#8220; form_field_focus_text_color=&#8220;#000000&#8243; border_width_bottom=&#8220;1px&#8220; button_text_size__hover_enabled=&#8220;off&#8220; button_one_text_size__hover_enabled=&#8220;off&#8220; button_two_text_size__hover_enabled=&#8220;off&#8220; button_text_color__hover_enabled=&#8220;off&#8220; button_one_text_color__hover_enabled=&#8220;off&#8220; button_two_text_color__hover_enabled=&#8220;off&#8220; button_border_width__hover_enabled=&#8220;off&#8220; button_one_border_width__hover_enabled=&#8220;off&#8220; button_two_border_width__hover_enabled=&#8220;off&#8220; button_border_color__hover_enabled=&#8220;off&#8220; button_one_border_color__hover_enabled=&#8220;off&#8220; button_two_border_color__hover_enabled=&#8220;off&#8220; button_border_radius__hover_enabled=&#8220;off&#8220; button_one_border_radius__hover_enabled=&#8220;off&#8220; button_two_border_radius__hover_enabled=&#8220;off&#8220; button_letter_spacing__hover_enabled=&#8220;off&#8220; button_one_letter_spacing__hover_enabled=&#8220;off&#8220; button_two_letter_spacing__hover_enabled=&#8220;off&#8220; button_bg_color__hover_enabled=&#8220;off&#8220; button_one_bg_color__hover_enabled=&#8220;off&#8220; button_two_bg_color__hover_enabled=&#8220;off&#8220;][\/et_pb_contact_field][et_pb_contact_field field_id=&#8220;Email&#8220; field_title=&#8220;E-Mail-Adresse *&#8220; field_type=&#8220;email&#8220; fullwidth_field=&#8220;on&#8220; _builder_version=&#8220;4.4.4&#8243; button_text_size__hover_enabled=&#8220;off&#8220; button_one_text_size__hover_enabled=&#8220;off&#8220; button_two_text_size__hover_enabled=&#8220;off&#8220; button_text_color__hover_enabled=&#8220;off&#8220; button_one_text_color__hover_enabled=&#8220;off&#8220; button_two_text_color__hover_enabled=&#8220;off&#8220; button_border_width__hover_enabled=&#8220;off&#8220; button_one_border_width__hover_enabled=&#8220;off&#8220; button_two_border_width__hover_enabled=&#8220;off&#8220; button_border_color__hover_enabled=&#8220;off&#8220; button_one_border_color__hover_enabled=&#8220;off&#8220; button_two_border_color__hover_enabled=&#8220;off&#8220; button_border_radius__hover_enabled=&#8220;off&#8220; button_one_border_radius__hover_enabled=&#8220;off&#8220; button_two_border_radius__hover_enabled=&#8220;off&#8220; button_letter_spacing__hover_enabled=&#8220;off&#8220; button_one_letter_spacing__hover_enabled=&#8220;off&#8220; button_two_letter_spacing__hover_enabled=&#8220;off&#8220; button_bg_color__hover_enabled=&#8220;off&#8220; button_one_bg_color__hover_enabled=&#8220;off&#8220; button_two_bg_color__hover_enabled=&#8220;off&#8220;][\/et_pb_contact_field][et_pb_contact_field field_id=&#8220;Phone_number&#8220; field_title=&#8220;Telefonnummer&#8220; required_mark=&#8220;off&#8220; fullwidth_field=&#8220;on&#8220; _builder_version=&#8220;4.4.4&#8243;][\/et_pb_contact_field][et_pb_contact_field field_id=&#8220;Company_name&#8220; field_title=&#8220;Name des Unternehmens&#8220; fullwidth_field=&#8220;on&#8220; _builder_version=&#8220;4.4.4&#8243;][\/et_pb_contact_field][et_pb_contact_field field_id=&#8220;Message&#8220; field_title=&#8220;Nachricht *&#8220; field_type=&#8220;text&#8220; fullwidth_field=&#8220;on&#8220; _builder_version=&#8220;4.4.4&#8243; form_field_background_color=&#8220;#d2d2d2&#8243; form_field_focus_background_color=&#8220;#ffffff&#8220; form_field_focus_text_color=&#8220;#000000&#8243; border_width_bottom=&#8220;1px&#8220; button_text_size__hover_enabled=&#8220;off&#8220; button_one_text_size__hover_enabled=&#8220;off&#8220; button_two_text_size__hover_enabled=&#8220;off&#8220; button_text_color__hover_enabled=&#8220;off&#8220; button_one_text_color__hover_enabled=&#8220;off&#8220; button_two_text_color__hover_enabled=&#8220;off&#8220; button_border_width__hover_enabled=&#8220;off&#8220; button_one_border_width__hover_enabled=&#8220;off&#8220; button_two_border_width__hover_enabled=&#8220;off&#8220; button_border_color__hover_enabled=&#8220;off&#8220; button_one_border_color__hover_enabled=&#8220;off&#8220; button_two_border_color__hover_enabled=&#8220;off&#8220; button_border_radius__hover_enabled=&#8220;off&#8220; button_one_border_radius__hover_enabled=&#8220;off&#8220; button_two_border_radius__hover_enabled=&#8220;off&#8220; button_letter_spacing__hover_enabled=&#8220;off&#8220; button_one_letter_spacing__hover_enabled=&#8220;off&#8220; button_two_letter_spacing__hover_enabled=&#8220;off&#8220; button_bg_color__hover_enabled=&#8220;off&#8220; button_one_bg_color__hover_enabled=&#8220;off&#8220; button_two_bg_color__hover_enabled=&#8220;off&#8220;][\/et_pb_contact_field][et_pb_contact_field field_id=&#8220;Terms_and_Conditions&#8220; field_title=&#8220; &#8220; field_type=&#8220;checkbox&#8220; checkbox_options=&#8220;%91{%22value%22:%22Ich habe die AGB gelesen und akzeptiert%22,%22checked%22:0,%22dragID%22:-1}%93&#8243; fullwidth_field=&#8220;on&#8220; _builder_version=&#8220;4.4.4&#8243;][\/et_pb_contact_field][et_pb_contact_field field_id=&#8220;Data_Privacy_Policy&#8220; field_title=&#8220; &#8220; field_type=&#8220;checkbox&#8220; checkbox_options=&#8220;%91{%22value%22:%22Ich habe die Datenschutzrichtlinie gelesen und akzeptiert%22,%22checked%22:0,%22dragID%22:-1}%93&#8243; fullwidth_field=&#8220;on&#8220; _builder_version=&#8220;4.4.4&#8243;][\/et_pb_contact_field][\/et_pb_contact_form][\/et_pb_column][\/et_pb_row][\/et_pb_section]\n","protected":false},"excerpt":{"rendered":"<p>Reporting ist ein notwendiges \u00dcbel: Es wird akzeptiert bzw. muss gemacht werden, um ein besseres Ergebnis zu erzielen. Hier sehen Sie, wie wir ein benutzerdefiniertes Reporting-Tool erstellt haben, von HTML bis PDF.<\/p>\n","protected":false},"author":10,"featured_media":8055,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"on","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[79,141],"tags":[],"class_list":["post-8072","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-einblicke","category-how-to-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v16.1.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Benutzerdefiniertes Reporting-Tool von HTML zu PDF | Berg Software<\/title>\n<meta name=\"description\" content=\"Reporting ist ein notwendiges \u00dcbel: Es wird akzeptiert bzw. muss gemacht werden, um ein besseres Ergebnis zu erzielen. Hier sehen Sie, wie wir ein benutzerdefiniertes Reporting-Tool erstellt haben, von HTML bis PDF.\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.berg-software.com\/de\/benutzerdefiniertes-reporting-tool-von-html-zu-pdf\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Benutzerdefiniertes Reporting-Tool von HTML zu PDF | Berg Software\" \/>\n<meta property=\"og:description\" content=\"Reporting ist ein notwendiges \u00dcbel: Es wird akzeptiert bzw. muss gemacht werden, um ein besseres Ergebnis zu erzielen. Hier sehen Sie, wie wir ein benutzerdefiniertes Reporting-Tool erstellt haben, von HTML bis PDF.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.berg-software.com\/de\/benutzerdefiniertes-reporting-tool-von-html-zu-pdf\/\" \/>\n<meta property=\"og:site_name\" content=\"Berg Software\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/bergCOMPUTERS\/\" \/>\n<meta property=\"article:published_time\" content=\"2021-09-29T05:12:44+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-09-29T05:14:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.berg-software.com\/wp-content\/uploads\/Alternate-reporting-tools-from-HTML-to-PDF.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"600\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@berg_software\" \/>\n<meta name=\"twitter:site\" content=\"@berg_software\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\">\n\t<meta name=\"twitter:data1\" content=\"10 Minuten\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.berg-software.com\/de\/#organization\",\"name\":\"Berg Software\",\"url\":\"https:\/\/www.berg-software.com\/de\/\",\"sameAs\":[\"https:\/\/www.facebook.com\/bergCOMPUTERS\/\",\"https:\/\/www.instagram.com\/berg_software\/\",\"https:\/\/www.linkedin.com\/company\/berg-computers-srl\/\",\"https:\/\/www.youtube.com\/channel\/UCw1FfcRJnC-CoKPwlcM10Iw\",\"https:\/\/twitter.com\/berg_software\"],\"logo\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/www.berg-software.com\/de\/#logo\",\"inLanguage\":\"de-DE\",\"url\":\"https:\/\/berg-software.com\/wp-content\/uploads\/berg-software-logo.png\",\"contentUrl\":\"https:\/\/berg-software.com\/wp-content\/uploads\/berg-software-logo.png\",\"width\":512,\"height\":512,\"caption\":\"Berg Software\"},\"image\":{\"@id\":\"https:\/\/www.berg-software.com\/de\/#logo\"}},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.berg-software.com\/de\/#website\",\"url\":\"https:\/\/www.berg-software.com\/de\/\",\"name\":\"Berg Software\",\"description\":\"We turn ideas into software.\",\"publisher\":{\"@id\":\"https:\/\/www.berg-software.com\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/www.berg-software.com\/de\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de-DE\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/www.berg-software.com\/de\/benutzerdefiniertes-reporting-tool-von-html-zu-pdf\/#primaryimage\",\"inLanguage\":\"de-DE\",\"url\":\"https:\/\/www.berg-software.com\/wp-content\/uploads\/Alternate-reporting-tools-from-HTML-to-PDF.jpg\",\"contentUrl\":\"https:\/\/www.berg-software.com\/wp-content\/uploads\/Alternate-reporting-tools-from-HTML-to-PDF.jpg\",\"width\":1200,\"height\":600,\"caption\":\"Alternative Berichtswerkzeuge von HTML zu PDF\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.berg-software.com\/de\/benutzerdefiniertes-reporting-tool-von-html-zu-pdf\/#webpage\",\"url\":\"https:\/\/www.berg-software.com\/de\/benutzerdefiniertes-reporting-tool-von-html-zu-pdf\/\",\"name\":\"Benutzerdefiniertes Reporting-Tool von HTML zu PDF | Berg Software\",\"isPartOf\":{\"@id\":\"https:\/\/www.berg-software.com\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.berg-software.com\/de\/benutzerdefiniertes-reporting-tool-von-html-zu-pdf\/#primaryimage\"},\"datePublished\":\"2021-09-29T05:12:44+00:00\",\"dateModified\":\"2021-09-29T05:14:23+00:00\",\"description\":\"Reporting ist ein notwendiges \\u00dcbel: Es wird akzeptiert bzw. muss gemacht werden, um ein besseres Ergebnis zu erzielen. Hier sehen Sie, wie wir ein benutzerdefiniertes Reporting-Tool erstellt haben, von HTML bis PDF.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.berg-software.com\/de\/benutzerdefiniertes-reporting-tool-von-html-zu-pdf\/#breadcrumb\"},\"inLanguage\":\"de-DE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.berg-software.com\/de\/benutzerdefiniertes-reporting-tool-von-html-zu-pdf\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.berg-software.com\/de\/benutzerdefiniertes-reporting-tool-von-html-zu-pdf\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.berg-software.com\/de\/\",\"url\":\"https:\/\/www.berg-software.com\/de\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.berg-software.com\/de\/category\/einblicke\/\",\"url\":\"https:\/\/www.berg-software.com\/de\/category\/einblicke\/\",\"name\":\"Einblicke\"}},{\"@type\":\"ListItem\",\"position\":3,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.berg-software.com\/de\/benutzerdefiniertes-reporting-tool-von-html-zu-pdf\/\",\"url\":\"https:\/\/www.berg-software.com\/de\/benutzerdefiniertes-reporting-tool-von-html-zu-pdf\/\",\"name\":\"Benutzerdefiniertes Reporting-Tool von HTML zu PDF: flexibel, einfach und gesetzeskonform\"}}]},{\"@type\":\"Article\",\"@id\":\"https:\/\/www.berg-software.com\/de\/benutzerdefiniertes-reporting-tool-von-html-zu-pdf\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.berg-software.com\/de\/benutzerdefiniertes-reporting-tool-von-html-zu-pdf\/#webpage\"},\"author\":{\"@id\":\"https:\/\/www.berg-software.com\/de\/#\/schema\/person\/c30f728cd36ad12eb903071b34eee31f\"},\"headline\":\"Benutzerdefiniertes Reporting-Tool von HTML zu PDF: flexibel, einfach und gesetzeskonform\",\"datePublished\":\"2021-09-29T05:12:44+00:00\",\"dateModified\":\"2021-09-29T05:14:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.berg-software.com\/de\/benutzerdefiniertes-reporting-tool-von-html-zu-pdf\/#webpage\"},\"publisher\":{\"@id\":\"https:\/\/www.berg-software.com\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.berg-software.com\/de\/benutzerdefiniertes-reporting-tool-von-html-zu-pdf\/#primaryimage\"},\"articleSection\":\"Einblicke,How to\",\"inLanguage\":\"de-DE\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.berg-software.com\/de\/#\/schema\/person\/c30f728cd36ad12eb903071b34eee31f\",\"name\":\"Mirela Berzescu\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","_links":{"self":[{"href":"https:\/\/www.berg-software.com\/de\/wp-json\/wp\/v2\/posts\/8072","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.berg-software.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.berg-software.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.berg-software.com\/de\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.berg-software.com\/de\/wp-json\/wp\/v2\/comments?post=8072"}],"version-history":[{"count":0,"href":"https:\/\/www.berg-software.com\/de\/wp-json\/wp\/v2\/posts\/8072\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.berg-software.com\/de\/wp-json\/wp\/v2\/media\/8055"}],"wp:attachment":[{"href":"https:\/\/www.berg-software.com\/de\/wp-json\/wp\/v2\/media?parent=8072"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.berg-software.com\/de\/wp-json\/wp\/v2\/categories?post=8072"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.berg-software.com\/de\/wp-json\/wp\/v2\/tags?post=8072"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}