In diesem Repository geht es um die Generierung von PDF-Dokumenten über einen Microservice via Web API. Eine webbasierte Benutzeroberfläche wird zusätzlich zum Testen von Anfragen mit Dateneingabe mit Hilfe des _Swagger_-Tools bereitgestellt.
Grundsätzlich werden befüllte Datenmodelle über einen Webservice an einen PDFGenerator Microservice gesendet, der dafür sorgt, PDF-Dateien aus den empfangengen Datenmodellen zu erzeugen. Vom Webserver wird entweder ein Evaluationsbericht oder ein Fac Sheet je nach aufgerufenem URI generiert und das entsprechende PDF-Dokument als byte Array zurückgegeben.
Grundsätzlich werden befüllte Datenmodelle über einen Webservice an einen PDFGenerator Microservice gesendet, der dafür sorgt, PDF-Dateien aus den empfangengen Datenmodellen zu erstellen. Vom Webserver wird dann nach aufgerufenem URI das entsprechende PDF-Dokument generiert und als byte Array zurückgegeben.
Der Microservice-Server Web API widmet sich der Generierung von Pdf-Dokumenten anhand der verwendeten _iText7_-Bibliothek. _iText_ ist eine freie Programmbibliothek zur Erzeugung und Bearbeitung von PDF-Dateien mittels der Programmiersprachen _Java_ oder _C#_, deren Software unter der [GNU Affero General Public License](https://de.wikipedia.org/wiki/GNU_Affero_General_Public_License)(AGPL) vertrieben wird.
...
...
@@ -15,53 +15,25 @@ Der Microservice-Server Web API widmet sich der Generierung von Pdf-Dokumenten a
## Datenmodelle
### Datenmodell für den Evaluationsbericht
Zu den Abschnitten des Evaluationsberichts zählen das Deckblatt (_Cover_), der Vorwort (_Preface_), allgemeine Angaben zu den Studiengängen (_CourseInformationTables_), allgemeine Informationen (_CourseGeneralInformation_), Bewertung von festgelegten Zielen und KPIs (_EvaluationResults_) und der Anhang (_Appendix_). Dementsprechend besteht das Datenmodell aus den folgenden Teildatenstrukturen:
Dieses Datenmodell befindet sich unter `pdf-generator\Models\EvaluationReport.cs`.
### Datenmodell für das Fact Sheet
Zu den Bestandteilen eines Fact Sheet zählen das Deckblatt (Cover), eine Kopf- und Fußzeile (Header, Footer) sowie eine Menge von Kapiteln, in denen mehrere Reports jeweils dargestellt werden. Außerdem gibt es eine "Keine Daten vorhanden"-Meldung, welche falls zutreffend in jedem Kapitel anwendbar ist:
Zu den Bestandteilen eines PDF-Dokuments zählen je nach Datenmodell möglicherweise ein Deckblatt, ein Vorwort, eine Kopf- und/oder Fußzeile, Kapitel, Abschnitte sowie ein Anhang. Im Folgenden wird ein typisches Datenmodell-Muster angezeigt:
```csharp
publicclassFactSheet
publicclassPDFDocument
{
publicPDFHeaderFooterHeader{get;set;}
publicPDFHeaderFooterFooter{get;set;}
publicPDFCoverCover{get;set;}
publicPDFChapter[]Chapters{get;set;}
publicHeadlineNoDataAvailable{get;set;}
publicDataTypeHeader{get;set;}
publicDataTypeFooter{get;set;}
publicDataTypeCover{get;set;}
publicDataTypePreface{get;set;}
publicDataTypeChapters{get;set;}
// (...)
publicDataTypeAppendix{get;set;}
}
```
Dieses Datenmodell befindet sich unter `pdf-generator\Models\FactSheet.cs`.
## Generierung des Evaluationsberichts
Als Erstes wird in _EvaluationReportController_ ein _EvaluationReportRenderer_ mit dem EvaluationReport-Inhalt aus dem Request-Body instantiiert, der für die Erstellung des PDF-Dokuments mit dem zugehörigen Inhalt zuständig ist.
Mittels _RenderSections_ wird danach jeder einzelner Abschnitt ins Dokument geschrieben. Da das Inhaltsverzeichnis als letzter Abschnitt gerendert wird und direkt hinter dem Deckblatt liegen soll, werden die Seiten anschließend umsortiert (_MoveTocToFront_). Als Nächtes wird eine Kopfzeile fürs ganze Dokument geschrieben (_AddHeader_).
Zuletzt wird das Dokument als byte-Array zurückgegeben.
## Fact Sheet Generierung
Die Datenmodelle befinden sich unter `pdf-generator\Models`.
In _FactSheetController_ befindet sich die vom _WebClient_ aufgerufene Methode RenderFactSheet, in welcher der _FactSheetRenderer_ mit dem befüllten Fact Sheet-Datenmodell instanziiert wird, das für dein Einbau jedes Bestandteils durch die Methode _Render_ sorgt. Daraus ergibt sich ein an den Peek-Client zurückgebendes byte Array.
## Generierungsablauf
In der Methode _Render_ werden zunächst das Deckblatt (_RenderCover_), gefolgt von dem jeweiligen Kapitel (_RenderChapters_) ins Dokument geschrieben. Anschließend wird dem ganzen Dokument Kopf- und Fußzeile hinzugefügt (_RenderHeaderFooter_).
Zur Generierung des jeweiligen PDF-Dokuments liegt ein _Controller_ vor, in dem sich die vom _WebClient_ aufgerufene Methode befindet. Dabei wird ein _Renderer_ mit dem eingegebenen befüllten Datenmodell aus dem Request-Body instantiiert, anhand dessen Methode _Render()_ das PDF-Dokument erstellt werden kann. Dabei wird das Datenmodell-Objekt verwendet, durchiteriert und dadurch jeder Bestandteil ins Dokument geschrieben.
Zum Schluss wird das Dokument von einem Stream in Array umgewandelt und an den _WebClient_ zurückgesendet.
Zuletzt wird das fertige Dokument als byte-Array zurückgegeben.