Features im Print-Server
Konsole
Sie können den Print-Service auch als Konsole-Anwendung starten. Dazu kann einfach die Datei PrintService.exe gestartet werden.
Ein PrintService darf generell nur einmal gestartet sein. Also entweder als Dienst oder mit der Konsole. Bevor Sie die Konsole-Anwendung starten, stellen Sie sicher, dass der Dienst gestoppt oder deaktiviert ist.
Anmerkung: Es ist aber durchaus möglich VERSCHIEDENE PrintServices auf einem Rechner parallel zu betreiben. Jeder dieser Services darf aber nur einmal laufen.
Beim Start mit der Konsole werden detaillierte Informationen zum Status und zu den Print-Jobs ausgegeben. Das kann sehr hilfreich sein, um z.B. das Verhalten des PrintServices oder auch Fehler zu analysieren.
Die Ausgaben auf der Konsole haben denselben Inhalt wie die Protokoll-Datei. Wenn der Service als Konsole-Anwendung gestartet wird, werden die Informationen sowohl in der Konsole als auch, wenn konfiguriert, in der Protokoll-Datei ausgegeben.
Prüfungen beim Start
Der PrintService führt beim Start Überprüfungen durch.
Sind Drucker verfügbar?
Es wird geprüft, ob die angegebenen Drucker auch als Windows-Drucker verfügbar sind. Der Print-Server registriert ja alle Drucker im Repository. Diese werden dann von der Applikation (z.B. eNVenta) verwendet. Wenn ein Drucker nicht verfügbar ist, wird eine Warnung in das Ereignis-Protokoll geschrieben, Es wird eine Information in die Protokoll-Datei geschrieben und der Drucker wird mit dem Präfix
##ERROR##in das Repository geschrieben.So können Sie auch in der Anwendung sehen, wenn der Print-Service einen Drucker nicht ansprechen kann.
Wenn der Drucker aufgrund technischer Probleme nicht korrekt arbeitet, kann der PrintService keinen Fehler erzeugen. Das schlägt dann ggf. erst bei der Verarbeitung des Druckjobs auf.
Sind die Print-Adapter richtig konfiguriert?
Crystal Adapter: Beim Start wird geprüft, ob die Crystal-Komponente angesprochen werden kann. Wenn z.B. nicht die korrekte Runtime installiert ist, dann wird eine Fehlermeldung generiert. Diese landet in der Protokoll-Datei und als Warnung im Ereignis-Protokoll.
Word, Excel Adapter: Es wird geprüft, ob Word oder Excel verfügbar ist. Bei der Prüfung wird die Version in die Protokoll-Datei geschrieben. Im Fehlerfall wird in die Protokoll-Datei geschrieben und es wird eine Warnung in das Ereignis-Protokoll geschrieben. Wenn Sie kein Word oder Excel verwenden, dann können die entsprechenden Adapter auch aus der Config-Datei entfernt werden. Entsprechende Print-Jobs werden in diesem Fall ignoriert.
PDF-Adapter: Es wird geprüft, ob die in der Config definierte Programm-Datei existiert. Wenn nicht, wird die Protokoll-Datei geschrieben und eine Warnung in das Ereignis-Protokoll. Wenn Sie keine PDF-Dateien verarbeiten, dann können Sie diesen Adapter auch aus der Config-Datei entfernen. Entsprechende Print-Jobs werden in diesem Fall ignoriert.
Druck in einen Ordner
Wenn man mit dem Link Choose Folder den Drucker in einen [Folder] geändert hat, können Sie im Anschluss den Pfad manuell bearbeiten.
Tip
Bei der Angabe des Ordners können auch UNC-Pfade (z.B. \\Server\Freigabe\) verwendet werden. Es ist zwingend darauf zu achten, dass der Dienst mit einem Benutzer läuft, der entsprechende Schreib-Rechte für diese Freigabe hat.
Note
Netzlaufwerke sind hingegen NICHT zu empfehlen, weil diese – wenn der Print-Service als Dienst gestartet wird – evtl. nicht zur Verfügung stehen.
Durch die Verwendung von Platzhaltern kann der Pfad dynamisch aufgebaut werden.
Folgende Platzhalter können verwendet werden:
| Platzhalter | Beschreibung |
|---|---|
| {date} | Datum des Drucks mit dem Format yyyy-MM-dd z.B. 2012-05-30 |
| {time} | Zeit des Drucks im Format HHmmss z.B. 121037 (für 12:10:37) |
| {owner} | Benutzer, der den Druck durchgeführt hat. |
Der Dateiname wird folgendermaßen generiert:
- Crystal Report Adapter
- Dateiname:
<ReportName>_<PrintJob-ID>.PDF - Beispiel:
Invoice_61b7ad1bb4304b40a7758f02f888e614.PDF
- Dateiname:
Wenn nicht bereits im Ordner verwendet, werden dem Dateinamen noch die Platzhalter in der folgenden Reihenfolge vorangestellt: {date}_{time}_{owner}_<dateiname>
Beispiel-Konfiguration
Es soll pro Tag ein neuer Ordner angelegt werden und darunter pro Mitarbeiter ein weiterer eigener Ordner.
Konfigurierter Ordner (Folder):
\\Fileserver1\Ausdrucke\{date}\Server1\{owner}\
Es werden z.B. folgende Ordner generiert:
\\Fileserver1\Ausdrucke\2012-05-30\Server1\User1\\\Fileserver1\Ausdrucke\2012-05-30\Server1\User2\
Es werden die Dateien im folgenden Format angelegt:
{time}_<ReportName>_<PrintJob-ID>.PDF({date}und{owner}werden schon im Ordner verwendet und deshalb nicht in den Dateinamen gepackt)
Beispiele für Dateien
121037_Invoice_61b7ad1bb4304b40a7758f02f888e614.PDF182026_CallList_2a0af0b92b7f418483b5ab0801727453.PDF
Logs
Tagesrotation des Haupt-Logs
Das Haupt-Log wird täglich in eine neue Datei geschrieben. Der Dateiname enthält das aktuelle Datum als Suffix.
Beispiel: Aus dem konfigurierten PS_PrintService_Log.txt wird täglich PS_PrintService_Log_yyyyMMdd.txt.
Note
Exceptions im Service werden zusätzlich in der ursprünglich definierten Datei (PS_PrintService_Log.txt) abgelegt.
Timing-Werte im PrintService-Log bei DevExpress-Reports
Jeder Druckauftrag erzeugt eine Logzeile mit folgenden Zeitwerten:
Beispiel:
20260505 10:23:41 DEVEXPRESS Rechnung.repx, 42.350 bytes [Pages: 3] [Printer "HP LaserJet" (Type Default, \\srv\hp)] [DevEx Load: 312ms] [Spooled: 847ms] [DevExPrint:1203ms]
[Pages: X]
[DevEx Load: Xms]
Zeit vom Eingang des Druckauftrags bis das Dokument vollständig in den Speicher geladen ist.
Hohe Werte deuten auf ein großes oder komplexes Dokument hin.
[DevExPrint: Xms] (bei Druckauftrag an Drucker)
Gesamtdauer des Druckvorgangs — von der Übergabe an DevExpress bis zum Ende des Print()-Aufrufs. Enthält die Spooling-Zeit (siehe [Spooled]) sowie den Initialisierungsaufwand durch GDI+ (Druckereinstellungen holen, Treiber-Kommunikation).
[Spooled: Xms] (bei Druckauftrag an Drucker)
Zeit, die DevExpress benötigt hat, um alle Seiten an den Windows-Druckspooler zu übergeben.
Abgrenzung: Der Spooler hat danach den Auftrag — wann der Drucker den tatsächlichen Druck durchführt, ist hier nicht messbar.
Die Differenz [DevExPrint] − [Spooled] zeigt den GDI+-Initialisierungsaufwand (Drucker-Setup, Tray-Settings). Dieser kann bei Netzwerkdruckern je nach Druckertreiber und Netzwerklatenz nennenswert sein.
[DevExExport: Xms] (bei Druckertyp „Folder") Zeit zum Erzeugen und Speichern der PDF-Datei(en) im konfigurierten Ausgabeordner. Enthält den PDF-Export sowie den Schreibvorgang auf das Dateisystem.
Typische Diagnose-Szenarien: (Symptom -> Wahrscheinliche Ursache)
- [DevEx Load] hoch -> Großes/komplexes Dokument
- [DevExPrint] [Spooled] hoch -> Langsamer Druckertreiber oder Netzwerklatenz bei Tray-Settings-Abfrage
- [Spooled] hoch -> Netzwerkdrucker mit geringer Bandbreite oder viele/große Seiten
- [DevExExport] hoch -> Langsames Netzlaufwerk oder großer PDF-Export
Erweitertes Spooler Monitoring
Das erweiterte Spooler Monitoring ist ein optionales Feature, das standardmäßig deaktiviert ist. Es überwacht aktiv den Windows Print Spooler und protokolliert den Lebenszyklus jedes Druckauftrags – vom Einreichen bis zur Übergabe des Drucks an den Drucker oder eventuell auftretende Fehler.
Aktivierung und Konfiguration
Das Feature wird in der PrintService.exe.config über folgende Parameter gesteuert:
| Parameter | Standard | Beschreibung |
|---|---|---|
ExtendedSpoolerLogEnabled |
False |
Aktiviert das erweiterte Spooler-Monitoring insgesamt |
Neue Log-Dateien
Wenn das Feature aktiviert ist, erzeugt der PrintService zwei zusätzliche tagesrotierte Log-Dateien im selben Verzeichnis wie das Haupt-Log. Der Basisname wird aus dem konfigurierten Log-Dateinamen abgeleitet, wobei ein abschließendes _Log abgeschnitten wird.
Beispiel: Aus C:\FS\Logging\PS_PrintService_Log.txt werden:
PS_PrintService_SpoolerLog_yyyyMMdd.txt— detailliertes Spooler-Ereignis-LogPS_PrintService_FailedPrints_yyyyMMdd.txt— Zusammenfassung aller fehlgeschlagenen Drucke
SpoolerLog
Das SpoolerLog enthält eine Zeile pro Ereignis mit Zeitstempel und folgenden Event-Typen:
| Event | Beschreibung |
|---|---|
SUBMIT |
Druckauftrag wurde in den Windows-Spooler eingereicht |
EVENT |
Neues Fehler-Flag im Spooler erkannt (z.B. OFFLINE, PAPER_OUT) |
END |
Druckauftrag abgeschlossen (PRINTED, DELETED oder GONE) |
RECOVERY |
Beim Service-Start: Anzahl der noch offenen Jobs aus der vorherigen Session |
RESUME |
Beim Service-Start: Einzelner Job wird nach Neustart weiter verfolgt |
Beispielzeilen:
2026-05-08 10:23:41 SUBMIT JobID=abc123 Adapter=DEVEXPRESS Printer=\\srv\HP_LJ PrinterStatus=OK SpoolerJobName="Rechnung.repx"
2026-05-08 10:23:45 END JobID=abc123 Status=PRINTED Result=OK
2026-05-08 11:05:12 EVENT JobID=def456 Status=OFFLINE|ERROR NewFlag=OFFLINE
2026-05-08 11:05:14 END JobID=def456 Status=DELETED Result=DELETED (after errors — siehe FailedPrints)
FailedPrints
Die FailedPrints-Datei enthält ausschließlich Einträge für Druckaufträge, bei denen ein Problem erkannt wurde. Sie dient als kompakte Übersicht zur täglichen Prüfung.
| Eintrag | Beschreibung |
|---|---|
SPOOLER_ERROR |
Fehler-Flag im Spooler-Job erkannt |
DELETED_AFTER_ERROR |
Job wurde nach einem Fehler aus dem Spooler gelöscht |
GONE_AFTER_ERROR |
Job ist nach einem Fehler aus dem Spooler verschwunden |
UNKNOWN_AFTER_RESTART |
Job nach Neustart nicht mehr im Spooler und zu alt für eine zuverlässige Aussage |
Drucker-Status-Überwachung
Vor jedem Druckauftrag wird der aktuelle Windows-Drucker-Status abgefragt und im SpoolerLog beim SUBMIT-Event ausgegeben. Die Abfrage erfolgt über die Win32-API und wird gecacht. Bei Drucker-Änderungs-Events (z.B. Drucker geht offline) wird der Cache sofort invalidiert.
Mögliche Status-Werte: OK, OFFLINE, ERROR, PAPER_OUT, PAPER_JAM, PAUSED, NO_TONER, TONER_LOW, u.a.
Recovery nach Neustart
Beim Service-Start lädt der PrintService alle noch offenen Druckaufträge aus der Persistenz-Datei InFlightJobs.xml (im Temp-Verzeichnis des PrintService) und gleicht sie mit dem aktuellen Spooler-Zustand ab:
- Job noch im Spooler → Überwachung wird nahtlos fortgesetzt
- Job nicht mehr im Spooler, kürzlich abgeschlossen → als „likely OK" behandelt, kein FailedPrints-Eintrag
- Job nicht mehr im Spooler, zu alt → als
UNKNOWN_AFTER_RESTARTin FailedPrints eingetragen
Auswirkung auf Transaktionen
Wenn der SpoolerMonitor einen Fehler-Flag an einem Druckauftrag erkennt (z.B. OFFLINE, ERROR, PAPER_OUT), wird die zugehörige PrintService-Transaktion automatisch als fehlgeschlagen markiert. Dies geschieht beim ersten auftretenden Fehler-Flag; spätere Flags werden weiter geloggt, ändern den Transaktionsstatus aber nicht erneut.