Vorlage aus DMS-Feld holen
Dieses Skript zeigt, wie die Dokumentvorlage zur Laufzeit dynamisch gewechselt werden kann basierend auf einem DMS-Dokumentfeld in einem übergeordneten Datensatz.
Anwendungsfall
Die Vorlage für ein Dokument ist nicht fest konfiguriert, sondern wird pro Projekt/Kategorie individuell gepflegt.
Beispiel: Spendenbescheinigungen verwenden je nach Projekt eine andere Vorlage, die im Projekt-Datensatz hinterlegt ist.
Konfiguration in PRINT+PLUS
- Exporter-Typ: Dokument-Exporter (Word, Excel, Text)
- Event:
AfterLoadData(die Daten inkl. Parents sind geladen, die Vorlage wurde aber noch nicht geöffnet) - Ausgangstabelle: z.B. "Spenden" (Current)
- Übergeordnete Tabelle: z.B. "Teilprojekte" (Parent mit Präfix
Teilprojekt): Enthält ein Dokumentfeld mit der Vorlage - Vorlage in der Konfiguration: Ein beliebiger Platzhalter (wird vom Skript überschrieben)
Vollständiges Skript
// Version 6
namespace Ruthardt.PrintPlus.Skripting
{
using System.IO;
using System.Linq;
using Cobra.Common;
using Cobra.Common.DocumentManagement.Interfaces;
using Ruthardt.CobraBase.Functions.Access.Ado;
using Ruthardt.Common.Util;
using Ruthardt.PrintPlus.Model.Interfaces;
public class VorlageAusDmsHolen : IScriptAction
{
public void Execute(IPrintContext printContext, ICurrentContext currentContext, IChildContext childContext)
{
// Übergeordneten Datensatz (Projekt/Teilprojekt) abrufen
var projekt = currentContext.ParentDataByPrefix["Teilprojekt"];
// DMS-Wert aus dem Dokumentfeld auslesen
var dmsId = projekt.GetStringValue("Verdankungsvorlage");
if (string.IsNullOrWhiteSpace(dmsId))
{
printContext.Logger.Error($"Keine Vorlage im Feld 'Verdankungsvorlage' hinterlegt für Projekt-Datensatz.");
currentContext.SkipDocument = true;
return;
}
// Datei-Pfad aus dem cobra DMS ermitteln
IDmsController dmsController = CobraMain.Container.ResolveType<IDmsController>();
var vorlagePfad = dmsController.GetDocumentFileName(dmsId);
if (!File.Exists(vorlagePfad))
{
printContext.Logger.Error($"Vorlage nicht gefunden: {vorlagePfad}");
currentContext.SkipDocument = true;
return;
}
// Vorlage lokal kopieren (schützt die Originaldatei im DMS)
var tempPfad = Path.GetTempFileName() + Path.GetExtension(vorlagePfad);
File.Copy(vorlagePfad, tempPfad, true);
// Vorlage in der Konfiguration überschreiben
printContext.Config.Current.Templates.First().File = tempPfad;
printContext.Logger.Debug($"Vorlage dynamisch gesetzt: {vorlagePfad} → {tempPfad}");
}
}
}
Erklärung Schritt für Schritt
- Parent-Daten lesen: Das Projekt (übergeordneter Datensatz) wird über seinen konfigurierten Präfix abgerufen.
- DMS-ID auslesen: Das Dokumentfeld enthält die DMS-Referenz der Vorlage.
- Dateipfad ermitteln: Über den cobra
IDmsControllerwird der physische Pfad der Datei aus dem DMS aufgelöst. - Lokal kopieren: Die Datei wird in den Temp-Ordner kopiert, damit die DMS-Originaldatei nicht verändert oder gesperrt wird.
- Vorlage überschreiben: Der Pfad der ersten Vorlage in der Konfiguration wird auf die lokale Kopie umgebogen.
Wichtige Hinweise
Event muss AfterLoadData sein: Zu diesem Zeitpunkt sind alle Daten (Parents) geladen, aber die Vorlage wurde noch nicht geöffnet. Im Event BeforeOpenTemplate wäre es zu spät, da der Pfad bereits ausgewertet wurde.
Lokale Kopie: Kopieren Sie die Vorlage immer lokal, um Netzwerkprobleme oder Dateisperren zu vermeiden.
Dateiendung beachten: Verwenden Sie Path.GetExtension() statt einer festen Endung, damit das Skript sowohl mit .dotx als auch mit .xlsx etc. funktioniert.
Variante: Vorlage basierend auf einem Feld im Current-Datensatz
// Vorlage je nach Belegart aus einem anderen Ordner laden
var belegart = currentContext.Data.GetStringValue("Belegart");
var vorlagePfad = $@"\\server\vorlagen\{belegart}.dotx";
if (!File.Exists(vorlagePfad))
{
printContext.Logger.Error($"Vorlage für Belegart '{belegart}' nicht gefunden.");
currentContext.SkipDocument = true;
return;
}
printContext.Config.Current.Templates.First().File = vorlagePfad;
Variante: Vorlage über TemplateFilePath am Context ändern
Alternativ kann auch der TemplateFilePath direkt am Context gesetzt werden – dies funktioniert im Event BeforeOpenTemplate:
// Event: BeforeOpenTemplate
currentContext.TemplateFilePath = @"C:\Vorlagen\MeineAlternativeVorlage.dotx";
Keine Kommentare vorhanden
Keine Kommentare vorhanden