Benutzerabhängige Drucker verwenden
Dieses Skript zeigt, wie pro cobra-Benutzer zur Laufzeit ein anderer Drucker zugewiesen werden kann, obwohl in der PRINT+PLUS Oberfläche nur ein fester Drucker konfiguriert werden kann.
Anwendungsfall
In einer Umgebung mit mehreren Arbeitsplätzen soll jeder Benutzer automatisch auf „seinen" lokalen oder Netzwerkdrucker drucken, ohne das Ausgabeformat manuell anpassen zu müssen.
Konfiguration in PRINT+PLUS
- Exporter-Typ: Dokument-Exporter (Word, Excel, Text). Funktioniert nicht mit dem Skript-Exporter!
- Event:
AfterLoadData - Druckmodus: In der Konfiguration muss ein Druckmodus eingestellt sein (z.B. "Ja" oder "Einmal fragen"), damit überhaupt gedruckt wird. Das Skript ändert nur den Drucker, nicht den Druckmodus.
Vollständiges Skript
// Version 6
namespace Ruthardt.PrintPlus.Skripting
{
using Ruthardt.PrintPlus.Model.Container;
using Ruthardt.PrintPlus.Model.Interfaces;
public class BenutzerDrucker : IScriptAction
{
public void Execute(IPrintContext printContext, ICurrentContext currentContext, IChildContext childContext)
{
// Drucker je nach angemeldetem cobra-Benutzer setzen
var drucker = printContext.CobraContext.UserShortname switch
{
"Mueller" => @"HP LaserJet 4050 (Etage 2)",
"Schmidt" => @"Canon iR-ADV C5535 (Empfang)",
"Weber" => @"\\printserver\Etikett-Drucker",
_ => null // Kein Überschreiben -> Standarddrucker aus Konfiguration verwenden
};
if (drucker != null)
{
printContext.Config.Printer1 = new PrinterContainer { Name = drucker };
}
}
}
}
Erklärung
- Benutzer ermitteln:
printContext.CobraContext.UserShortnameliefert das Kürzel des aktuell angemeldeten cobra-Benutzers. - Drucker zuweisen: Über
printContext.Config.Printer1wird der erste Drucker in der Konfiguration überschrieben. Die Änderung gilt nur für diesen Exportvorgang. Die JSON-Konfigurationsdatei wird hierbei nicht verändert. - Fallback: Wenn der Benutzer nicht in der Liste steht, bleibt der konfigurierte Standarddrucker erhalten.
Tipps
Druckernamen herausfinden
Um den exakten Druckernamen zu ermitteln, den PRINT+PLUS erwartet:
1. Wählen Sie den Drucker einmal über die PRINT+PLUS Oberfläche aus
2. Öffnen Sie die JSON-Datei des Ausgabeformats im Vorlagenpfad
3. Suchen Sie nach Printer1 - dort steht der Name exakt so, wie er im Skript verwendet werden muss
Alternativ per Skript alle installierten Drucker auflisten:
using System.Drawing.Printing;
var drucker = string.Join("\n", PrinterSettings.InstalledPrinters.Cast<string>());
MessageBox.Show(drucker, "Verfügbare Drucker");
Netzwerkdrucker
Bei Netzwerkdruckern mit \\ im Pfad muss in C# das @-Zeichen vorangestellt werden:
// Korrekt:
printContext.Config.Printer1 = new PrinterContainer { Name = @"\\printserver\HP4050" };
// Auch korrekt (Backslashes verdoppelt):
printContext.Config.Printer1 = new PrinterContainer { Name = "\\\\printserver\\HP4050" };
Skript gemeinsam nutzen
Da dieses Skript unabhängig von der Ausgangstabelle funktioniert, kann es im Wurzelverzeichnis des PRINT+PLUS Vorlagenpfads abgelegt werden (statt im Unterordner eines Ausgabeformats). So können mehrere Ausgabeformate dasselbe Skript referenzieren.
Variante: Drucker aus cobra-Feld lesen
Statt eine feste Liste im Skript zu pflegen, kann der Druckername auch aus einem cobra-Feld stammen (z.B. einem Benutzerattribut oder einem Feld in einer Konfigurationstabelle):
// Drucker aus einer Konfigurationstabelle laden
var benutzer = printContext.CobraContext.UserShortname;
var sql = AdoInstance.Current.ParseSQL(
"SELECT [#Drucker-Zuordnung.Drucker#] FROM [#Drucker-Zuordnung#] WHERE [#Drucker-Zuordnung.Benutzer#] = @user");
var table = AdoInstance.Current.GetTable(sql, new SqlParameter("@user", benutzer));
if (table.Rows.Count > 0)
{
var druckerName = table.Rows[0][0]?.ToString();
if (!string.IsNullOrWhiteSpace(druckerName))
{
printContext.Config.Printer1 = new PrinterContainer { Name = druckerName };
}
}
Variante: Auch Drucker 2 und 3 setzen (Mehrfachdruck)
// Dokument auf zwei Drucker ausgeben (z.B. Original + Kopie)
printContext.Config.Printer1 = new PrinterContainer { Name = @"HP LaserJet (Original)" };
printContext.Config.PrintCount1 = 1;
printContext.Config.Printer2 = new PrinterContainer { Name = @"HP LaserJet (Ablage)" };
printContext.Config.PrintCount2 = 1;
Keine Kommentare vorhanden
Keine Kommentare vorhanden