Commit 1157d978 authored by Nuno Alves's avatar Nuno Alves
Browse files

Merge branch 'feature/adjust-readme-file' into 'master'

From feature/adjust-readme-file into master

See merge request datencockpit-open/pdf-generator!12
parents 9c987ff7 ea04cfa1
Pipeline #423743 canceled with stages
in 17 seconds
......@@ -2,7 +2,7 @@
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:
```csharp
public class EvaluationReport
{
public PDFCover Cover { get; set; }
public PDFPreface Preface { get; set; }
public PDFCourseInformationTables CourseInformationTables { get; set; }
public PDFCourseGeneralInformation CourseGeneralInformation { get; set; }
public PDFEvaluationResults EvaluationResults { get; set; }
public PDFAppendix Appendix { get; set; }
}
```
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
public class FactSheet
public class PDFDocument
{
public PDFHeaderFooter Header { get; set; }
public PDFHeaderFooter Footer { get; set; }
public PDFCover Cover { get; set; }
public PDFChapter[] Chapters { get; set; }
public Headline NoDataAvailable { get; set; }
public DataType Header { get; set; }
public DataType Footer { get; set; }
public DataType Cover { get; set; }
public DataType Preface { get; set; }
public DataType Chapters { get; set; }
// (...)
public DataType Appendix { 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.
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment