Direkt zum Hauptinhalt

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

  1. Parent-Daten lesen: Das Projekt (übergeordneter Datensatz) wird über seinen konfigurierten Präfix abgerufen.
  2. DMS-ID auslesen: Das Dokumentfeld enthält die DMS-Referenz der Vorlage.
  3. Dateipfad ermitteln: Über den cobra IDmsController wird der physische Pfad der Datei aus dem DMS aufgelöst.
  4. Lokal kopieren: Die Datei wird in den Temp-Ordner kopiert, damit die DMS-Originaldatei nicht verändert oder gesperrt wird.
  5. 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";