Automatischer Druck von Crystal Reports-Dokumenten

Automatischer Druck von Crystal Reports-Dokumenten aus einer Web-Anwendung

Problem: Auf einem Server läuft eine Web-Applikation, mit einem Service der automatisch eingehende Daten verarbeitet. Über einen Zentralrechner (Host) werden Textdateien in ein Verzeichnis geschoben, welches von einem Filewatcher überwacht wird.
Wenn neue Dateien ankommen, wird der Inhalt der Dateien weiterverarbeitet und Berichte erzeugt. Wenn eine eMail-Adresse angegeben ist, wird ein Bericht im pdf-Format erstellt und an den Adressaten via eMail versendet. Ist keine eMail-Adresse angegeben, soll der Bericht auf dem jeweiligen Abteilungsdrucker ausgedruckt werden.

Die Erzeugung eines pdf mit Hilfe von Crystal Reports und der Versand per eMail ist trivial und stellt kein wirkliches Problem dar. Wie drucke ich jedoch, automatisch ohne Druckdialog von Crystal erzeugte Berichte aus?

Der Quellcode dafür ist simpel (Report ohne Parameter):


string strPrintername = "Druckername";
crReportName = new crReportName ();
crReportName.PrintOptions.PrinterName = strPrintername;
crReportName.PrintToPrinter(1, false,0,0);

Die Parameter in der PrintToPrinter-Methode bedeuten:

PrintToPrinter (int nCopies , bool collated , int startPageN , int endPageN )
– nCopies
Gibt die Anzahl der zu druckenden Kopien an.
– Collated
Gibt an, ob die Seiten sortiert werden.
– startPageN
Gibt die erste Seite an, die gedruckt wird.
– endPageN
Gibt die letzte Seite an, die gedruckt wird.
Um alle Seiten zu drucken, werden die Parameter startPageN und endPageN auf Null festgelegt. Damit wird der aufgerufene Bericht an dem definierten Drucker ausgedruckt.

Aber: Das funktioniert nur in Windows-Anwendungen mit allen Druckern (lokal/Netzwerk). Bei Web-Anwendungen ist das etwas anders. Der Internet Information Server (IIS) kennt zwar seine lokal angeschlossenen Drucker, aber keine Netzwerkdrucker. Da der IIS nicht als bekannter User in der Domäne läuft, kann nicht direkt auf gemappte Netzwerkdrucker zugegriffen werden. Was nun?

Die Lösung dafür ist, zumindest wenn man Zugriff auf den Server hat, ganz einfach.
Die Netzwerkdrucker werden kurzerhand als lokale Drucker am Server eingerichtet. Das soll jetzt aber nicht heißen, dass die Drucker tatsächlich am Server angeschlossen werden, sondern es werden lokale Ports definiert.

Das funktioniert wie folgt:

  • In der Systemsteuerung auf „Drucker hinzufügen klicken“
  • Das Willkommen-Fenster des Assistenten mit weiter bestätigen

    Option Lokaler Drucker wählen, die Checkbox für Plug & Play Drucker darf nicht aktiviert sein.

  • Auf der nächsten Seite den Anschlusstyp bestimmen. Es hier wird der Standard TCP/IP Port benötigt.
  • Den nachfolgenden Dialog mit weiter bestätigen.
  • Dann die IP-Adresse des Druckers eingeben und mit weiter bestätigen.
  • Dann den Treiber auswählen
  • Im nächsten Schritt den Alias vergeben, der dann in der Applikation verwendet wird.
  • Die Freigabe nicht aktivieren, Testseite drucken und den Assistenten beenden.
  • Fertig!

Damit können nun auch Netzwerk-Drucker in Web-Anwendungen verwendet werden.