Druckerprozess prüfen / Warten bis Druck beendet

  • VB.NET
  • .NET 4.0

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von razzzer530i.

    Druckerprozess prüfen / Warten bis Druck beendet

    Moin liebes Forum,

    bin da auf etwas gestoßen, wo ich nicht so recht weiter komme:

    Ich habe täglich ca 2000 Seiten die ich erzeuge und drucken muss. Das klappt soweit auch alles automatisch ohne Probleme.
    Wenn der Drucker allerdings einen Papierstau oder einen Fehler hat, schmeißt Windows die Druckaufträge kreuz und quer rein und am Ende kommt nur Mist dabei raus.

    Gibt es die Möglichkeit, einen Auftrag an einen Drucker zu senden und zu warten, bis dieser den Ausdruck quasi bestätigt hat?

    Dokumente erzeugen > In Liste einfügen > Liste abarbeiten > Dokument an Drucker senden > Warten bis Drucker sagt : Wurde gedruckt > dann nächstes Dokument drucken?

    Vielen Dank im Voraus & beste Grüße
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    Auf CodeProject gibt's was zu diesem Thema: Monitor jobs in a printer queue (.NET)
    Da werden dann schliesslich Events gefeuert, die Dir den Status des PrintJobs anzeigen, auch z.B. Papierstau oder vollständige Abarbeitung des Auftrags.

    An sich schonmal genau das was ich suche. Nur leider in c. Auch wenn ich es konvertiere verstehe ich den Sinn dahinter nicht so wirklich. Aber danke schonmal

    Das Projekt ist recht unverständlich für mich aber macht genau das was ich brauche. (Erkennt den wichtigsten Drucker nur leider nicht).

    Jetzt habe ich noch das Problem, dass ich nur prüfen möchte, ob das Dokument was ich JETZT rein schicke gedruckt ist. Wenn ja dann mach weiter sonst warte.

    Etwas kompliziert fürmich da ich den kram so nicht verstehe :D
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „razzzer530i“ ()

    Wenn der Druck über einen Printserver geht, wird das vermutlich nicht helfen.
    In der lokalen Warteschlange ist das Dokument weg, sobald es der Server bestätigt hat.
    Bis das Papier tatsächlich im Druckerschacht liegt, kann da noch einiges an Zeit vergehen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @us4711 Danke aber das habe ich im Post schon erwähnt. Den Code zu kopieren und umzuwandeln bringt nir nix.

    @petaod Genau das ist das Problem. Alle Drucker sind am Server registriert und werden über das Netzwerk angesprochen. Der Drucker der knapp 8.000 Seiten am Tag drucken muss steht in einem anderen Raum weil er für das Büro viel zu laut ist. Papierstau oder sonstige Fehler können jederzeit auftreten. Wenn ich die aber nicht mitbekomme werden die Aufträge weiter in die Warteschleife geprügelt und bleiben nicht in der richtigen Reihenfolge.

    Was ich schaffen möchte ist: Auftrag senden, Drucker selbst fragen ob Auftrag gedruckt wurde. Wenn gedruckt wurde dann nächster Auftrag ansonsten warte bis gedruckt wurde.

    kurz:

    VB.NET-Quellcode

    1. For Each Auftrag as Fileinfo in new Directoryinfo("pfad").Getfiles("*.pdf", SearchOption.TopDirectoryOnly)
    2. druckprozess()
    3. "Frage hier Drucker ob gedruckt wurde"
    4. druckprozess.waitfor("ist gedruckt")
    5. next


    Mal ganz dumm geschrieben.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    OK, verstanden.
    Aber über irgendeinen Druckprozessor muss der Drucker ja angesteuert werden.
    • Über einen Druckserver
    • Über den eigenen PC
    • etc.
    Diese Maschinen verarbeiten den Druckauftrag und senden ihn an den Drucker. Dazu ist eine Software erforderlich. Diese Software kann überwacht werden, was ohne grösseren Aufwand nur auf dem jeweiligen Server möglich ist.
    Und wenn es Windows ab NT 3.5 ist, kann das mit einem Tool wie oben beschrieben erfolgen.
    (Ich geh' mal davon aus, das wir über die Windows-Welt reden? Bei anderen BS bin ich 'raus)
    Wenn der Server eine entfernte Maschine ist, muss für ein Signalisierungssystem gesorgt sein, damit Du als Überwacher des Druckes von Problemen informiert wirts, und den nächsten Druck auslösen kannst. das kann z.B. eine Benachrichtigung über TCPIP sein.
    Das alles kannst Du dann natürlich in einer Funktion druckprozess.waitfor kapseln.
    Aslo es handelt sich um Windows, mein PC ist Teil eines Netzwerkes. Die Drucker sind auf dem Server installiert und am Rechner einfach nur regestiret. BZW. ist der Druckertreiber auch installiert.
    Ich habe das C Beispiel was du gepostet hast einfach mal blind ausprobiert und er gibt mir die Rückmeldung: Gesendet, Empfangen,Drucke gerade.
    Soweit ja ganz gut, aber trotzdem verstehe ich halt nicht, wie ich mir das so hinbiege, dass ich wirklich das habe, was ich haben will und nicht mehr. Dazu kommt ja, dass ich verstehen möchte wie genau das passiert. Da bringt mir ja ein fertiges Programm nichts.

    Wie mache ich das ganze?

    Die Idee habe ich ja, also was passieren soll.
    Nur wie ich es umsetze ist einfach zu viel des guten. Habe mich noch nie mit Druckern beschäftigt und auch nicht mit dem Druckerprotokoll.
    Anstoß wäre da echt klasse.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    Ja, das unveränderte Beispiel gibt in der Tat nur diese Meldungen aus, da in der Datei PrintQueueMonitor.vb ein entsprechender Filter angewendet wird.
    Ich füge mal ein VB-Projekt bei, in dem dieser Monitor von C# nach VB übersetzt ist, und der Nachrichtenfilter in Zeile #168 übergangen wird. Nun werden alle Nachrichten angezeigt, u.a. auch die über Druckerprobleme und vollständiger Beendigung des Druckjobs.
    Schau's Dir an, die Meldungen sind ziemlich selbsterklärend.
    Dateien
    Wirklich selbsterklärend. Paar Sachen verstehe ich noch nicht so ganz aber ist schonmal ein Anfang hab den Filter auch überhaupt nicht wahr genommen vorher.
    Denke damit lässt sich arbeiten, wenn ich das ganze an mein Programm anpasse. Vielen Dank schonmal!
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~