Wie lege ich eine neue Druckvorlage an?

Ein PrintTemplate ist immer gleich aufgebaut und besteht aus folgenden Dateien:

1. HTML File
2. CSS File
3. Print Klasse 
4. PrintRegelsatz (optional)

Das HTML File enthält dabei die Basis. Das File sollte einen eindeutigen Namen haben und muss sich im Ordner DruckTemplates befinden. Das Template spezifische CSS sollte im Ordner DruckTemplates/CSS liegen uns sollte genau gleich heißen wie das HTML File. 
Wichtig bei den beiden Files ist, dass über das Eigenschaft-Menü die Option ins Ausgabe Verzeichnis auf "Immer" gesetzt wird, da ansonsten die Dateien beim kompilieren nicht ins Ausgabeverzeichnis kopiert werden.

Das Custom CSS File sollte nach den Basis CSS Dateien eingebunden werden.
<link rel="stylesheet" href="CSS/bootstrap.min.css" />
<link rel="stylesheet" href="CSS/Allgemein.css" />

In Allgemein.css wird ein Template auf Briefpapier Norm angepasst. Es enthält zudem das notwendige CSS für die Darstellung der Adresszeilen.

Die Klasse des PrintTemplates sollte immer das Präfix Print voranstehen. Der Aufbau hierbei ist immer identisch. 

Wichtig bei den Klassen ist nur, dass es keinen public Konstruktor gibt. Alle Printtemplates werden über das Factory-Pattern generiert: Mittels der Funktion CreateAsync.
Im private Konstruktor wird das HTML File auf der Variable _layoutFile festgelegt. Hier kann dann z.B. auch zwischen verschiedenen Sprachen unterschieden werden falls notwendig.

Am einfachsten kopiert man sich eine leichtes DruckTemplate und benennt dann alles entsprechend um.

Die HTML Files beinhalten Platzhalter. Diese sind zu erkennbar an den doppelten geschweiften Klammern, z.B.: {{ HIER_EIN_NAME }}
Platzhalter werden in SetTemplateVariables() durch den korrekten Inhalt ersetzt.

Ein Standardaufruf der InitializeAsync Method könnte z.B. so aussehen:

string layoutPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, LAYOUT_PATH, _layoutFile);
_template = await File.ReadAllTextAsync(layoutPath); // Liest den Inhalt des HTML Files in _template
SetRegeln(); // Setzt alle Regeln, nicht von außen reingegeben werden
_template = await SetTemplateVariables(); // Ersetzt die Platzhalter 


Zu Debugzwecken gibt es in den PrintTemplates noch eine Kompilerdirektive #define CREATE_PREVIEW_HTML

Diese sorgt in Print(); dafür, dass neben der PDF Datei auch noch das Vollständige HTML geschrieben wird (Also das Template mit den ersetzen Content). Kopiert man nun den DruckTemplates Ordner in das Ausgabeverzeichnis, kann man so schnell und leicht das Template anpassen und Änderungen prüfen, ohne jedes mal eine neue PDF generieren zu müssen.


Wichtige Besonderheiten bei der PDF Generierung:
- strong und b Tags funktionieren nicht. Die einzige Möglichkeit text Fett darzustellen ist per CSS Klasse die das Attribut font-weight festlegt. Diese Regel bezieht sich ggf. auch auf andere HTML Shortformen z.B. Italic oder Unterstrichen.
- CSS wird nur sehr rudimentär unterstützt. Manche Dinge lassen sich nur als inline Style darstellen, z.B. Breiten in Spalten von Tabellen. Flexbox und Grid wird überhaupt nicht unterstützt. Auch Floating wird nur in besonderen Fällen unterstützt. Am besten fährt man mit Block oder Inline Elementen. Zur ausrichtung sollte Position mit Margings verwendet werden.
