README.md 4.01 KB
Newer Older
1
# PDFGenerator
Julia Dürselen's avatar
Julia Dürselen committed
2

3
In diesem Repository geht es um die Generierung von PDF-Dokumenten über einen Microservice via Web API. Eine WebUi wird zusätzlich zum Testen von Anfragen mit Dateneingabe bereitgestellt.
4

5
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.
6
7

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.
8

Nuno Alves's avatar
Nuno Alves committed
9
## Einstellung
10

Nuno Alves's avatar
Nuno Alves committed
11
12
- TargetFramework: .NET Core 3.1
- PDF Library: iText7 (Version="7.1.12")
13

14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
## 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`.

34
### Datenmodell für das Fact Sheet
35

36
37
38
39
40
41
42
43
44
45
46
47
48
49
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:

```csharp
public class FactSheet
{
    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; }
}
```

Dieses Datenmodell befindet sich unter `pdf-generator\Models\FactSheet.cs`.
50

Uta Christoph's avatar
Uta Christoph committed
51
## Generierung des Evaluationsberichts
52

53
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.
54

Nuno Alves's avatar
Nuno Alves committed
55
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_).
56

57
Zuletzt wird das Dokument als byte-Array zurückgegeben.
58
59
60
61
62
63
64
65

## Fact Sheet Generierung

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.

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_).

Zum Schluss wird das Dokument von einem Stream in Array umgewandelt und an den _WebClient_ zurückgesendet.