Ermittlung der Gesamtseiten inkl. des Inhaltsverzeichnisses eines Projektes

Einleitung

Im Prinzip kann man bereits mit den bekannten Designer-Funktionen Page$() und TotalPages$() die Anzahl der Gesamtseiten eines Berichts vermitteln. Jedoch ist hier der Haken, dass das Inhaltsverzeichnis einen eigenen Seitenzähler besitzt und somit dessen Seiten im Hauptprojekt ignoriert werden.

Beispiel

In unserem Beispiel besteht das Inhaltsverzeichnis aus drei Seiten, das Hauptprojekt aus zehn Seiten, der Bericht ingesamt also aus 13 Seiten. In jedem Projekt verwenden wir dafür die folgende Formel:
"Seite " + Page$() + " von " + TotalPages$()

Damit erhalten wir
… für die Seiten des Inhaltsverzeichnisses die Ausgabe
Seite 1 von 3, ..., Seite 3 von 3

… und für die Seiten des Hauptprojektes die Ausgabe
Seite 1 von 10, ..., Seite 10 von 10.

Hierbei wird deutlich, dass sowohl das Inhaltsverzeichnis als auch das Hauptprojekt jeweils mit einem eigenständigen Seitenzähler arbeitet. Das Ziel ist aber eine fortlaufende und übergreifende Gesamtseitenzahl, also

…für die Seiten des Inhaltsverzeichnisses die Ausgabe
Seite 1 von 13, ..., Seite 3 von 13

…und für die Seiten des Hauptprojektes die Ausgabe
Seite 4 von 13, ..., Seite 13 von 13.

Umsetzung

Damit dieses Ziel nun umgesetzt werden kann, bedarf es Anpassungen im Quellcode der List & Label Integration.

Hinweis:
Ab List & Label Version 26 steht noch eine alternative Möglichkeit zur Verfügung. Und zwar über die neue Funktion des integrierten Mehrpassverfahrens: Mehrpassverfahren: Ein Blick in die Zukunft

Dabei ist dann keine Quellcode-Anpassung mehr notwendig - jedoch müsste man dabei auf das integrierte Inhaltsverzeichnis verzichten und dieses selbst im Hauptprojekt umsetzen.

Folgende Schritte sind bei der Quellcode-Anpassung durchzuführen

Schritt 1

Anmeldung zweier zusätzlicher Variablen, die einmal die Gesamtseitenanzahl des gesamten Berichts (SeitenGesamt) und einmal die Gesamtseitenanzahl des Inhaltsverzeichnisses (SeitenInhaltsverzeichnis) enthalten.

Schritt 2

Export des vollständigen Berichts (inklusive Inhaltsverzeichnis) in eine temporäre Vorschaudatei (*.ll).

Schritt 3

Ermitteln der Gesamtseitenanzahl des Inhaltsverzeichnisses aus der temporären Vorschaudatei und Anmeldung als Variable SeitenInhaltsverzeichnis.

Schritt 4

Ermitteln der Gesamtseitenanzahl des gesamten Berichts aus der temporären Vorschaudatei und Anmeldung als Variable SeitenGesamt.

Schritt 5

Temporäre Vorschaudatei wieder löschen.

Schritt 6

Finaler Druck/Export des Projekts. Natürlich müssen dabei die neuen Variablen zuvor entsprechend im Projekt wie folgt verwendet werden:

Inhaltsverzeichnis:
"Seite " + Page$() + " von " + ToString$(SeitenGesamt)

Hauptprojekt:
"Seite " + Page$(SeitenInhaltsverzeichnis)+ " von " + ToString$(SeitenGesamt)

Index (optional):
"Seite " + Page$(SeitenInhaltsverzeichnis) + " von " + ToString$(SeitenGesamt)

Umsetzung in .NET (C#)

...
// Schritt 1: Zusätzliche Variablen anmelden
LL.Variables.Add("SeitenInhaltsverzeichnis", 0);
LL.Variables.Add("SeitenGesamt", 0);

// Schritt 2: Temporärer Export in eine Vorschaudatei (*.ll)
ExportConfiguration exportConfigTemp = new ExportConfiguration(LlExportTarget.Preview, previewFileTemp, projectFile);
LL.Export(exportConfigTemp);

// Schritt 3: Ermitteln der Gesamtseitenanzahl des Inhaltsverzeichnisses
IntPtr llFile = LlCore.LlStgsysStorageOpen(previewFileTemp, "", true, false);
int seitenAnzahlInhaltsver = LlCore.LlStgsysGetPageCount(llFile);
LL.Variables.Add("SeitenInhaltsverzeichnis", seitenAnzahlInhaltsver);
LlCore.LlStgsysStorageClose(llFile);

// Schritt 4: Ermitteln der Gesamtseitenanzahl des gesamten Berichts
llFile = LlCore.LlStgsysStorageOpen(previewFileTemp, "", true, true);
int gesamtSeitenAnzahl = LlCore.LlStgsysGetPageCount(llFile);
LL.Variables.Add("SeitenGesamt", gesamtSeitenAnzahl);
LlCore.LlStgsysStorageClose(llFile);

//Hinweis: ab der Version 27 verfügt die PreviewFile Klasse über einen Konstruktor, der
//die Übergabe der OneJobTranslation erlaubt. Diese muss in Schritt 3 false sein). Ab dann
//kann für den Code oben auch direkt mit der PreviewFile-Klasse gearbeitet werden.

// Schritt 5: Temporäre Vorschaudatei wieder löschen
File.Delete(previewFileTemp);

// Schritt 6: Finaler Druck/Export des Projekts
ExportConfiguration exportConfig = new ExportConfiguration(LlExportTarget.Pdf, exportFile, projectFile);
LL.Export(exportConfig);
...

Weiterführende Links

Details zu den verwendeten APIs finden Sie in der List & Label Programmierer-Referenz.