C# Druckauftrag abwarten

matte

Cadet 2nd Year
Registriert
Feb. 2014
Beiträge
27
Hallo,

wie vielleicht schon einige wissen arbeite ich an einem kleinen Programm mit dem ich mehrere Dateien ausdrucken kann:

Das Programm ist auch schon im Einsatz aber ich habe ein Problem. Wenn ich dem Drucker wirkliche viele Aufträge sende komm er mit der Reihenfolge durcheinander. Es ist aber ganz wichtig, dass diese eingehalten wird.

Gibt es eine Möglichkeit das ich in der Schleife abwarte mit er mit dem Ausdrucken fertig ist?


Code:
               Process proc = new Process();
                proc.StartInfo.CreateNoWindow = false;
                proc.StartInfo.Verb = "print";

                foreach (int element in MeinArray)
                {
                    proc.StartInfo.FileName = strDir + "\\Man"+ element + "\\akvor\\" + DruckDatei;
                    if (File.Exists(proc.StartInfo.FileName))
                    {
                        proc.Start();
                        //proc.WaitForExit(10000);
                    }
                    proc.CloseMainWindow();
                    proc.Close();
                }
 
Geht leider nicht da der Pocess ja geöffnet bleibt. Dann müsste ich ja jedes pdf händisch schließen - oder sehe ich jetzt den Wald vor lauter Bäumen nicht?
 
Es gibt Möglichkeiten um den Drucker-Status nachzufragen. Es gibt im Web auch ein paar Bibliotheken mit denen man PDF's von C# aus drucken kann und somit nach verfolgen kann was genau passiert. Ich würde zu ersterem tendieren, sollte weniger Arbeit machen, ist aber entsprechend auch nicht so stark.

Ich merke aber an, dass ich mich persönlich nicht als Ersatz von Google sehe, weshalb ich dir ans Herz lege selbst nach zuschauen. Ein "Einzelzeiler", der das Problem löst, wird es in diesem Fall nicht geben.
 
Das hier immer alle meinen man fragt bevor man bei Google nachgesehen hat....

Habe leider nichts gefunden - wahrscheinlich habe ich nach den falschen Sachen gesucht.

Vielleicht kann mir jemand anderes einen etwas genaueren Tipp oder Weg zeigen!!
!!
 
matte schrieb:
Geht leider nicht da der Pocess ja geöffnet bleibt. Dann müsste ich ja jedes pdf händisch schließen

Ich weiß nicht wie dein Programm das du da aufrufst arbeitet, Es kann sein das es sich öffnet, druckt, und sich dann von selbst wieder schließt oder es bleibt nach dem Drucken geöffnet.

Je nachdem mußt du dein Programm designen. Wenn man den Print-Befehl an den Adobe Reader schickt, dann schließt sich das Programm z.B. nach dem Drucken automatisch. Da würde es mit WaitForExit() gehen. Bleibt das aufgerufene Programm aber nach dem Drucken geöffnet, würde WaitForExit() natürlich ewig warten.

Da du .CloseMainWindow() und .Close() verwendest, nehme ich mal an, dass das Programm nach dem Drucken offen bleibt und du es mit diesen Befehlen beenden willst, richtig?
 
Je nachdem mußt du dein Programm designen. Wenn man den Print-Befehl an den Adobe Reader schickt, dann schließt sich das Programm z.B. nach dem Drucken automatisch. Da würde es mit WaitForExit() gehen.

Nein es bleibt offen... da es durchaus auch 100 Pdfs sein können...

Möchte es dann eben mit .CloseMainWindow() und .Close() schließen.

Leider bringt der Drucker immer etwas durcheinander wenn eine größere Anzahl von Druckaufträgen
in der Warteschlange sind. Und da bei dem Programm Zeit keine Rolle spielt wollte ich wirklich immer abwarten bis der Druckauftrag erledigt ist und dann das nächste drucken...
 
Warum startest du einen weiteren Prozess zum drucken, und was ist dieser Prozess genau? Ein von dir geschriebenes Programm? Was macht er?
 
Weil der Verweis fehlt, das muss man am Anfang mal falsch machen wenn man VS nutzt, ging mir auch so :). Im Solution-Explorer auf Verweise Rechtsklick, Verweis hinzufügen. Bei den Assemblys findest du dann System.Printing. Hinzufügen und schon kannst du auf den Namespace zugreifen.

#EDIT: Falsch ist im ersten Satz nicht ganz richtig, es müsst eher heißen. Über den Stein muss man halt mal stolpern, wenn man mit soviel Komfort anfängt :).
 
Zuletzt bearbeitet:
So bin jetzt wieder dran - @PapstRatze :daumen: DANKE!

@Green Mamba
Warum startest du einen weiteren Prozess zum drucken, und was ist dieser Prozess genau? Ein von dir geschriebenes Programm? Was macht er?

Ich starte einmal einen Prozess mit pdf - diesen lass ich dann offen bis ich alle Dokumente gedruckt habe.
Nein kein von mir geschriebenes Programm .... :watt:
Komme jetzt nicht so ganz mit!
Ergänzung ()

So... mein wissen reicht einfach nicht - schaffe es nicht die Printqueue auszulesen :(

Mein ganzes Programm scheitert an dieser SACHE!!
Ergänzung ()

So bin jetzt einen etwas anderen Weg gegangen:

Code:
      Process proc = new Process();
                proc.StartInfo.CreateNoWindow = false;
                proc.StartInfo.Verb = "print";

                String DrSpool = @"C:\Windows\System32\spool\Printers";
                int Datspool = 0;

                //Array durchgehen und Datei drucken
                foreach (int element in MeinArray)
                {
                    proc.StartInfo.FileName = strDir + "\\Man"+ element + "\\akvor\\" + DruckDatei;
                    if (File.Exists(proc.StartInfo.FileName))
                    {
                        proc.Start();
                         Datspool = Directory.GetFiles(DrSpool).Length;
                         Datspool = 10;
 
                    }
                    while (Datspool > 0)
                    {
                        Datspool = Directory.GetFiles(DrSpool).Length;
                    }

                }
                proc.CloseMainWindow();
                proc.Close();

Der Druckerspooler legt immer eine temporäre Datei unter C:\Windows\System32\spool\Printers an.
Diese Datei liegt dort so lange bis der Druckvorgang abgeschlossen ist.
"Überwache" jetzt einfach diesen Ordner :) - Endtest ist noch nicht ganz abgeschlossen
abgeschlossen
 
Zurück
Oben